コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home AssistantでDIY Smart Home】雨量計をちょっと改善

【Home Assistant(Hass.io)】
雨量計をちょっと改善

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。

 以前設置した雨量計は、一時期はzigbee2mqttとの接続が断たれたりして「これは寒くなってきたからか?電池か?それとも雨降ると切れるから湿度か?」などと色々原因を探ってみましたが、zigbee2mqttのアドオン化に合わせてzigbee routerを増設したら、その後は快調に計測を続けています*1
 が、小さな問題が一つ。Home Assistantを再起動するたびに、何故か雨量計が1転倒分カウントしてしまうのです。晴天なのに…。なんとかせねば。

 雨量計設置の記事はこちら。

maky-ba.hatenablog.com

この記事の前提条件
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を疑ったりしましたが、下記のサイトを最後までざっと見るに:

  1. zigbee2mqttは再起動時に一時的に誤った値(Close = 0)を送信する様子
  2. history statsはそれを律儀にカウントする

という状況のよう。
community.home-assistant.io (このスレッドは大変役に立ちます。いろいろな方がドア窓センサーを使って雨量計を作って楽しんでいる様子がうかがえます)

 解決策も上記サイトの中にありました。
☔ DIY Zigbee rain gauge - #129 by AndrejDelany - Share your Projects! - Home Assistant Community

  1. 窓ドアセンサーの属性(attribute)contactを使ったsensorを作る
    なぜかこちらはHA再起動の影響を受けないようです。
  2. あとは同じ。(でも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_statssensors:パートに記載します(下記の# 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

こんな感じです。
f:id:maky_Ba:20220105184102j:plain:w200
(テスト中の画面なので、24時間雨量と週間雨量以降が整合していないのはご愛敬)

3. おわりに

 さて、この雨量計がどのぐらい壊れずに持つか、という点が次の課題ですかね。一応予備を一台持ってはいますが。それと汚れてきて1回の水の量が変わったりするかな(現状結構汚くなってきています)。

maky-ba.hatenablog.com

*1:でもまあzigbeeバイスの数が多くなったので、そろそろ推奨のアダプタに置き換えたいな。aliexpressに発注はしたので、到着が待ち遠しいです。