1: 2021-03-17 (水) 22:45:52 nao-pon[4] [5] With "attach" plugin. (Created empty) |
現: 2021-03-17 (水) 22:48:29 nao-pon[4] [6] | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | #navi | ||
+ | RIGHT:&rsslink(../); | ||
+ | #boxdate | ||
+ | * SwitchBot 温湿度計を ESP32 でモニタリング [#hefa2313] | ||
+ | RIGHT:&tag(SwitchBot,Meter,温湿度計,HomeAssistant,ESP32,ESPHome,BLE); | ||
+ | |||
+ | [[SwitchBot の温湿度計:https://www.switchbot.jp/meter]]は、リーズナブルで家庭で使うには問題のない精度があるので、なかなか便利です。 | ||
+ | |||
+ | この温湿度計は、公式の [[API (Meter BLE open API):https://github.com/OpenWonderLabs/python-host/wiki/Meter-BLE-open-API]] が公開されていて、BLE Advertisement パケットをリッスンすることで、温湿度データを取得できます。 | ||
+ | |||
+ | これを、ESP32 を使い HomeAssistant で利用できるようにしました。ESP32 のファームには ESPHome を使用しています。 | ||
+ | |||
+ | &ref(210317-224349.png,mw:480,mh:360);&ref(210317-224648.png,mw:480,mh:360); | ||
+ | |||
+ | ** ESPHome 用 yaml の該当部分の抜粋 [#xdf548e2] | ||
+ | #code(yaml){{ | ||
+ | substitutions: | ||
+ | devicename: switchbot_meter | ||
+ | |||
+ | sensor: | ||
+ | - platform: template | ||
+ | name: "$devicename Humidity" | ||
+ | id: humidity0 | ||
+ | unit_of_measurement: '%' | ||
+ | accuracy_decimals: 0 | ||
+ | icon: "mdi:water-percent" | ||
+ | - platform: template | ||
+ | name: "$devicename Temperature" | ||
+ | id: temperature0 | ||
+ | unit_of_measurement: '°C' | ||
+ | accuracy_decimals: 1 | ||
+ | icon: "mdi:thermometer" | ||
+ | - platform: template | ||
+ | name: "$devicename BT RSSI" | ||
+ | id: rssi0 | ||
+ | unit_of_measurement: 'dB' | ||
+ | accuracy_decimals: 0 | ||
+ | icon: "mdi:bluetooth" | ||
+ | - platform: template | ||
+ | name: "$devicename Battery" | ||
+ | id: battery0 | ||
+ | unit_of_measurement: '%' | ||
+ | accuracy_decimals: 0 | ||
+ | icon: "mdi:battery" | ||
+ | |||
+ | esp32_ble_tracker: | ||
+ | scan_parameters: | ||
+ | duration: 60s | ||
+ | on_ble_advertise: | ||
+ | - mac_address: f4:42:fa:b4:72:2a | ||
+ | then: | ||
+ | - lambda: |- | ||
+ | for (auto data : x.get_service_datas()) { | ||
+ | if(data.data.size() == 6) { | ||
+ | float temperature = (float)(data.data[4] & 0b01111111) + ((float)(data.data[3] & 0b00001111) / 10); | ||
+ | if (!(data.data[4] & 0b10000000)) { | ||
+ | temperature = -temperature; | ||
+ | } | ||
+ | int8_t humidity= data.data[5] & 0b01111111; | ||
+ | int8_t battery = data.data[2] & 0b01111111; | ||
+ | int8_t rssi=x.get_rssi(); | ||
+ | id(humidity0).publish_state(humidity); | ||
+ | id(temperature0).publish_state(temperature); | ||
+ | id(rssi0).publish_state(rssi); | ||
+ | id(battery0).publish_state(battery); | ||
+ | } | ||
+ | } | ||
+ | }} | ||
+ | |||
+ | シンプルですね。カスタムコンポーネントを作るまでもないので、lambda を使いました。 | ||
+ | |||
+ | RIGHT:&font(90%){&page_comments;}; | ||
+ | #navi |
(This host) = https://xoops.hypweb.net