Sympapaです。
スマートプラグの消費電力モニタを使ってHome Assisatantとテレビの電源を同期させる記事を今朝アップしましたが、たいへん奇妙でややこしい処理を編み出しました(汗
ややこしい処理の背景を書くのもややこしくて長くなりそうなので詳細は割愛しますが、家のコントロールパネルとしてAndroidタブレット上で使っているHome AssistantのLovelace UIのボタンにSwitchを割り当てた場合、表示も押した時の動作も同じSwitchになってしまうと思い込んでいたからなんです。
しかし後で確認したら、Home AssistantのLovelace UIのボタンは表示と押した時のアクションを別々に設定できることが判りました。押した時のアクションにはサービスの実行が設定できます。
これならば、ボタン上の表示は電源状態保持用のSwitchとし、ボタンを押した時には実際にテレビをオンオフするサービスを実行することで、シンプルな処理に出来るはずです。
そもそもHome Assisatantとテレビの電源を同期させたい背景などは前回の記事をご覧ください。
あとは前回の記事のコピペも多用してささっと(笑)
sympapa.hatenablog.com
■使用するスマートプラグ
使用するスマートプラグはSengled E1C-NB7です。
Home AssistantとはZigBeeで接続し消費電力(W)と電力量(kWh)を取得が出来ます。消費電力取得のタイムラグが1~3秒くらいあるのとテレビを電源オンにしてから消費電力が立ち上がるまでので時間もあるので、それも考慮して設定していきましょう。
sympapa.hatenablog.com
■とりあえず今回のゴール
今回のゴールは以下のとおりです。
- 家のコントロールパネルにテレビの電源のトグルボタンを表示し、テレビの電源がオンの時はアイコンの色が変わるようにする
家のコントロールパネル上のトグルボタンを押してテレビの電源をオンオフした場合は即アイコンの色が変わるようにする
- Home Assistantから, Google Homeから, テレビ付属のリモコンから、いずれの方法でテレビの電源をオンオフしても上記アイコンの色が変わるようにする
■Home Assistantの設定
前回はかなりゴチャゴチャした処理を考えましたが今回は非常にシンプルです。
1)まずテレビの電源状態を保持するためだけのswitchを作ります。このswitchではテレビの電源は操作しません。
2)スマートプラグの電源の消費電力によって1)の電源状態を保持するswitchをオンオフするオートメーションを作ります。
3)家のコントロールパネル上のボタンを押して、実際にテレビの電源をオンオフした後電源状態を保持するswitchをオンオフするスクリプトを作ります。
4)ボタンの表示には1)の電源状態を保持するswitchを割り当てし、ボタンを押した時のアクションには3)のテレビの電源をオンオフするスクリプトを割り当てます。
1.Switchの作成
電源オンオフの状態を保持しなくてはいけないので、電源状態を保持するための"switch.kitchen_tv_for_display"をconfiguration.yaml上で作ります。
【configuration.yaml】
input_boolean: kitchen_tv: name: kitchen_tv_for_display switch: - platform: template switches: kitchen_tv_for_display: value_template: "{{ states('input_boolean.kitchen_tv_for_display') }}" turn_on: - service: input_boolean.turn_on entity_id: input_boolean.kitchen_tv_for_display turn_off: - service: input_boolean.turn_off entity_id: input_boolean.kitchen_tv_for_display rest_command: bravia_on: url: 'http://192.168.11.x/messages' method: POST headers: Accept: 'application/json' Content-Type: 'application/json' X-Requested-With: 'curl' Expect: '' payload: '{"format":"us","freq":38,"data":[2411,580,610,610,(略),36180]}' bravia_off: url: 'http://192.168.11.x/messages' method: POST headers: Accept: 'application/json' Content-Type: 'application/json' X-Requested-With: 'curl' Expect: '' payload: '{"format":"us","freq":38,"data":[2411,580,1220,580,(略),36180]}'
2.スマートプラグの消費電力変化でSwitchをオンオフするオートメーション作成
次は、スマートプラグがモニターしている消費電力が変化したら"switch.kitchen_tv_for_display"をオンオフするオートメーションを作ります。
トリガーは「消費電力が21W以上になった時または消費電力が20W以下になった時」です。
消費電力が21W以上の場合に"switch.kitchen_tv"をオンにし、消費電力が20W以下の場合に"switch.kitchen_tv"をオフにするようにしました。
alias: Bravia_get_power_status_by_sengled description: '' trigger: - type: power platform: device device_id: スマートプラグのID entity_id: sensor.sengled_e1c_nb7_bravia_power domain: sensor above: 21 for: hours: 0 minutes: 0 seconds: 1 - type: power platform: device device_id: スマートプラグのID entity_id: sensor.sengled_e1c_nb7_bravia_power domain: sensor below: 20 for: hours: 0 minutes: 0 seconds: 1 condition: [] action: - choose: - conditions: - type: is_power condition: device device_id: スマートプラグのID entity_id: sensor.sengled_e1c_nb7_bravia_power domain: sensor above: 21 sequence: - service: switch.turn_on data: {} target: entity_id: switch.kitchen_tv_for_display - conditions: - type: is_power condition: device device_id: スマートプラグのID entity_id: sensor.sengled_e1c_nb7_bravia_power domain: sensor below: 20 sequence: - service: switch.turn_off target: entity_id: - switch.kitchen_tv_for_display data: {} default: [] mode: single
3.Switchが操作されたら実行するスクリプトの作成
家のコントロールパネル上のテレビのスイッチボタンが押された時に実行するスクリプトを作成します。
"switch.kitchen_tv_for_display”がOFFの時にはテレビをONにするIR信号を発射するrest_commandを実行し、"switch.kitchen_tv_for_display”がONの時にはテレビをOFFにするIR信号を発射するrest_commandを実行するようにしました。併せて"switch.kitchen_tv_for_display”をオンオフします。
スマートプラグから取得する消費電力にはタイムラグがあり不整合が生じる可能性があるので、その6秒後に"switch.kitchen_tv_for_display"と消費電力の整合をチェックし、不整合があった場合は消費電力と整合が取れるようIR信号を発射せずに"switch.kitchen_tv_for_display”をオンオフするようにしています。
alias: Bravia_power_switch_for_button sequence: - choose: - conditions: - condition: state entity_id: switch.kitchen_tv_for_display state: 'off' sequence: - service: rest_command.bravia_on data: {} - service: switch.turn_on data: {} target: entity_id: switch.kitchen_tv_for_display - conditions: - condition: state entity_id: switch.kitchen_tv_for_display state: 'on' sequence: - service: rest_command.bravia_off data: {} - service: switch.turn_off data: {} target: entity_id: switch.kitchen_tv_for_display default: [] - delay: hours: 0 minutes: 0 seconds: 6 milliseconds: 0 - choose: - conditions: - type: is_power condition: device device_id: スマートプラグのID entity_id: sensor.sengled_e1c_nb7_bravia_power domain: sensor above: 21 - condition: state entity_id: switch.kitchen_tv_for_display state: 'off' sequence: - service: switch.turn_on data: {} target: entity_id: - switch.kitchen_tv_for_display - conditions: - type: is_power condition: device device_id: スマートプラグのID entity_id: sensor.sengled_e1c_nb7_bravia_power domain: sensor below: 20 - condition: state entity_id: switch.kitchen_tv_for_display state: 'on' sequence: - service: switch.turn_off data: {} target: entity_id: - switch.kitchen_tv_for_display default: [] mode: restart
■まとめ
そんなワケで前回、消費電力モニター機能付きスマートプラグを使ってテレビの電源状態をHome Assistantと同期させてみたけどぐちゃぐちゃになってしまった処理の改善を今回は実施しました。
だいぶシンプルになったので、これなら照度センサーを使ったHome Assistantとシーリング照明の同期にも使えるかなと思います。
次回、試したいと思います。
それでは。