Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

新居のスマート化: 芝生の水やりを自動化する(2)

Sympapaです。


昨年11月に入居した新居の庭には20㎡ほどの芝生が植えてあります。
品種はトヨタが開発した省管理型の高麗芝"TM9"で伸びる速度が遅く芝刈り回数が少なくて済むというものなんですが、穂が出て種を落としそれが発芽すると「先祖返り」して普通の高麗芝になってしまうらしく、最近はたくさん出て来る「穂」を取る作業が面倒くさくなってきました。(笑)
って話は余談ですが、芝生というのは夏には毎日8~10リットル/㎡前後の水やりをしなくてはいけないらしく、水やりを自動化したいと考えています。
そんなワケで水やりを自動化しようと、スマート水バルブを買って設置し試しに使ってみたってのが前回のお話でした。
最終的なゴールは降雨状況に合わせて必要なタイミングで自動で水やりしてくれるようにすることなのですが、その準備を進めてみたものの色々と様子見しなくてはいけないことも多く、ゴールに辿り着けるのはまだ先になりそうです。
そこでまずは、手動で水やりの頻度や水量を設定し、その設定に合わせて自動で水やりしてくれるってのを第1ステップのゴールとすることにしました。
今回は最終ゴールへの準備を進めつつ、第1ステップまでを完了させたいと思います。

スプリンクラーを設置する

スプリンクラーは7000円くらいとお高めですがガルデナのAqua Zoom Sを採用しました。

もっと安価なものをと探したのですが、他に散水の「幅」が調整できるものを見つけることが出来ませんでした。
こういうのとか。。。「幅」は水量での調整になり奥行き方向の飛距離も一緒に変わってしまうので、散水範囲の調整がかなり難しそう。。。

Aqua Zoom Sは散水の「奥行き」だけではなくて、「幅」も調整できるのです。
しかもドイツ感満載のデザインがオシャレ。
そんなワケで、Aqua Zoom一択でした。
実際「奥行き」方向を先に調整してから最後に「幅」の調整をしたらよいので、調整がとても簡単でした。
www.gardena.com


まぁでも、強い風が吹くと散水が風に流されるしお隣さんとの境界はギリギリを狙えないし、どうしてもスプリンクラーだけでは水やりが出来ない部分は出てしまいます。スプリンクラーがあっても一部は自分で水やりすないといけませんねぇ。

■自動化の構想

まず、何の情報を元に水やりが必要かを判断するかを考えなくてはいけません。思いついたのは下記の4つです。
1) 土壌水分計を導入して土が乾いていれば水やりをする
2) 雨量計を導入して過去x時間で一定以下の降雨量だった場合は水やりをする
3) 天気予報の降水量予報を元に向こうy時間の予想降雨量が一定以下の場合は水やりをする
4) 1)~3)の組み合わせ


いくら過去に雨が降っておらず土が乾いていたとしてもこれからそれなりに雨が降るなら水やりをする必要はないので、いずれにしても降雨量予報は必要そうです。
考えた結果「土が乾いており、かつ「今日の予想降雨量が一定以下」の場合に水やりをすることにしました。
水やりの量はどうしようかなぁ。。。

■Home Assistantで降水量予報を取得できるようにする

まずHome Assistantで降水量予報を取得できるようにします。
Home Assistantには標準で、天気予報の"Meteorologisk institutt (Met.no)"インテグレーションが組み込まれています。
www.home-assistant.io

海外のサービスから予報を取得しているので、日本における信頼性はどうなんかな?
今まで使ってきた感じ「晴れ」とか「雨」とかのいわゆる「天気予報」としては問題なさそうですが、降水量は標準では表示されないのでまだどんな感じなのかがわかっていません。
降水量予報は"weather.get_forecast"サービスによって取得することが出来ます。


「開発者ツール」の「サービス」を使い、"天気: 予報を取得(weather.get_forecast)"を選択して、天気予報のエンティティを選択し"日毎"を選択して"サービスの呼び出し"ボタンを押します。

すると、下記のような日毎の天気予報情報が今日を含めて6日分表示されます。この中の"precipitation:が降水量です。
"1時間毎"を選んだ場合は、1時間毎の向こう24時間の同様の情報が表示されます。

