Sterbox integracja z Home Assistant – wprowadzenie

Autor: Marcin Owczarek


Przedstawiamy nadesłany opis – wstęp do integracji sterownika Sterbox z Home Assistant

 

Wstęp

Integracja pomiędzy sterbox, a home assistant odbywa się za pomocą restfull commands:
https://www.home-assistant.io/integrations/rest_command/

 

API – rest commands

Sterbox ma dostępną opcję sterowania poprzez requesty http – szczegóły u producenta. Dzięki temu, za pomocą restfull command możemy zmieniać stan oraz odczytywać status wyjść/wejść logicznych i analogowych. Pozwala to na pełne sterowanie sterboxem – także głosowe (np HA AI Speaker brama deweloperska z wbudowanym asystentem głosowym działającym offline).

https://allegro.pl/oferta/pierwszy-polski-inteligentny-asystent-ai-speaker-8269043586

Większość konfiguracji musimy umieścić w pliku HA configuration.yaml

Przykład czujnika bazującego na wyjściu analogowym (jeśli posiadasz hasło, składnia wymaga dodatkowych parametrów):
sensor:
- platform: rest
name: Predkosc wiatru
unit_of_measurement: "km/h"
resource: http://192.168.1.182/@gca?wind
value_template: "{{ value | replace(',', '.') }}"
scan_interval: 1

Powyższy przykład to odczytywanie wartości z czujnika wiatru z sygnałem 0-3V, odpowiednie przeliczniki zostały ustawione już na sterbox.

Dodatkowo warto dać filtr aby ustabilizować wykresy:
- platform: filter
name: Filtr predkosci wiatru
entity_id: sensor.predkosc_wiatru
filters:
- filter: outlier
window_size: 30
radius: 4.0
- filter: lowpass
time_constant: 60
precision: 2

Wykres:

 

 

entities:
- entity: sensor.filtr_predkosci_wiatru
name: Prędkość wiatru
- entity: sensor.filtr_predkosci_wiatru_w_porywach
name: Prędkość wiatru w porywach
hours_to_show: 1
refresh_interval: 0
title: Prędkość wiatru
type: history-graph

Dla wyjść logicznych warto użyć binary sensor:

binary_sensor:
- platform: rest
name: Status elektrozaczepu drzwi wejsciowych
resource: http://192.168.1.182/@gcd?acredrzwi
scan_interval: 1

Graficzny obiekt:

 

entities:
- entity: binary_sensor.status_elektrozaczepu_drzwi_wejsciowych
show_header_toggle: false
title: Elektrozaczep
type: entities

Zmianę stanu możemy realizować poprzez przełączenie na stan przeciwny (2), 0 lub 1.
W tym celu musimy zdefiniować commendy w pliku:
Np:

rest_command:
ustawianie_wilgotnosci: [w tym przypadku zadajemy wartość analogową]
url: "http://192.168.1.182/@sca?wilg_1={{ states('input_number.wilgotnosc_ustawiona_input') }}"
otwieranie_drzwi:
url: 'http://192.168.1.182/@scd?dwczyt3=2'
refleksol_salon_poludnie_down:
url: 'http://192.168.1.180/@scd?dsrpdow2=2'
refleksol_salon_poludnie_up:
url: 'http://192.168.1.180/@scd?dsrpup2=2'
refleksol_salon_zachod_down:
url: 'http://192.168.1.180/@scd?dsrzdow2=2'
refleksol_salon_zachod_up:
url: 'http://192.168.1.180/@scd?dsrzup2=2'
refleksol_jadalnia_poludnie_down:
url: 'http://192.168.1.180/@scd?djrpdow2=2'
refleksol_jadalnia_poludnie_up:
url: 'http://192.168.1.180/@scd?djrpup2=2'
refleksol_jadalnia_wschod_down:
url: 'http://192.168.1.180/@scd?djrwdow2=2'
refleksol_jadalnia_wschod_up:
url: 'http://192.168.1.180/@scd?djrwup2=2'

Warto od razu dodać script dla rest command. Rest command nie w każdym wypadku zadziała bezpośrednio:

refleksol_salon_poludnie_down_script:
sequence:
service: rest_command.refleksol_salon_poludnie_down
refleksol_salon_poludnie_up_script:
sequence:
service: rest_command.refleksol_salon_poludnie_up
refleksol_salon_zachod_down_script:
sequence:
service: rest_command.refleksol_salon_zachod_down
refleksol_salon_zachod_up_script:
sequence:
service: rest_command.refleksol_salon_zachod_up
refleksol_jadalnia_poludnie_down_script:
sequence:
service: rest_command.refleksol_jadalnia_poludnie_down

Przykładowy przycisk:

 

