ESPHomeでエントランスのオートロックを自動開錠


要件

  • 自宅(賃貸)のオートロックを物理鍵なしで開けたい
  • 不在時は訪問者の画像をスマホへ通知したい
  • 賃貸なので加工はできない
  • インターホンはアイホン株式会社のVHK-RMA-S

検討内容

  • インターホン(VHK-RMA-S)をハックしてデータ取得、開錠コマンド送信
    • 解析してる人はいる模様 (アイ〇ンのプロトコルの話)
    • 火災報知機なども連動しているので、壊したり入居者に迷惑をかけるリスクが高いため却下
  • 備え付けのインターホンに、公式のネットワークアダプタを取り付ける

採用した方法

  • 自作
  • センサとサーボで物理ボタンを押す
    • 室内のインターホンに明るさセンサをつけて帰宅/来客を検知
    • サーボモータで開錠スイッチを押す。または通知を送信
    • デメリット:インターホンが使いづらい
  • 肉厚の両面テープで固定してるので、すぐ原状復帰可能
  • コストは5千円以下
  • 不在時の訪問者は、画面に表示されてるのをIPカメラで撮影
    • デメリット:画質いまいち

主な部品例

部品 型番 備考
マイコン ESP-WROOM-02 またはシリアル付きのもの
ピッチ返還基盤 ESP-WROOM-02ピッチ変換用基板
光センサ BH1750
サーボ FEETECH FS90
三端子レギュレータ TA48033S
電源 5V 1A 5Wあれば十分
ケース お好みのもの
WROOM-02のライタ シリアル付きなら不要

配線

ESPHomeの設定

esphome:
  name: lobbydoor-opener
  platform: ESP8266
  board: esp_wroom_02

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: !secret api_password

ota:
  password: !secret ota_password


wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: lobbydoor-outdoor
    password: !secret wifi_ap_password
captive_portal:



#############################
esphome:
  name: lobbydoor-opener
  platform: ESP8266
  board: esp_wroom_02

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: !secret api_password

ota:
  password: !secret ota_password


wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: lobbydoor-outdoor
    password: !secret wifi_ap_password
captive_portal:



#############################
globals:
   - id: auto_open
     type: bool
     restore_value: no
     initial_value: 'false'
   - id: not_opened
     type: bool
     restore_value: no
     initial_value: 'false'
   - id: opening
     type: bool
     restore_value: no
     initial_value: 'false'
     
i2c:
  sda: GPIO4
  scl: GPIO5
  scan: True
  
sensor:
  - platform: bh1750
    name: "Interphone Illuminance"
    address: 0x23
    update_interval: 1s
    internal: true
    on_value_range:
      - above: 8 #8lux以上 
        then:
          - if:
              condition:
                 lambda: 'return id(auto_open) == true;'
              then:
                #flg on
                - globals.set:
                    id: opening
                    value: 'true'
                # open!
                #Click 応答
                - servo.write:
                    id: servo1
                    level: -40%
                - delay: 500ms
                - servo.write:
                    id: servo1
                    level: 0%
                #Click 開錠
                - servo.write:
                    id: servo2
                    level: -50%
                - delay: 500ms
                - servo.write:
                    id: servo2
                    level: 0%
                - servo.detach: servo2
                #Click 閉じる
                - servo.write:
                    id: servo1
                    level: -40%
                - delay: 500ms
                - servo.write:
                    id: servo1
                    level: 0%
                - servo.detach: servo1
                # auto off
                - globals.set:
                    id: auto_open
                    value: 'false'
                # flg off
                - globals.set:
                    id: opening
                    value: 'false'
              else:
                #flg on
                - globals.set:
                    id: not_opened
                    value: 'true'
                - delay: 500ms
                # flg off
                - globals.set:
                    id: not_opened
                    value: 'false'
                
              
binary_sensor:
  - platform: template
    name: "LobbyDoor not open"
    id: lobbydoor_not_open
    lambda: 'return id(not_opened);'
    
  - platform: template
    name: "LobbyDoor opening"
    id: lobbydoor_opening
    lambda: 'return id(opening);'
    
servo:
  - id: servo1
    output: pwm_output1
    auto_detach_time: 10s
  - id: servo2
    output: pwm_output2
    auto_detach_time: 10s

output:
  - platform: esp8266_pwm
    id: pwm_output1
    pin: GPIO12
    frequency: 50 Hz
  - platform: esp8266_pwm
    id: pwm_output2
    pin: GPIO13
    frequency: 50 Hz

switch:
  - platform: template
    name: Lobbydoor Auto Open
    id: lobbydoor_auto_open
    internal: false
    lambda: 'return id(auto_open);'
    turn_on_action:
      - globals.set:
          id: auto_open
          value: 'true'
    turn_off_action:
      - globals.set:
          id: auto_open
          value: 'false'

使い方

  • Home Assistantからスイッチをオンにして、ロビーから自分の部屋を呼び出す
    • entity: switch.lobbydoor_auto_open
  • 玄関の鍵開けたり⇒センサの変化をトリガーにオートメーションを設定
    • entity: binary_sensor.lobbydoor_opening
  • 不在通知など⇒センサの変化をトリガーにオートメーションを設定
    • entity: binary_sensor.lobbydoor_not_open