forecast:
  - condition: sunny
    datetime: "2024-05-25T03:00:00+00:00"
    wind_bearing: 341.7
    temperature: 19.9
    templow: 11.4
    wind_speed: 5.89
    precipitation: 0
    humidity: 54


この降水量予報をエンティティとして使えるようにtemplateセンサーを作りました。
configuration.yamlに下記の設定を書いてやります。

template:
  - trigger:
    - platform: time_pattern
      minutes: /1
    - platform: homeassistant
      event: start
    action:
    - service: weather.get_forecasts
      data:
        type: daily
      target:
        entity_id: weather.home
      response_variable: hourly
    sensor:
    - name: Rain Today
      unique_id: rain_today
      state: "{{ hourly['weather.home'].forecast[0].precipitation | int }}"
    - name: Rain Tomorrow
      unique_id: rain_tomorrow
      state: "{{ hourly['weather.home'].forecast[1].precipitation | int }}"
    - name: Rain Day_after tomorrow
      unique_id: rain_day_after_tomorrow
      state: "{{ hourly['weather.home'].forecast[2].precipitation | int }}"


ちなみに、1時間ごとの情報を取得したい場合はこんな感じでOKです。

    sensor:
    - name: Rain This hour
      unique_id: rain_this_hour
      state: "{{ hourly['weather.home'].forecast[0].precipitation | int }}"
    - name: Rain 1 hour later
      unique_id: rain_1_hour_later
      state: "{{ hourly['weather.home'].forecast[1].precipitation | int }}"
    - name: Rain 2 hour later
      unique_id: rain_2_hour_later
      state: "{{ hourly['weather.home'].forecast[2].precipitation | int }}"

さて、どんな感じになっているのか実際の降雨状況と合っているのか見てみると。。。このところ雨が少なすぎて良くわかりません(笑)

ポチった土壌水分センサーもまだ届いていないしここはしばらく様子見することにして、第1ステップとして、手動で設定をしそれに基づいて自動で水やりしてくれるようにしていくことにしました。


■オートメーション作成の下準備

第1ステップにて手動で設定する項目は「水やり頻度」と「水量」にします。その設定に合わせて、自動で水やりしてくれたらいいかなと。
そんなワケでオートメーションを組む前に下準備をしていきます。
スマート水バルブのエンティティは下図のとおりですが、使用するのは下記の4つかな。
switch.water_irrigation_valve_1_state →水やりをオンオフするスイッチです
number.water_irrigation_valve_1_irrigation_target →1回の水やりの水量又は時間を設定します
sensor.water_irrigation_valve_1_irrigation_target →設定した水量又は時間を取得できます
sensor.water_irrigation_valve_1_water_consumed →実際に流れた水量です


1)水量の設定の下準備
水量設定は選択式にしたいので、まず、ヘルパーで選択入力エンティティ"input_select.water_irrigation_valve_1_irrigation_water_amount"を作成します。選択肢は40,60,80,100,120,140,160としました。
次に選択した水量をスマート水バルブの方の水量設定"number.water_irrigation_valve_1_irrigation_target"へ入力するオートメーションを作成します。
選択入力エンティティに変化があると、"number.water_irrigation_valve_1_irrigation_target"へ数値を入力してくれます。

alias: water_irrigation_amount_set_if_selected
description: ""
trigger:
  - platform: state
    entity_id:
      - input_select.water_irrigation_valve_1_irrigation_water_amount
condition: []
action:
  - service: number.set_value
    data:
      value: >-
        {{states('input_select.water_irrigation_valve_1_irrigation_water_amount')|
        float }}
    target:
      entity_id: number.water_irrigation_valve_1_irrigation_target
mode: single


2)水やり頻度の設定の下準備
水やり頻度も選択式にしたいので、ヘルパーで選択入力エンティティ"input_select.water_irrigation_valve_1_auto_irrigation_interval”を作成します。選択肢は"毎日朝夕"、"毎日朝"、"2日毎に朝"、"3日毎に朝"、"週1回朝"、"OFF"にします。
また、頻度が可変なので最後に水やりした日を記録する必要があるため、ヘルパーで数値入力エンティティ”input_datetime.water_irrigation_valve_1_last_finished_date”を作成します。

