Integracja Starego Domofomu z Home Assistant

← Wszystkie wpisy

Mój dom ma stary domofon, który chciałem podpiąć pod Home Assistant, żeby otrzymywać powiadomienia gdy ktoś dzwoni.

Krok 1: Podłączenie domofonu do Home Assistant

Pierwszym wyzwaniem było sprawienie, by HA wykrywał naciśnięcie przycisku domofonu. Domofon chodzi na centrali ZDZP. To stara, analogowa centrala, ale dzięki temu jest na tyle prosta że łatwo samemu coś z nią zakombinować. Wykorzystując stare okablowanie udało mi się doprowadzić bezpośrednie połączenie pomiędzy kasetą domofonu przy furtce i Raspberry Pi na strychu, na którym stoi HA. Gdyby tych przewodów nie było pewnie zrobiłbym to na ESP32.

W moim układzie naciśnięcie przycisku zewnętrznego zamyka obwód i powoduje emisję sygnału dźwiękowego przez wewnętrzny głośnik. Podłączyłem GPIO mojego Raspberry Pi równolegle do tego obwodu. Użyłem optoizolatora, aby oddzielić domofon od RPi, oraz kondensatora i diody do stabilizacji sygnału.

intercom.webp

Następnie skorzystałem z integracji Raspberry Pi Remote GPIO aby udostępnić GPIO w HA. W ten sposób powstała nowa encja, binary_sensor.wywolanie_domofonu, która zmienia stan przy każdym naciśnięciu przycisku. Ostatnim krokiem było stworzenie prostej automatyzacji wysyłającej powiadomienia na telefon.

Krok 2: Automatyczne otwieranie bramy kodem Morse'a

Gdy domofon został zintegrowany z HA, wpadłem na pomysł, by pójść o krok dalej. Ponieważ elektrozaczep furtki miałem już wcześniej podłączony do HA, pomyślałem: czemu nie spróbować otwierać furtki wystukując dzwonkiem sekwencji w stylu kodu Morse'a?

Jeśli ktoś zadzwoni domofonem w określonym wzorze (np. .-.- dla AA), HA rozpozna go i odblokuje furtkę. Ta funkcja okazała się szczególnie przydatna dla dzieci wracających ze szkoły — nie muszą już nosić klucza. Dodatkowo, słysząc kod w głośniku wewnętrznym, mogę łatwo rozróżnić próbę otwarcia od zwykłego wywołania.

Do realizacji tego pomysłu wykorzystałem funkcję Python Scripts w HA, która umożliwia tworzenie skryptów w katalogu <config>/python_scripts/, które następnie można wykorzystać w automatyzacjach.

Oto konfiguracja automatyzacji:

alias: Open the gate using morse code
triggers:
  - entity_id:
      - binary_sensor.wywolanie_domofonu
    trigger: state
conditions:
  - condition: template
    # We give five seconds to enter the code.
    # The automation won't be triggered for 5 secs after initial call.
    # Subsequent button pushes will be handled by the script
    value_template: >-
      {{ (as_timestamp(now()) - as_timestamp(state_attr('automation.gate_morse',
      'last_triggered') | default(0)) | int > 5)}}
    enabled: true
actions:
  - data: {}
    action: python_script.gate_morse
mode: single

I skrypt gate_morse.py:

# Sensor to read data from
SENSOR = "binary_sensor.wywolanie_domofonu"
# Switch to trigger on correct pattern
SWITCH = "switch.furtka_on_off"
# We can have multiple codes. Each code is a list of booleans.
# True means a long signal, False means a short signal.
# For example to encode ".-.-" we need [False, True, False, True]
CODES = [
    [False, True, False, True]
]
# time to enter the code; should be identical as in automation
TIME_WINDOW_SEC = 5

ON = "on"
OFF = "off"
RANGE_DELIM = 20
RESOLUTION = 0.02

def calculate_pattern(states: list[str]) -> list[bool]:
    counter = 0
    collected = []
    for entry in states:
        if entry == ON:
            counter = counter + 1
        else:
            if counter:
                collected.append(counter)
            counter = 0
    if counter:
        collected.append(counter)
    logger.info(collected)
    return [i > RANGE_DELIM for i in collected]

start = time.time()
states = []
while time.time() - start < TIME_WINDOW_SEC:
    states.append(hass.states.get(SENSOR).state)
    time.sleep(RESOLUTION)
received_pattern = calculate_pattern(states)
passed = received_pattern in CODES
logger.info(f"{'OK' if passed else 'FAILED'}, Range: {RANGE_DELIM} recv: {received_pattern}, expected: {CODES}")
if passed:
    hass.services.call("switch", "toggle", {"entity_id": SWITCH}, False)

Podsumowanie

Dlaczego w ogóle się w to bawić, zamiast po prostu kupić nowy domofon WiFi z klawiaturą?

Mam nadzieję, że się podobało. Udanej zabawy z majsterkowaniem!