Sympapaのスマートホーム日記

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

我が家のスマートホーム化: 高気密住宅でレンジフード稼動中に玄関ドアが重くなるのを防ぐギミック


Sympapaです。


近年の戸建て住宅は高気密化していますよね。暖房や冷房の効率を上げるには断熱はもちろん一定以上の気密は必要です。
気密性はC値で表され実際に気密測定をすることで値を知ることが出来ます。
我が家は建築中に外部の配線や配管が完了した時点で気密を測定しC値=0.2でした。なかなかの高気密です。
C値は[住宅全体の隙間の合計面積(㎠)]÷[延べ床面積(㎡)]なので、延べ床面積が116.7㎡の我が家の場合23.34c㎡の隙間があるということになります。小さい隙間を集めて合計したら4.8cm×4.8cmの穴があるのと同じってことです。まぁ気密測定時には換気扇のダクトやエアコンのスリーブはテープで塞いでいるので、実際に住んでいる現状では(たぶん)シャッターの無いお風呂の換気扇はそのままプラスの隙間となるでしょうし、エアコン取付時にはスリーブと配管等の隙間に発泡ウレタンを吹いて貰っていますがここにもいくらか隙間が増えているとは思うので、もう少し隙間は多いはずです。


んで、高気密住宅にはもちろんデメリットもあります。そのひとつとして、キッチンのレンジフードを稼働させると隙間が少ないため排出される空気の量に対して入ってくる空気の量が追い付かず、家の中が負圧になって玄関ドアが重くなる欠点があります。
これを解消してくれるのが同時給排のレンジフードで、レンジフード用に排気口だけでなく給気口も設けレンジフードの稼働中には給気口のシャッターを開くことで、普段の気密を犠牲にせずにレンジフード稼働時は負圧を緩和するというものです。我が家でも同時給排のレンジフードを採用していますがそれでもMax風量で動かしてると玄関ドアがとても重い。我が家の場合は第一種換気を採用しているので、第三種換気のような自然給気口が無いのも影響しているかもしれません。


気密が高い状態を維持できているかを玄関ドアの重さで実感できるのでそれはそれで良いのですが、レンジフードをMax風量で稼働させると小さい子供は玄関ドアを開けることが困難なくらい重くなります。更に負圧の時は玄関ドアを開けた時に外から屋内へ一気に空気が流れ込むので玄関ホールとLDKの間にある引き戸が「ガタガタッ」って振動するし、虫の多い季節にはたくさんの虫が家の中に吸い込まれて入って来るかもしれないという問題も考えられます。まさに「気密の刃」です。(笑)


そんなワケで玄関ドアのロックを開けたらレンジフードを一時的に止めて玄関ドアを開けやすいようにするというギミックを思い付いたので、Home Assistantで実現していきたいと思います。

■考えたギミック

大まかな流れを言うと、レンジフードが稼働している時に玄関ドアのロックを解錠するとレンジフードを一時的に停止し、玄関ドアを開いて閉まった後にレンジフードを元の通り再稼働させるようにしたいと思います。

◇どうやってレンジフードを制御するか

大抵のレンジフードにはIHクッキングヒーターと連動して自動で稼働させる機能が付いています。その連動には一般的な赤外線リモコン信号が使われていて、IHクッキングヒーターが稼働に合わせて赤外線リモコン信号を発信しレンジフードはそれを受けて稼働します。我が家のレンジフードにはオプションの赤外線リモコンも導入しているので、赤外線信号は取得可能です。余っている赤外線スマートリモコン"Nature Remo 3"をキッチンに設置してHome Assistantから制御してやります。

◇どうやって玄関ドアが解錠したことを取得するか?

我が家の玄関ドアはYKK AP製の電気錠付(100V仕様)で操作盤YS KAG-B3を導入しています。この操作盤のJEM-A端子とESP32を接続し、それを使ってHome Assistantから施錠状態の取得とドアロックの制御を出来るようにしています。なので既に玄関ドアが解錠したことを取得することは可能です。

◇玄関ドアの開閉状態をどうやって取得するか?

ドア開閉センサーを使います。玄関ドアにドア開閉センサーを既に設置済みです。

◇レンジフードの稼働状況をどうやって取得するか?

