Sympapaのスマートホーム日記

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

Home Assistant: テレビの電源をHome Assistantと同期する(もう大幅修正)

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


4.家のコントロールパネルの設定

ボタンカードを設置しますが、エンティティには"switch.kitchen_tv_for_display”を割り当てます。
タップ時のアクションには「サービスの呼び出し」で上で作成したスクリプトを割り当てます。


■まとめ

そんなワケで前回、消費電力モニター機能付きスマートプラグを使ってテレビの電源状態をHome Assistantと同期させてみたけどぐちゃぐちゃになってしまった処理の改善を今回は実施しました。
だいぶシンプルになったので、これなら照度センサーを使ったHome Assistantとシーリング照明の同期にも使えるかなと思います。
次回、試したいと思います。


それでは。