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

# 要件
* 自宅(賃貸)のオートロックを物理鍵なしで開けたい
* 不在時は訪問者の画像をスマホへ通知したい
* 賃貸なので加工はできない
* インターホンはアイホン株式会社の[VHK-RMA-S](https://www.aiphone.co.jp/data/product_data/item_search_detail.php?prod_no=VHK-RMA-S)

# 検討内容
* インターホン(VHK-RMA-S)をハックしてデータ取得、開錠コマンド送信
    * 解析してる人はいる模様 ([アイ〇ンのプロトコルの話](https://qiita.com/binzume/items/54ea81600ba8cfd4a14b))
    * 火災報知機なども連動しているので、壊したり入居者に迷惑をかけるリスクが高いため却下
* 備え付けのインターホンに、公式のネットワークアダプタを取り付ける
    * [携帯電話アダプターVHW-FMC](https://www.aiphone.co.jp/data/product_data/item_search_detail.php?prod_no=VHW-FMC)を使えば、NWに接続して形態に通知は飛ばせる模様
    * 高すぎ(6万円～9万円)なので却下

# 採用した方法
* 自作
* センサとサーボで物理ボタンを押す
    * 室内のインターホンに明るさセンサをつけて帰宅/来客を検知
    * サーボモータで開錠スイッチを押す。または通知を送信
    * デメリット：インターホンが使いづらい
* 肉厚の両面テープで固定してるので、すぐ原状復帰可能
* コストは5千円以下
* 不在時の訪問者は、画面に表示されてるのをIPカメラで撮影
    * デメリット：画質いまいち
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21931/05515816-d717-7738-4741-2e3a1d3d6600.jpeg">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21931/1f29f31e-53bc-27ce-7424-ac93e1cdabfa.gif">

# 主な部品例
|部品|型番|備考|
|---|---|---|
|マイコン|[ESP-WROOM-02](https://akizukidenshi.com/catalog/g/gM-09607/)|またはシリアル付きのもの|
|ピッチ変換基盤|[ESP-WROOM-02ピッチ変換用基板](https://www.switch-science.com/catalog/2362/)|
|光センサ|[BH1750](https://www.amazon.co.jp/gp/product/B011IGZD7E/)|
|サーボ|[FEETECH FS90](https://www.switch-science.com/catalog/7111/)|
|三端子レギュレータ|[TA48033S](https://akizukidenshi.com/catalog/g/gI-00534/)|
|電源|[5V 1A](https://akizukidenshi.com/catalog/g/gM-06096/)|5Wあれば十分
|ケース|お好みのもの|
|WROOM-02のライタ|お好みのもの|マイコンがシリアル付きなら不要|

# 配線
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21931/732a0695-565a-7633-a74b-5a2819b619f8.png">



# ESPHomeの設定
```yaml
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