■オートメーションの作成

手動で設定した水やりの頻度に合わせて、自動でスマート水バルブをオンにするオートメーションを組みます。
朝6:00と夕方19:00の2回オートメーションを発動させ、水やり頻度の設定と条件が合う場合はスマート水バルブをONにします。
2日毎,3日毎,7日毎の処理をどうしようか悩みましたが、最後に水やりをしてから2日後,3日後,7日後の場合に水やりをするような処理にしています。

alias: automatic water irrigation
description: ""
trigger:
  - platform: time
    at: "06:00:00"
    id: morning
  - platform: time
    at: "19:00:00"
    id: evening
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.water_irrigation_valve_1_auto_irrigation_frequency
            state: 毎日朝夕
        sequence:
          - type: turn_on
            device_id: スマート水バルブのid
            entity_id: switch.water_irrigation_valve_1_stateのid
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_select.water_irrigation_valve_1_auto_irrigation_frequency
            state: 毎日朝
          - condition: trigger
            id:
              - morning
        sequence:
          - type: turn_on
            device_id: スマート水バルブのid
            entity_id: switch.water_irrigation_valve_1_stateのid
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_select.water_irrigation_valve_1_auto_irrigation_frequency
            state: 2日毎に朝
          - condition: trigger
            id:
              - morning
          - condition: template
            value_template: >-
              {{
              (((states.input_datetime.water_irrigation_valve_1_last_finished_date.attributes.timestamp)
              - as_timestamp(now())) | int /60/1440) | round(0) + 1 == -2 }}
        sequence:
          - type: turn_on
            device_id: スマート水バルブのid
            entity_id: switch.water_irrigation_valve_1_stateのid
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_select.water_irrigation_valve_1_auto_irrigation_frequency
            state: 3日毎に朝
          - condition: trigger
            id:
              - morning
          - condition: template
            value_template: >-
              {{
              (((states.input_datetime.water_irrigation_valve_1_last_finished_date.attributes.timestamp)
              - as_timestamp(now())) | int /60/1440) | round(0) + 1 == -3 }}
        sequence:
          - type: turn_on
            device_id: スマート水バルブのid
            entity_id: switch.water_irrigation_valve_1_stateのid
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_select.water_irrigation_valve_1_auto_irrigation_frequency
            state: 週1回朝
          - condition: trigger
            id:
              - morning
          - condition: template
            value_template: >-
              {{
              (((states.input_datetime.water_irrigation_valve_1_last_finished_date.attributes.timestamp)
              - as_timestamp(now())) | int /60/1440) | round(0) + 1 == -7 }}
        sequence:
          - type: turn_on
            device_id: スマート水バルブのid
            entity_id: switch.water_irrigation_valve_1_stateのid
            domain: switch
      - conditions:
          - condition: state
            entity_id: input_select.water_irrigation_valve_1_auto_irrigation_frequency
            state: "OFF"
        sequence: []
mode: single

■芝生の水やりUIを作る

まずLDKのニッチに設置してあるタブレットに表示させているHome Assistantダッシュボードのホーム画面には、こんな表示をするようにしました。
水やり頻度と水量、最後に水やりが完了した日時を表示させています。

水やりをしている最中は、何リットル水やりをしたかを表示させています。

水やり関係の画面はまだ作りこんでませんが、とりあえず手動で水やりをON/OFFするスイッチと、水やり頻度のセレクタ、水量のセレクタを表示ささています。

■まとめ

そんなワケで今回は、手動で「水やり頻度」と「水量」を設定し、それに基づいて自動で芝生の水やりをするようにしました。
雨が一定量降りそうな時は手動でOFFにしなくてはいけませんが。
でも、ここまで作っておいてなんですけど、強風などでお隣さんの土地に水を撒いてしまう懸念も無いわけではないので、自分が居ない時に水やりさせるのも少し不安があるし、まぁ手動で水やりを開始させて設定した水量で自動で止まってくれるってだけで十分かもって思っていたりもします(笑)
。。。しますが、最終のゴールである「降水量の予報と土の乾き具合によって自動で水やりする」ところまでやっていこうと思います。
それでは。つづく。