我が家のレンジフードの風量は「弱」「中」「強」の3段階切り替えです。どの風量で稼働しているかは消費電力計測機能付きのスマートプラグを使えば取得するのは簡単です。
問題は、IHヒーターを消した時にはレンジフードはタイマーが作動し3分後にオフになるようになっています。このタイマーが作動中に玄関ドアのロックを解錠してレンジフードを停止した場合、レンジフードを再稼働する時にタイマーをオンにしなくてはいけません。しかし消費電力ではタイマーが作動しているのかどうかは判別できません。
既にIHヒーターの稼働状況を取得するためにその赤外線リモコン信号をキャッチできるようにはしてあるので、IHヒーターがオフになってからレンジフードがオフになるまでの間はタイマー作動中とみなしすことにします。


大体こんな感じでいけるかな?
では実際にHome Assistantの設定をしていきましょう。

■Home AssistantからNature Remo 3のローカルAPIを使ってレンジフードを制御できるようにする

Nature Remoを弄るのは久しぶりです。Home Assisatantを使い始めた当初はHome Assistantと直接接続できるデバイスをあまり持っていなかったので、スマート赤外線リモコンであるNature RemoをHome Assistantと連携させるのは重要でした。今回、久々にNature Remoを弄っていたら、当時の一日中Home Assistantを弄っていた熱量を思い出しました(笑)
Nature RemoはローカルAPIが使えるのでHome AssistantからRest commandを使って制御可能です。


1)リモコンをNature Remoへ向けてリモコンの取得したい信号のボタンを押す


2)PCで下のコマンドを叩く

curl  "http://192.168.11.7/messages" -H "X-Requested-With: curl  " -v


3)返って来たコード(↓こういうやつ)をコピーする

{"format":"us","freq":39,"data":[8907,4503,558,558,562,1664,561,560,560,577,552,576,559,558,562,594,541,1650,571,558,562,1664,561,586,542,1651,560,1666,558,1649,570,1648,570,1653,568,1651,568,560,560,577,558,558,539,602,550,594,541,560,568,1651,570,558,571,1648,570,1650,568,1651,566,1650,569,1650,568,1650,569,556,557]}


4)Home Assistantの"configirations.yaml"に”rest command”を作る

rest_command:
  range_hood_level_1_local:
    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":39,"data":[8907,4503,558,558,562,1664,561,560,560,577,552,576,559,558,562,594,541,1650,571,558,562,1664,561,586,542,1651,560,1666,558,1649,570,1648,570,1653,568,1651,568,560,560,577,558,558,539,602,550,594,541,560,568,1651,570,558,571,1648,570,1650,568,1651,566,1650,569,1650,568,1650,569,556,557]}'


ちなみにIHヒーターとレンジフードを連携させる赤外線信号はメーカーが異なっていても使えるはずなので、レンジフードの赤外線リモコンをお持ちでない方のために赤外線信号のコードを貼っときます。需要無いかもですが(笑)

・風量「弱」
{"format":"us","freq":39,"data":[8907,4503,558,558,562,1664,561,560,560,577,552,576,559,558,562,594,541,1650,571,558,562,1664,561,586,542,1651,560,1666,558,1649,570,1648,570,1653,568,1651,568,560,560,577,558,558,539,602,550,594,541,560,568,1651,570,558,571,1648,570,1650,568,1651,566,1650,569,1650,568,1650,569,556,557]}

・風量「中」
{"format":"us","freq":39,"data":[8909,4500,554,575,551,1668,552,577,558,560,561,574,561,560,560,577,558,1655,566,561,560,1667,552,577,558,1651,566,1651,560,1667,559,1650,560,1669,561,560,560,1667,552,576,559,558,570,561,560,575,560,560,560,1668,554,1665,554,575,560,1650,561,1666,558,1649,571,1648,570,1649,570,559,555]}'

・風量「強」
{"format":"us","freq":39,"data":[8905,4485,566,558,568,1651,566,558,568,556,571,586,540,557,561,575,552,1667,560,556,571,1648,568,556,571,1648,560,1662,555,1664,559,1648,568,1651,569,1646,563,1664,552,577,550,574,552,577,550,575,552,576,557,1650,571,558,560,577,550,1664,559,1648,568,1649,560,1665,558,1651,566,556,562]}'

