1: 2021-03-17 (水) 22:45:52 nao-pon  With "attach" plugin. (Created empty) |
現: 2021-03-17 (水) 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 |