Sympapaのスマートホーム日記

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

スマートホーム: 窓の鍵の戸締りチェックを自動化する(2)

sympapaです。
今回は「我が家の嫁様は換気した後に窓の鍵を施錠し忘れる持病を抱えているので窓の戸締りチェックを自動化してやろう」シリーズ2回目です。
前回の記事で、窓の鍵の戸締りチェックを自動化するため8箇所の窓のクレセント錠にドア開閉センサーを取り付けました。

今回はHome Assistantで戸締り状態をチェックできるようにしていきます。


■構想

  • いずれかの窓がロックされていない時、キッチンに設置してあるHome Assistantのモニター用タブレットが窓の鍵の状態を表示する画面に切り替わる。これを見るとどの窓がロックされていないかが一目で判る。
  • ロックされていない窓がある時に玄関へ行くと、玄関の電球が赤く点滅しリビングのNest miniとキッチンのNest HUBが「窓がロックされていません」と大音量で喋る。(本当は玄関にNest miniを置きたいが電源がない)

※出かけてからでは遅いので今から出かけるってのを判定したいワケですが、とりあえず良い方法が思いつかないので玄関の人感センサーが反応したらってことにしてます。


■Home Assistantでユーザー変数を使えるカスタムコンポーネント

Home Assistantの標準機能で出来そうな気がしますが私はスキルが無いので、Home Assistantでユーザー変数が使えるようになるカスタムコンポーネント: home-assistant-variablesをインストールしています。Entityとして取り扱われるのでアイコンの指定も出来ます。
今回もhome-assistant-variablesの変数に窓の状態を入れていきます。
github.com


■各窓の施錠状態を変数に入力する

もっとスマートでいい方法がありそうなもんですが、とにかくオートメーションを[窓に取り付けたドア開閉センサーの数:8個]×[施錠/解錠の2つ]作ってそれぞれの窓用の変数に状態を入力しています。と書いてて気づきましたが、少なくとも施錠と解錠は私のスキルでもひとつにまとめられました(笑)
下のトイレの例では、var.window_toiletに施錠時は"0",解錠時は"1"を入力し、var.window_toilet_jaに施錠時は"ロックされてます",解錠時は"ロックされていません"を日本語の文章で入力するという変数の無駄遣いをしています(笑)
var.window_toiletを解錠時に"1"としているのは解錠されている数を数えたいからです。

[施錠された時のオートメーション]

alias: window_lock_toilet_B_locked
description: ''
trigger:
  - type: not_opened
    platform: device
    device_id: ドア開閉センサー
    entity_id: binary_sensor.aqara_door_sensor_b_on_off
    domain: binary_sensor
    for:
      hours: 0
      minutes: 0
      seconds: 1
      milliseconds: 0
condition: []
action:
  - service: var.set
    data:
      entity_id: var.window_toilet
      value: 0
      icon: mdi:lock-check
  - service: var.set
    data:
      entity_id: var.window_toilet_ja
      value: ロックされてます
      icon: mdi:lock-check
mode: single

[解錠された時のオートメーション]

alias: window_lock_toilet_B_unlocked
description: ''
trigger:
  - type: opened
    platform: device
    device_id: ドア開閉センサー
    entity_id: binary_sensor.aqara_door_sensor_b_on_off
    domain: binary_sensor
    for:
      hours: 0
      minutes: 0
      seconds: 1
      milliseconds: 0
condition: []
action:
  - service: var.set
    data:
      entity_id: var.window_toilet
      value: 1
      icon: mdi:lock-open-alert-outline
  - service: var.set
    data:
      entity_id: var.window_toilet_ja
      value: 開いてます
      icon: mdi:lock-open-alert-outline
mode: single


■解錠されている窓の数を数える

カスタムコンポーネント: home-assistant-variablesの機能に、指定した変数A(複数可)に変化があったら変数Bを更新するという機能があります。
下の例では各窓毎の8個の変数を監視し、いずれかに変化があったらそれらを全部合計した値をvar.window_unlocked_numberに入力します。
各窓の変数は解錠時に1、施錠時に0なので解錠されている窓の数が入力されることになります。