・オフ
{"format":"us","freq":39,"data":[8913,4484,562,594,541,1651,560,577,558,558,568,561,568,557,570,559,562,1670,558,558,562,1665,561,560,561,1666,559,1650,567,1650,561,1666,559,1654,567,560,568,557,570,559,570,587,540,560,568,557,570,559,562,1669,558,1651,560,1665,552,1667,550,1664,560,1651,560,1667,558,1650,561,574,546]}

・タイマーボタン
{"format":"us","freq":38,"data":[8915,4486,561,577,550,1665,552,577,558,559,568,560,561,576,550,575,560,1651,571,558,568,1651,566,559,562,1665,552,1662,555,1665,552,1667,558,1653,566,1651,568,558,569,1647,562,574,561,556,570,559,568,557,570,1653,560,577,558,1649,569,556,570,1649,568,1649,569,1648,560,1664,554,574,546]}'

・照明ボタン
 {"format":"us","freq":39,"data":[8916,4486,568,561,568,1647,570,559,562,574,561,560,561,576,558,587,540,1651,571,558,562,1665,561,556,570,1651,561,1664,561,1650,567,1648,571,1652,569,560,568,557,571,1650,560,575,560,557,570,559,570,559,568,1651,570,1650,561,1664,561,560,560,1663,562,1651,566,1651,568,1647,570,558,556]}

■ヘルパーで"input_select"と"input_boolean"を用意する

Home Assistantのヘルパーを使って、必要な"input_select"と"input_boolean"を用意します。今回は以下の4つを用意しました。


1)我が家のレンジフードの風量は3段階切り替えです。レンジフードの稼働状況にあわせて"Off","Low","Mid","High"を選択する"input_select"を作成します。”input_select.range_hood_fan_power_level”としました。


2)一旦レンジフードを停止した後ドアロックを解錠する前の状態でレンジフードを再稼働させなくてはいけないので、ドアロックを解錠した時点のレンジフードの稼働状況を記憶するための"input_select"を作成します。選択肢は1)と同じです。"input_select.range_hood_fan_power_lebel_when_entrance_door_last_unlock"としました。


3)IHヒーターをオフにした時にはレンジフードは3分後にオフにするタイマーを発動します。IHヒーターからの赤外線リモコン信号を受信するデバイスは既に仕込んであるので、IHヒーターがオフになってからレンジフードがオフになるまでの間はタイマー作動中とみなすことにします。タイマー作動中にオンにする”input_boolean”を作成します。"input_boolean.range_hood_timer_is_running"としました。
(※実際にはレンジフード側でも手動でタイマー設定が出来ますが、それは取得しようが無いし使ってもいないので無視することにします。)


4)玄関ドアのロックを解錠する前にタイマー作動中だった場合はレンジフード再稼働時にタイマーをオンにしなくてはいけないので、ドアロックを解錠した時点の"input_boolean.range_hood_timer_is_running"
の状態を記憶するための"input_boolean"を作成します。"input_boolean.when_entrance_door_last_unlocked_range_hood_timer_running"としました。

■レンジフードの稼働状況を取得できるようにする

非IoTデバイスの稼働状況を取得するのに消費電力を使うのはDIYスマートホーム界隈で最もポピュラーな方法です。特に今回はオンオフだけでなくレンジフードの風量設定も知りたいため消費電力が適しているので、今回は消費電力が取得できるスマートプラグを使います。


消費電力を調べると、ファンが「弱」の時は27W、「中」の時は55W、「強」の時は105Wでした。

これに合わせて、さっき作成したinput_select..range_hood_fan_power_levelを切り替えるオートメーションを作成します。

alias: auto_select_range_hood_power
description: ""
triggers:
  - type: power
    device_id: レンジフードのスマートプラグ
    entity_id: 消費電力
    domain: sensor
    trigger: device
    id: "off"
    below: 20
  - type: power
    device_id: レンジフードのスマートプラグ
    entity_id: 消費電力
    domain: sensor
    trigger: device
    id: low
    above: 20
    below: 35
  - type: power
    device_id: レンジフードのスマートプラグ
    entity_id: 消費電力
    domain: sensor
    trigger: device
    id: mid
    above: 45
    below: 65
  - type: power
    device_id: レンジフードのスマートプラグ
    entity_id: 消費電力
    domain: sensor
    trigger: device
    id: high
    above: 95
    below: 115
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - low
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: Low
            target:
              entity_id: input_select.range_hood_fan_power_level
      - conditions:
          - condition: trigger
            id:
              - mid
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: Mid
            target:
              entity_id: input_select.range_hood_fan_power_level
      - conditions:
          - condition: trigger
            id:
              - high
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: High
            target:
              entity_id: input_select.range_hood_fan_power_level
      - conditions:
          - condition: trigger
            id:
              - "off"
        sequence:
          - action: input_select.select_option
            metadata: {}
            data:
              option: "Off"
            target:
              entity_id: input_select.range_hood_fan_power_level
    default: []
