본문 바로가기
서버/리눅스 서버

HASS 디바이스 트래커 설정

by 도정진 ㅋㅋ잠자 2020. 5. 24.

안녕하세요? 


이제 자동화를 해보기 위해서 노력을 하고 있습니다.


일단 자동화를 생각해본 것이 아래와 같습니다.





1. 자동화


1) 온수 자동화


샤오미 조도 센서를 통해 화장실에 불이 감지되면 보일러 외출모드 설정


실제로, 화장실 등 스위치를 직비로 했다면, 쉽게 자동화가 가능하겠지만, 제 집의 스위치가 특이하게 생겨서.. 그리고 제 집이 아니라서 뜯지를 않았습니다. 그래서 조도 센서를 통해서 자동화 하려고 마음 먹었네요.


2) 재실 센서


재실을 감지하기 위해서 nmap 을 쓰거나 위치 기반으로 하거나 혹은 블루투스로 가능할 것 같았습니다.


그런데 nmap 으로 하기에는 조금 배터리에 문제가 있어서...  그래서 아무래도 블루투스를 통해서 재실을 감지하는게 좋을 것 같았습니다.


3) 에어컨 자동화


특정 습도, 특정 온도에 대해서 온도 조절이 되고, 실제로 켜고 끄는 부분은 27도로 고정으로 설정해 두었습니다.


이번에는 디바이스 트래커를 통해 불을 켜고 끄는 등의 자동화를 만들어 보겠습니다.





2. 위치 트래커


위치로 트래킹 하면 아래와 같이 나옵니다.



실제로 지금 집에 있음에도 불구하고 위치가 튀어서 상기처럼 외출로 설정이 되어 버렸습니다.


그래서 아무래도.. 와이파이 연결을 사용해 보기로 합니다.





3. nmap 트래커


일단 configuration.yaml 에 아래와 같이 등록합니다.


물론 아이피를 공유기에서 고정으로 해주셔야합니다.


124 device_tracker:

125   - platform: nmap_tracker

126     hosts:

127       - 192.168.0.62

128     home_interval: 1


그러면, HASS 에서 아래와 같이 확인이 됩니다.



그럼 이를 기반으로 자동화를 하나 생성해봅니다.





4. 자동화 생성


자동화는 트리커 / 상태 / 액션 3가지로 나뉩니다.


생각을 해보면, 트리거만 있으면 될 것 같은데 왜 상태까지 있어야 하는지에 대한 부분이 있었는데요. 상태 체크 없이 그냥 트리거에만 의존하게 되면 오동작을 할 가능성이 높아지기 때문인것 같습니다.


그리고 실제로 설정할 때, 컨디션에 값을 넣지 않아도 문제가 없지만, 저는 아래와 같이 디바이스 트래커의 상태를 한번 더 체크하도록 설정하였습니다.


참고로, or and 설정이 가능하고, 관련 문서는 https://www.home-assistant.io/docs/automation/examples/ 를 참고하시길 바랍니다.


켜기 끄기의 경우 대부분 서비스 호출을 하게 되며, HASS 에서는 각기 스위치 / 라이트 / FAN / 센서 로 그루핑을 하고 있기 때문에 하기와 같이 호출을 해주셔야합니다.


service: switch.turn_off

entity_id: switch.airconditioner


스위치 오프에 오프할 대상 기기를 엔티티에 적어주셔야 합니다.


# 집에 없을 때

- id: '1590309009649'

  alias: away_home

  description: ''

  trigger:    # 트리거 : 와이파이 트래커가 home --> not_home 으로 바뀔때

  - entity_id: device_tracker.8e_0b_14

    for: 00:00:30    # 감지되고 30초 뒤에 액션이 시작됩니다.

    from: home

    platform: state

    to: not_home

  condition:    # 상태 : 와이파이 트래커가 not_home 일때

  - condition: state

    entity_id: device_tracker.8e_0b_14

    state: not_home

  action:        # 하기 액션들을 실행

  - data: {}

    entity_id: switch.airconditioner

    service: switch.turn_off

  - data: {}

    entity_id: switch.boiler_bath_onoff

    service: switch.turn_off

  - data: {}

    entity_id: switch.ilgwalsodeung

    service: switch.turn_on

  - data: {}

    entity_id: switch.elribeiteo

    service: switch.turn_on

  - data: {}

    entity_id: fan.seonpunggi

    service: fan.turn_off

  - data: {}

    entity_id: fan.xiaomi_air_purifier_2s

    service: fan.turn_off

  - data: {}

    entity_id: switch.dawondns_b540_w_

    service: switch.turn_off



- alias: at_home

  description: ''

  trigger:

  - entity_id: device_tracker.8e_0b_

    for: 00:00:1

    from: not_home

    platform: state

    to: home

  condition:

  - condition: state

    entity_id: device_tracker.8e_0b_

    state: home

  action:

  - data: {}

    entity_id: switch.airconditioner

    service: switch.turn_on

  - data: {}

    entity_id: switch.boiler_bath_onoff

    service: switch.turn_off

  - data: {}

    entity_id: switch.ilgwalsodeung

    service: switch.turn_off

  - data: {}

    entity_id: switch.elribeiteo

    service: switch.turn_off

  - data: {}

    entity_id: fan.seonpunggi

    service: fan.turn_on

  - data: {}

    entity_id: fan.xiaomi_air_purifier_2s

    service: fan.turn_on


