1: 2021-03-17 (Wed) 22:45:52 nao-pon With "attach" plugin. (Created empty) |
Cur: 2021-03-17 (Wed) 22:48:29 nao-pon |
| + | #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 |