mode: single

■レンジフードのタイマーが作動中かどうかを取得する

IHヒーターをオフにした時にレンジフードはその3分後にオフになるようになっていて内部で3分間のタイマーを発動します。
前述しましたが、IHヒーターからの赤外線リモコン信号を受信するデバイスは既に仕込んであるので、IHヒーターがオフになってからレンジフードがオフになるまでの間はタイマー作動中とみなすこととしました。(※実際にはレンジフード側でも手動でタイマー設定が出来ますが、それは取得しようが無いし使ってもいないので無視します。)
その間は"input_boolean.range_hood_timer_is_running"をオンにするようオートメーションを組みました。実際には既に作成済みの「 IHクッキングヒーターの消し忘れを防止する」オートメーションの中に組み込みました。
sympapa.hatenablog.com

■玄関ドアのロックが解錠されたことを取得する

前述したとおり、我が家の玄関ドアはYKK AP製の電気錠付(100V仕様)で操作盤YS KAG-B3を導入しています。この操作盤のJEM-A端子とESP32を接続し、それを使ってHome Assistantから施錠状態の取得とドアロックの制御を出来るようにしています。なので既に玄関ドアが解錠したことを取得することは可能です。
YKK APの電気錠付玄関ドアは屋内側にはボタンが無いため屋内側から解錠するには二重ロックの2個のサムターンを回して解錠しなくてはいけません。また、屋内側から解錠した場合に作動するオートロック機能がありません。このため我が家では屋内側には後付けでボタンを設置してワンタッチで解錠できるようにしオートロックの機能もHome Assistantを使って実現しています。詳細はこの記事に書いています。
sympapa.hatenablog.com

■玄関ドアのロックを解錠したらレンジフードを制御するメインのオートメーション

さて、ようやくメインのオートメーションを組んでいきます。
動作としては、玄関ドアロックの解錠を検出→レンジフードの稼働状態を記憶する→レンジフードを止める→ドアが開くのを待つ→ドアが閉じるのを待つ→レンジフードを元の状態で再稼働するです。
しかし玄関ドアは二重ロックになっていて電気錠は上、下と順番に解錠するのですが、電気錠操作盤は上下ロックの両方が解錠された後にステータスが「施錠」から「解錠」に変わるのですよね。つまり人間が解錠操作を開始してもすぐにオートメーションが発動するわけではありません。電気錠の解錠が完了したことは人間には音で判るのでその瞬間せっかちにドアを開けるとレンジフードがオフとなるのが間に合わない感じです(汗)
そんなワケですが、屋内側からは後付けしたボタンで解錠することがほとんどなので、このボタンを押した場合にもオートメーションが発動するようにすることで屋内側から解錠した場合のみとなりますがレンジフードがオフになるのが間に合わない問題を解消することにしました。(ボタンを押してから電気錠が解錠動作に入るためボタンを押した時点でレンジフードを止めれば十分間に合う)

屋内側の解錠用後付けボタン
alias: 玄関ドアをアンロックしたらレンジフードを停止する
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.玄関ドアのロック状態
    from:
      - "on"
    to:
      - "off"
  - type: not_opened
    device_id: 玄関ドア電気錠操作盤に繋いだESP32
    entity_id: 玄関ドアのロック状態
    domain: binary_sensor
    trigger: device
conditions:
  - condition: not
    conditions:
      - condition: state
        entity_id: input_select.range_hood_fan_power_level
        state:
          - "Off"
