Sympapaのスマートホーム日記

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

Home Assistant: ESP Home+ESP32でPCの電源ON/OFFをIoT化する(2)

Sympapaです。

前回、ESP Home+ESP32を使ってデスクトップPCの電源ON/OFFをIoT化しましたが、ブレッドボードを使ったお試し回路だったので本番回路を仕上げていきたいと思います。
sympapa.hatenablog.com


ですが、その前にESP Homeの設定を見直しします。

■ESP Home(とHome Asssitant)の設定見直し

前回組んだ回路は下図のとおりで、PCの電源状態の取得をマザーボードの電源表示用LED端子から取ることにしたんですが、配線後に「スリープ中LEDは点滅する」=「ESP32上のbinary_sensorが絶えずON/OFFを繰り返す」ということに気づきました。


これに対して前回はHome Assistant側でフィルタをかけて強引に対処していましたが、それだとスリープ中はESP32からHome Assistantへ絶えずON/OFFのステータス変化が送信されるのでWi-Fiの負荷やHome Assistantの負荷的にどうなんだろうか?という懸念が残りました。
配線し直して違う箇所から電源状態の取得をすることも考えましたが、ESP32側でフィルタ処理を完結させることによって、スリープ中にESP32からHome Assistantへの通信が発生するのを抑制することにしました。
ESP Homeで"binary_sensor"に"-delayed_on: 4000ms"のフィルタを追加し、GPIO33から4秒以上連続して入力があった時に「PCがONになった」と判定にするようにします。
スリープ中はGPIOからの入力はON/OFFを繰り返しますが、最初にOFFになった時点でbinary_sensorは"OFF"になり、GPIO33から4秒以上の入力があるまでは"ON"にならないのでESP32の中でON/OFF判定の処理が完結します。ESP32が忙しいままなのは変わらないですけど(汗
うまくやれば「スリープ」なのか「電源OFF」なのかを判別することも出来ますが、今回はその必要が無いのでやめておきます。
ちなみに"switch"の方はあくまでも「PCの電源スイッチを短絡させる」ためのスイッチであり「PCの電源ON/OFF」のスイッチではありません。300msのモーメンタリスイッチとしています。
そんなわけでESP Homeの設定は以下のようにしました。

switch:
  - platform: gpio
    pin: 32
    id: pc_switch_esp32
    name: "PC_switch_ESP32"
    icon: "mdi:gate"
    on_turn_on:
    - delay: 300ms
    - switch.turn_off: pc_switch_esp32

binary_sensor:
  - platform: gpio
    pin:
      number: 33
      mode: INPUT_PULLUP
      inverted: true
    filters:
      - delayed_on: 4000ms
    name: 'PC_power_status_esp32'


合わせてHome Assistant側の設定も見直します。
ここは前回と同じですがHome Assistant上で「PCのON/OFF」用の仮想スイッチを作ります。
このスイッチをGoogle Homeに連携させることで「OK! Google!」での操作も実現しています。

configuration.yaml

input_boolean:
  pc_power:
    name: pc_power
switch:
  - platform: template
    switches:
      pc_power:
        value_template: "{{ states('input_boolean.pc_power') }}"
        turn_on:
          - service: input_boolean.turn_on
            entity_id: input_boolean.pc_power
          - service: script.pc_power_on
        turn_off:
          - service: input_boolean.turn_off
            entity_id: input_boolean.pc_power
          - service: script.pc_power_off

次に上で作ったHome Assistant上のスイッチがON/OFFされたら、実際のPCの電源ステータスをチェックした上でPCの電源スイッチ端子を短絡させるスイッチをONにするスクリプトです。

alias: PC_power_on
sequence:
  - condition: state
    entity_id: binary_sensor.pc_power_status_esp32
    state: 'off'
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - service: switch.turn_on
    data: {}
    target:
      entity_id: switch.pc_switch_esp32
  - wait_for_trigger:
      - platform: state
        entity_id:
          - binary_sensor.pc_power_status_esp32
        from: 'on'
        to: 'off'
    timeout: '20'
mode: single
alias: PC_power_off
sequence:
  - condition: state
    entity_id: binary_sensor.pc_power_status_esp32
    state: 'on'
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - service: switch.turn_on
    data: {}
    target:
      entity_id: switch.pc_switch_esp32
  - wait_for_trigger:
      - platform: state
        entity_id:
          - binary_sensor.pc_power_status_esp32
        from: 'on'
        to: 'off'
    timeout: '20'
mode: single

次にPCの物理スイッチやPC上の操作で電源を操作した場合など、外部からPCの電源操作をした場合にそれをHome Assistant上のスイッチへ反映させるオートメーションです。

alias: PC_power_on
description: ''
trigger:
  - platform: state
    entity_id:
      - binary_sensor.pc_power_status_esp32
    from: 'off'
    to: 'on'
    for:
      hours: 0
      minutes: 0
      seconds: 0
condition:
  - condition: state
    entity_id: input_boolean.pc_power
    state: 'off'
  - condition: state
    entity_id: binary_sensor.pc_power_status_esp32
    state: 'on'
action:
  - service: switch.turn_on
    data: {}
    target:
      entity_id: switch.pc_power
mode: single
alias: PC_power_off
description: ''
trigger:
  - platform: state
    entity_id:
      - binary_sensor.pc_power_status_esp32
    from: 'on'
    to: 'off'
    for:
      hours: 0
      minutes: 0
      seconds: 0
condition:
  - condition: state
    entity_id: input_boolean.pc_power
    state: 'on'
  - condition: state
    entity_id: binary_sensor.pc_power_status_esp32
    state: 'off'
action:
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.pc_power
mode: single

■回路の作製

前回はブレッドボード上で作ったお試し回路だったので、ユニバーサル基板を使った本番回路を作製します。
といっても、ユニバーサル基板を使った回路の作製は初めてです(汗
ハンダ付けうまくいくかな。。。


回路は前回ブレッドボード上で作製したとおりです。


用意したユニバーサル基板は"サンハヤトICB-86”です。
ESP32、抵抗×4本、ダイオード×4本、フォトカプラ×2個を載せなくてはいけないので、大きめのを選びました。
そして、"ICB-86"はつながったパターンがあって、うまく使えばパターン間を自力で繋がなくてはいけない箇所が減りそうなのでコレにしました。今回使用したESP32は"ICB-86"の繋がっているパターン上にうまく載るので、ESP32からの配線がしやすいメリットもあるはず。

Amazon | サンハヤト 小型ユニバーサル基板 ICB-86 | 基板 | 産業・研究開発用品 通販


ESP32は直付けしようかと思いましたが、下駄をかませた方がESP32の下のスペースで回路を作ったりできるのでピンソケットを付けました。
ちなみにハンダ付けが汚すぎて裏側はお見せできません(笑)


基板を100均のケースに入れて両面テープで固定しました。
ESP32の電源はPCのスタンバイ電源(5V)から取ろうかと思いましたが、直付けはヤバいかもしれないということと、どのみちPCのケース内に取り付けたとしてもWi-Fiの接続が厳しかったらPCケースの外へ出さなくてはいけないので、とりあえず外部からUSBで供給することにしました。


結果的にはPCケース内に設置してWi-Fiの電波強度は-80dbくらいですが問題なく動作しているので、もう暫く様子をみて問題なさそうであれば、ESP32の電源はPC内部から取りたいと思います。

■まとめ

PCの消費電力は結構大きいのですが、暫くだけ作業から離れるつもりでオフにせずに離席しそのまま長時間作業に戻らないってこともあるので、遠隔操作出来るのは良いと思います。
ユニバーサル基板を使った回路作製には初めてトライしましたが、作業が終わる頃にようやくハンダ付けのコツを掴みました(汗
精進したいと思います。


それでは。