Skip to main content
Python · IoT · CrateDB · Docker · Apache Superset

專案概述

以 TP-Link Tapo H200 網關搭配 T315 溫濕度感測器為資料來源,Python 採集器啟動後自動發現網關下的所有 T315 感測器,每隔約 60 秒輪詢一次並將讀值寫入 CrateDB 時序資料庫。Apache Superset 負責儀表板呈現,整套服務以 Docker Compose 封裝,可部署至 Synology NAS 或一般 Docker 主機。 H200 網關的 API 在感測器斷線後仍會持續回傳最後一筆快取讀值,不提供子裝置的 online/offline 狀態。系統透過四訊號交叉比對機制偵測這類過時資料,驗證失敗時將溫度與濕度欄位寫入 NULL 並記錄至 stale.log

核心功能

  • 啟動後自動發現 H200 網關下的所有 T315 感測器,無需手動設定裝置清單
  • 每 60 秒採集溫度、濕度、電池電量與 RSSI,寫入 CrateDB
  • 四訊號交叉驗證(RSSI 門檻、RSSI 凍結、溫濕度同時凍結、device_time 凍結),至少 N 項失敗才判為 stale(預設 N=2),避免單一指標誤判
  • Stale 資料的溫濕度欄位寫 NULL,保留 is_validstale_reasons,事件同步寫入 stale.log
  • Apache Superset 儀表板,預建每分鐘、每小時、每日、每週、每月統計視圖
  • 支援 Cloudflare Tunnel,遠端存取不需開放入站埠號
  • 服務異常自動重連與重試,restart: unless-stopped

專案架構

climate-monitor
src/climate_monitor
core
collector.py · 主採集迴圈
tapo_client.py · 與 H200 通訊
validator.py · 四訊號驗證器
infra/database.py · CrateDB 客戶端
config.py · 環境變數載入
main.py
docker
docker-compose.pc.yml · 本地開發
docker-compose.prod.yml · NAS 生產
scripts/init_db.sql · CrateDB Schema 初始化

快速開始

1

準備環境變數

填入 Tapo 帳號、H200 的區網 IP 等必要參數。
2

啟動所有服務(NAS / 生產)

3

初始化 Superset(僅首次)

4

初始化 CrateDB Schema

開啟瀏覽器至 http://NAS-IP:4200,在 SQL console 執行 scripts/init_db.sql
5

確認採集正常

看到感測器名稱與讀值輸出即表示採集已啟動。

連線驗證邏輯

H200 API 不揭露子裝置連線狀態,感測器斷線後仍回傳快取值。系統以四項訊號交叉比對判斷: 至少 VALIDATOR_MIN_FAILED_CHECKS(預設 2)項同時失敗才判為 stale。凍結判定次數根據 frozen_window / collection_interval 自動計算。

注意事項

.env 含 Tapo 帳號密碼,不要提交版本控制。本機開發(docker-compose.pc.yml)與生產(docker-compose.prod.yml)使用不同 Compose 檔案,兩者的 bind mount 路徑不同,切換環境前確認正確。CrateDB Schema 需在首次部署後手動執行 init_db.sql 初始化,服務不會自動建表。

實際應用面

適合需要長期、低成本監控多點溫濕度的場景,例如實驗室環境記錄、伺服器機房基礎監控、家庭環境管理。stale 驗證機制讓資料庫裡的 NULL 具有明確語義(感測器離線),而非默默存入錯誤數值,方便後續統計分析時正確排除無效時段。

相關連結