actions:
  - action: input_select.select_option
    metadata: {}
    target:
      entity_id: input_select.range_hood_fan_power_lebel_when_entrance_door_last_unlock
    data:
      option: "{{ states(\"input_select.range_hood_fan_power_level\") }}"
  - choose:
      - conditions:
          - condition: state
            entity_id: input_boolean.range_hood_timer_is_running
            state:
              - "on"
        sequence:
          - action: input_boolean.turn_on
            metadata: {}
            target:
              entity_id: >-
                input_boolean.when_entrance_door_last_unlocked_range_hood_timer_running
            data: {}
      - conditions:
          - condition: state
            entity_id: input_boolean.range_hood_timer_is_running
            state:
              - "off"
        sequence:
          - action: input_boolean.turn_off
            metadata: {}
            target:
              entity_id: >-
                input_boolean.when_entrance_door_last_unlocked_range_hood_timer_running
            data: {}
  - action: rest_command.range_hood_off_local
    metadata: {}
    data: {}
  - wait_for_trigger:
      - type: opened
        device_id: 玄関ドア開閉センサー
        entity_id: 玄関ドアの開閉
        domain: binary_sensor
        trigger: device
        for:
          hours: 0
          minutes: 0
          seconds: 1
        id: door_open
      - trigger: state
        entity_id:
          - binary_sensor.玄関ドアのロック状態
        from:
          - "off"
          - "on"
        id: door_locked
    timeout:
      hours: 0
      minutes: 0
      seconds: 50
      milliseconds: 0
  - if:
      - type: is_open
        condition: device
        device_id: 玄関ドア開閉センサー
        entity_id: 玄関ドアの開閉状態
        domain: binary_sensor
    then:
      - wait_for_trigger:
          - type: not_opened
            device_id: 玄関ドア開閉センサー
            entity_id: 玄関ドアの開閉状態
            domain: binary_sensor
            trigger: device
            for:
              hours: 0
              minutes: 0
              seconds: 1
        timeout:
          hours: 0
          minutes: 0
          seconds: 50
          milliseconds: 0
  - choose:
      - conditions:
          - condition: state
            entity_id: >-
              input_select.range_hood_fan_power_lebel_when_entrance_door_last_unlock
            state:
              - Low
        sequence:
          - action: rest_command.range_hood_level_1_local
            metadata: {}
            data: {}
      - conditions:
          - condition: state
            entity_id: >-
              input_select.range_hood_fan_power_lebel_when_entrance_door_last_unlock
            state:
              - Mid
        sequence:
          - action: rest_command.range_hood_level_2_local
            metadata: {}
            data: {}
      - conditions:
          - condition: state
            entity_id: >-
              input_select.range_hood_fan_power_lebel_when_entrance_door_last_unlock
            state:
              - High
        sequence:
          - action: rest_command.range_hood_level_3_local
            metadata: {}
            data: {}
  - if:
      - condition: trigger
        id: ""
      - condition: state
        state:
          - "on"
        entity_id: >-
          input_boolean.when_entrance_door_last_unlocked_range_hood_timer_running
    then:
      - action: rest_command.range_hood_timer_local
        metadata: {}
        data: {}
      - action: input_boolean.turn_on
        metadata: {}
        target:
          entity_id: input_boolean.range_hood_timer_is_running
        data: {}
mode: restart

■まとめ

ということで、今回はHome Assistantを使って「気密の刃」に立ち向かうギミックをやってみました。
オートメーションは想定したとおりに動いてくれていますが、前述したとおりロックが解錠された瞬間にせっかちにドアを開けるとレンジフードがオフなるのが間に合わない感じです。我が家の住人はせっかちですしねぇ。「気密の刃」の攻略は簡単ではありませんでした(笑)
まぁ屋内側から解錠する時はほぼ後付けボタンで解錠するので間に合いますけどね。外側から解錠した場合の対応策はちょっと思い付かないなぁ。。。外側からは玄関ドアに元々付いているロック操作ボタンで解錠することがほとんどなので玄関ドアを改造すればソレが押されたことを検出するのも出来なくはなさそうですが改造するのは怖いし大変そうです。人感センサーを使って玄関の前に人が立った時点でレンジフードをオフにしちゃっても良い気もしますが、郵便屋さんとか押し売りの営業とか来るたびにレンジフードが止まるのもスマートじゃないし。。。まぁまた暇な時に考えてみることにします。ってのは「放置します」と同意かな(笑)


それでは。