그러면 와이파이 연결이 되면 거진 5초내에 자동화가 실행되고, 와이파이 연결이 끊기면 3분 정도 내에 자동화가 실행됩니다.


서비스들을 한곳에 묶어서 아래와 같이 작성도 가능합니다.


- id: '1590309009649'

  alias: away_home

  description: ''

  trigger:

  - entity_id: device_tracker.8e_0b_

    for: 00:00:30

    from: home

    platform: state

    to: not_home

  condition:

  - condition: state

    entity_id: device_tracker.8e_0b_

    state: not_home

  action:

  - service: switch.turn_off

    data:

      entity_id:

        - switch.airconditioner

        - switch.boiler_bath_onoff

        - switch.dawondns_b540_w_


  - service: switch.turn_on

    data:

      entity_id:

        - switch.ilgwalsodeung

  - service: fan.turn_off

    data:

      entity_id:

        - fan.seonpunggi

        - fan.xiaomi_air_purifier_2s

- alias: at_home

  description: ''

  trigger:

  - entity_id: device_tracker.8e_0b_

    for: 00:00:1

    from: not_home

    platform: state

    to: home

  condition:

  - condition: state

    entity_id: device_tracker.8e_0b_

    state: home

  action:

  - service: switch.turn_on

    data:

      entity_id:

        - switch.airconditioner

        - switch.boiler_bath_onoff

  - service: switch.turn_off

    data:

      entity_id:

        - switch.ilgwalsodeung

  - service: fan.turn_on

    data:

      entity_id:

        - fan.seonpunggi

        - fan.xiaomi_air_purifier_2s




5. 블루투스 자동화 설정


아무래도 와이파이에 ACK 를 보내기 때문에 핸드폰이 깨어나는 단점이 있습니다.


그리고 와이파이를 꺼두는 경우도 있어서, 항상 샤오미 GTR 과 연동중인 블루투스를 이용해서 해보기로 했습니다.


물론, 휴대폰이 아니더라도, 시계로만으로도 재실을 판단할 수 있습니다.


일단 armbian 에서 블루투스가 동작되는지 아래와 같이 테스트를 해봤습니다.


root@aml:/opt/hass/config# bluetoothctl

Agent registered

[bluetooth]# scan on

Discovery started

[CHG] Controller AA:AA:AA:AA:AA:AA Discovering: yes

[NEW] Device C8:0F:10:C3:34:FA MI_SCALE

[NEW] Device A4:50:46:0C:37:F0 A4-50-46-0C-37-F0

[CHG] Device A4:50:46:0C:37:F0 Name: Pocophone F1

[CHG] Device A4:50:46:0C:37:F0 Alias: Pocophone F1

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 00001105-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 0000110a-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 0000110c-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 00001112-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 00001115-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 00001116-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 0000111f-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 0000112d-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 0000112f-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 00001200-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 00001132-0000-1000-8000-00805f9b34fb

[CHG] Device A4:50:46:0C:37:F0 UUIDs: 00000000-0000-0000-0000-000000000000

[CHG] Device C8:0F:10:C3:34:FA RSSI: -72

[CHG] Device C8:0F:10:C3:34:FA RSSI: -64

[bluetooth]#


오 잘 보입니다.


이 부분을 HA에 등록해 보겠습니다.


일단 디바이스 넘버를 확인해보면 1로 나오네요.


root@aml:/dev# hcitool dev

Devices:

        hci1    AA:AA:AA:AA:AA:AA


그리고 configuration.yaml 에 등록합니다.


device_tracker:

  - platform: bluetooth_tracker

    device_id: 1


그런데 결과적으로 하기의 에러 로그가 뜨면서 작동이 안되었습니다. 실제로 docker 내부에서도 장치가 감지되고 있기 때문에 별 문제가 없을 것이라고 생각했는데요.


docker 컨테이너라서 device 를 패쓰쓰루 해줘야 작동이 될것으로 보입니다.


2020-05-24 21:30:51 ERROR (MainThread) [homeassistant.components.bluetooth_tracker.device_tracker] Error looking up Bluetooth device

Traceback (most recent call last):

  File "/usr/local/lib/python3.7/site-packages/bluetooth/bluez.py", line 31, in discover_devices

    lookup_class=lookup_class, device_id=device_id)

_bluetooth.error: (4, 'Interrupted system call')


During handling of the above exception, another exception occurred:


Traceback (most recent call last):

  File "/usr/src/homeassistant/homeassistant/components/bluetooth_tracker/device_tracker.py", line 140, in perform_bluetooth_update

    devices = await hass.async_add_executor_job(discover_devices, device_id)

  File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run

    result = self.fn(*self.args, **self.kwargs)

  File "/usr/src/homeassistant/homeassistant/components/bluetooth_tracker/device_tracker.py", line 62, in discover_devices

    device_id=device_id,

  File "/usr/local/lib/python3.7/site-packages/bluetooth/bluez.py", line 34, in discover_devices

    raise BluetoothError ("error communicating with local "


일단은, 상기 에러를 해결하려면 컨테이너를 새로 생성하고 오래 기다려야 해서, 다음에 한번 시도해 보아야겠습니다.



간단하게 여기서 마치겠습니다.


감사합니다.






댓글0