【Home Assistant(Hass.io)】
雨量計をちょっと改善
「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。
以前設置した雨量計は、一時期はzigbee2mqttとの接続が断たれたりして「これは寒くなってきたからか?電池か?それとも雨降ると切れるから湿度か?」などと色々原因を探ってみましたが、zigbee2mqttのアドオン化に合わせてzigbee routerを増設したら、その後は快調に計測を続けています*1。
が、小さな問題が一つ。Home Assistantを再起動するたびに、何故か雨量計が1転倒分カウントしてしまうのです。晴天なのに…。なんとかせねば。
雨量計設置の記事はこちら。
この記事の前提条件 | |
---|---|
Home Assistant core | 2021.12.8 |
Home Assistant OS | 7.1 |
Server | Raspberry Pi 4(2GB) |
上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)
1. HA再起動による誤検知抑制
Home Assistantを再起動するたびに何故かhistory_stats
で作ったraingauge_tips
センサーが1回カウントを進めてしまう様子。zigbee2mqttを疑ったり、history statsを疑ったりしましたが、下記のサイトを最後までざっと見るに:
- zigbee2mqttは再起動時に一時的に誤った値(Close = 0)を送信する様子
- history statsはそれを律儀にカウントする
という状況のよう。
community.home-assistant.io
(このスレッドは大変役に立ちます。いろいろな方がドア窓センサーを使って雨量計を作って楽しんでいる様子がうかがえます)
解決策も上記サイトの中にありました。
☔ DIY Zigbee rain gauge - #129 by AndrejDelany - Share your Projects! - Home Assistant Community
- 窓ドアセンサーの属性(attribute)
contact
を使ったsensorを作る
なぜかこちらはHA再起動の影響を受けないようです。 - あとは同じ。(でもtemplateの仕様が変わった(※)ので要変更)
※: sensorとbinary sensorでのtemplateプラットフォームの利用は、"Legacy Sensor configuration format"、 "Legacy binary sensor configuration format"と言われる始末。新しいTemplateインテグレーションでの記述方法は下記に。
www.home-assistant.io
記述の順番は前後しますが、まずはtemplate:
パートを(下記の# Raingauge (1)のところ)。HAの再起動で惑わされないセンサーrainguage_contact
をTemplateインテグレーションのsensor:
パートに記述します。
次に一定期間の合計回数を測るhistory_stats
をsensors:
パートに記載します(下記の# Raingauge (2)のところ)。対象となるセンサーを前回はbinary_sensor.xiaomi_door_window_XX_contact
とbinary sensorにしていましたが、今回はsensor.raingauge_contact
とsensorにしたので、stateはTrue
で(で良いと思う。未だに完全には理解していない…)。
最後に、24時間雨量を計算する式をtemplate:
パートに記載します(下記の# Raingauge (3)のところ)。前回設定との差分は、history_stats
が再起動時とかで寝ぼけている時にunknown
とかかましても大丈夫なようにavailability:
を記述したあたりでしょうか。
(前略) sensors: (中略) # Raingauge (2) # # Rain Gauge - Daily - platform: history_stats name: Raingauge tips entity_id: sensor.raingauge_contact state: True type: count start: '{{ now().replace(hour=0, minute=0, second=0) }}' end: '{{ now() }}' # Rain Gauge - 24h - platform: history_stats name: Raingauge tips 24h entity_id: sensor.raingauge_contact state: True type: count end: '{{ now() }}' duration: hours: 24 (中略) template: sensor: (中略) # Rainguage (1) # # Raingauge contact (restart-safe) # - name: "Raingauge Contact" state: >- {{ state_attr('binary_sensor.xiaomi_door_window_XX_contact', 'contact') }} # Rainguage (3) # # Rainfall (24h) - name: "Rainfall 24h" unit_of_measurement: mm icon: 'mdi:weather-pouring' state: >- {% set count = states('sensor.raingauge_tips_24h') | int(0) %} {% set mm_per_pulse = 0.30303 %} {% set mm = count * mm_per_pulse %} {{ mm|round(1, 'floor') }} availability: "{{ states('sensor.raingauge_tips_24h') not in ['unknown', 'unavailable', 'none'] }}" (後略)
これでHome Assistantを再起動しても、誤って雨量がカウントされたりはしないようになりました。めでたしめでたし。
2. Utility meterで降雨量を記録
1時間雨量とか1日の雨量とかを記録するのに「Utility Meter」が使える、というのを上のサイトで見ましたのでついでに設定してみます。Utility Meterの詳細については下記を参照。
www.home-assistant.io
とりあえず年間降雨量まで記録するようにしてみました。正確に年間降雨量が計れているのか判るのは、ずっと先ですが…。
(前略) #**************************************************************** # Utility Meter #**************************************************************** utility_meter: rain_hour source: sensor.rainfall_24h cycle: hourly rain_day: source: sensor.rainfall_24h cycle: daily rain_week: source: sensor.rainfall_24h cycle: weekly rain_month: source: sensor.rainfall_24h cycle: monthly rain_year: source: sensor.rainfall_24h cycle: yearly
こんな感じです。
(テスト中の画面なので、24時間雨量と週間雨量以降が整合していないのはご愛敬)
3. おわりに
さて、この雨量計がどのぐらい壊れずに持つか、という点が次の課題ですかね。一応予備を一台持ってはいますが。それと汚れてきて1回の水の量が変わったりするかな(現状結構汚くなってきています)。