Przy integracji pojawia się sporo niuansów – szczególnie, gdy daną czynnością steruje także inne urządzenie wejściowe typu klawisz.
Dlatego do zmiany stanów najlepiej używać buforów. Pozwala to na sterowanie z kilku wejść tą samą zmienną w sterbox.

Na ten moment nie udało mi się uruchomić restcommand switcha, ale do sterowania wraz ze zmianą statusu można użyć np elementów warunkowych.
Definiujemy binary sensor do sprawdzenia statusu np światła. Potem definiujemy 2 przyciski z warunkowym wyświetlaniem, czyli wyświetlaj przycisk włącz światło jeśli sensor jest off i odwrotnie.
Dzięki temu status w HA zmieni się automatycznie po zmianie i nie będziemy zapalali światła już zapalonego. Dodatkowo można sobie zrobić listę z czujnikami wyświetlającymi interesujące nas wyjścia.

Powyższe informacje powinny wystarczyć do startu przygody z HA. Cała pozostała zabawa, to stricte konfiguracja automatyzacji na poziomie HA, które ma bardzo dobrą dokumentację i społeczności.
W przypadku AI Speaker jest także grupa dyskusyjna dotycząca bramki.

Samo HA daje ogromne możliwości integracji w jednym miejscu sterboxa oraz wielu innych urządzeń – sonoff, ESP home, xiaomi i wiele, wiele innych – typu fotowoltaika, modbus itp.

Przykładowy panel sterowania oparty o integrację ze sterbox:

 

Sensory – obciążenie sterboxa

Rest api jest proste i pozwala łatwo sterować każdym wyjściem sterboxa, a także zmiennymi w pamięci sterbox. Niestety do odczytu sensorów o wysokiej dostępności może przysporzyć propelymy wydajnościowe. Każdy sensor skanowany co 1 sekunde pomnożony przez np 50 czy 60 daje 60 requestów co sekundę, 3600 co minutę itd. Co prawda są to małe ilości danych, ale częstotliwość powoduje niepotrzebny ruch sieciowy oraz obciążenie obu urządzeń – HA i sterboxa. Dostałem informację, że u niektórych pojawił się problem wydajnościowy sterbox (u siebie nie zaobserwowałem).

Niestety nie ma innej alternatyywy integracji i jedyna możliwośc to przeniesienie obciążenia na HA z minimalizacją ruchu sieciowego. Takie rozwiązanie nadal nie jest eleganckie, ale odciąża częściowo sterboxa.

A konkretnie zamiast używać rest command do sensorów, użyjemy command_line i curl-a, który co sekundę odczyta stany wszystkich sesnorów do pliku, a potem poszczególne sensory będą czytały z pliku.

- platform: command_line
name: Sterbox1
command: 'curl "http://192.168.1.180/@gca?fspeed&@gcd?dsssli1&@gcd?dssslig1&@gcd?dstvlig1&@gcd?dglig&@gcd?klig1" | tee /data/data/pl.sviete.dom/files/home/AIS/sterbox1'
scan_interval: 1
- platform: command_line
name: Predkosc wentylatora okapu
unit_of_measurement: B
command: "/data/data/pl.sviete.dom/files/home/AIS/command_sensor/predkosc_wentylatora_okapu"
value_template: "{{ value | replace(',', '.') }}"
- platform: command_line
name: Oswietlenie sufitu salon jadalnia
command: "awk -F'`' '{print $2}' /data/data/pl.sviete.dom/files/home/AIS/sterbox1"
scan_interval: 1
- platform: command_line
name: Oswietlenie dookola sufitu
command: "/data/data/pl.sviete.dom/files/home/AIS/command_sensor/oswietlenie_dookola_sufitu"
scan_interval: 1
- platform: command_line
name: Oswietlenie za TV salon
command: "awk -F'`' '{print $3}' /data/data/pl.sviete.dom/files/home/AIS/sterbox1"
scan_interval: 1
- platform: command_line
name: Oswietlenie zyrandol gabinet
command: "awk -F'`' '{print $5}' /data/data/pl.sviete.dom/files/home/AIS/sterbox1"
scan_interval: 1
- platform: command_line
name: Oswietlenie spizarni
command: "awk -F'`' '{print $6}' /data/data/pl.sviete.dom/files/home/AIS/sterbox1"
scan_interval: 1

Poniżej moja konfiguracja dotycząca sterboxa. W pliku yaml każda spacja oraz tabulacja ma znaczenie!
Na ten moment nie przepisałem jeszcze sensorów na command_line, więc są tam rest i command.

Pobierz YAML

Więcej o sterowaniu głosowym, konfiguracji bramki AIS znajdziecie tutaj:
http://ai-speaker.com/