configuration.yaml

  window_unlocked_number:
    friendly_name: "window_unlocked_number"
    value_template: "{{ (states('var.window_living_east_north') | float + states('var.window_living_east_south') | float + states('var.window_kitchen_north') | float + states('var.window_kitchen_west_north') | float + states('var.window_kitchen_west_south') | float + states('var.window_bathroom') | float + states('var.window_dressing_room') | float + states('var.window_toilet') | float)|round(0) }}"
    tracked_entity_id:
      - var.window_living_east_north
      - var.window_living_east_south
      - var.window_kitchen_north
      - var.window_kitchen_west_north
      - var.window_kitchen_west_south      
      - var.window_bathroom
      - var.window_dressing_room
      - var.window_toilet


■解錠されている窓の数を元に日本語の文章を変数に入れる

解錠されている窓の数の合計を入れた変数: var.window_unlocked_numberが変化したら、 var.window_unlocked_number_jaに「全部ロックされてます」又は「x箇所ロックされてません」と入力しています。
入力するだけなら上で書いたのと同様にカスタムコンポーネント: home-assistant-variablesの機能を使えばいいんですが、アイコンの指定の仕方が良くわからずオートメーションで強引に対応させました(汗

alias: window_unlocked_number_jaのセット
description: ''
trigger:
  - platform: state
    entity_id: var.window_unlocked_number
    for:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 0
condition: []
action:
  - service: var.set
    data:
      entity_id: var.window_unlocked_number_ja
      value_template: |-
        {% if states('var.window_unlocked_number') == '0' %}
          全部ロックされてます
        {% else %}
          {{ (states('var.window_unlocked_number'))}}箇所あいてます
        {% endif %}
      icon: mdi:lock-open-alert-outline
  - choose:
      - conditions:
          - condition: state
            entity_id: var.window_unlocked_number
            state: '0'
        sequence:
          - service: var.set
            data:
              entity_id: var.window_unlocked_number_ja
              icon: mdi:lock-check
      - conditions:
          - condition: not
            conditions:
              - condition: state
                entity_id: var.window_unlocked_number
                state: '0'
        sequence:
          - service: var.set
            data:
              entity_id: var.window_unlocked_number_ja
              icon: mdi:lock-open-alert-outline
    default: []
mode: single


タブレットに表示する

家のコントロールパネルとしてキッチンに常設しているタブレットに鍵の状態を表示させます。
home-assistant-variablesの変数はEntityとなっているのでLovelace UIのEntityカードで表示でき、日本語の文章を入れた変数であれば直接表示させるだけです。
カードの色は施錠されていれば緑、解錠されていれば赤という具合に状況に応じて変化させたいのですが、標準ではカードに色を付ける機能が無いのでlovelace-card-modというカスタムコンポーネントを使っています。
github.com

せめてtemplateの記述の仕方を覚えないと強引にでも使いこなすのは難しいですねぇ(汗
カードの設定のyamlは以下のとおりです。

type: entity
entity: var.window_unlocked_number_ja
state_color: true
name: 8箇所の窓
card_mod:
  style: |
    ha-card {
       background-color: {{ '#00cc33' if is_state('var.window_unlocked_number', '0') else '#FF0000' }};
       color: #FFFFFF;
     }


Lovelace UIにのメインのページ(キッチン)には、解錠されている窓の合計数のみ表示し、「窓の鍵」というページを追加して各窓の鍵の状態を表示されるようにしました。
どこかの窓が解錠されると「窓の鍵」のページを自動的に開き、全て施錠されるとメインのページ(キッチン)を自動的に開くようにしていますが自動でページが切り替わる処理については別途紹介したいと思います。


■まとめ

ひと目で解錠されている窓がわかってなかなか便利です(^^
次回は出かけようとした時に解錠されている窓があるとお知らせしてくれるようにしていきます。
つづく