3. Platforma integracji
Własna integracja - 3. Platforma integracji
Teoria
W części trzeciej wprowadzenia do kodowania własnej integracji pokażemy jak nie wymyślać czegoś co jest już dawno wymyślone tylko skorzystać/zaimplementować wzorzec.
Asystent domowy ma kilka wbudowanych integracji, które reprezentują abstrakcyjne typy urządzeń obsługiwanych w systemie. Są to światła (light), przełączniki (switch), zasłony (cover), klimatyzacje (climate), itd.
Chodzi o to, że jeśli budujemy np. Integrację obsługującą światło to bez względu na to czy żarówkę wyprodukował Philips czy Osram potrafi ona to samo - włączać się i wyłączać (ma usługi turn_on i turn_off które należy zaimplementować w naszej integracji).
Nasza integracja ais_hello
też może tworzyć implementację wbudowanych integracji dzięki czemu będzie korzystać/dziedziczyć cechy implementowanych abstrakcyjnych urządzeń.
Sprawdza się to do utworzenia pliku z nazwą domeny integracji którą chcemy zaimplementować.
W naszym przypadku dodaliśmy encje licznik, tego typu encja najbardziej odpowiada platformie czujnik (sensor) który jest jednostką tylko do odczytu, a jej rola to dostarczanie informacji (pokazywanie wartość i opcjonalnie jednostki miary).
Kody
Czyli dodajemy plik sensor.py do naszego folderu integracji.
"""ais hello sensor"""
from homeassistant.const import ENERGY_KILO_WATT_HOUR
from homeassistant.helpers.entity import Entity
from time import time
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the sensor platform."""
liczniki = [1, 2, 3]
for x in liczniki:
add_entities([AisHelloSensor(x, "licznik" + str(x))])
class AisHelloSensor(Entity):
"""Reprezentacja sensora AisHelloSensor."""
def __init__(self, id, name):
"""Inicjalizacja sensora."""
self._id = id
self._name = name
self._state = None
@property
def name(self):
"""Funkcja zwracająca nazwę sensora."""
return self._name
@property
def state(self):
"""Funkcja zwracająca status sensora."""
return self._state
@property
def unit_of_measurement(self):
"""Funkcja zwracająca jednostkę miary sensora."""
return ENERGY_KILO_WATT_HOUR
def update(self):
"""Pobranie aktualnego statusu sensora
"""
# epoch time in seconds
self._state = int(time()) * self._id
Jak widzimy sensor (nasz licznik) ma nazwę, stan, jednostkę.
Wszystko co potrafi to aktualizować swoją wartość metodą update ta metoda nie zwraca jeszcze nic sensownego, tym zajmiemy się w kolejnej części.
Zmieniamy jeszcze plik init.py który teraz będzie miał tylko komentarz - ale plik zostawiamy bo inint.py jest on niezbędny dla pythona:
"""Przykład integracji sensora licznik."""
Ostatnia zmiana to definicja naszej integracji w pliku konfiguracji ~/AIS/configuration.yaml
ponieważ teraz implementujemy platformę sensor definicja integracji wygląda tak:
# ~/AIS/configuration.yaml
sensor:
platform: ais_hello
Jak już mamy nasze nowe kody w repozytorium to czas pobrać je na bramkę i uruchomić, w tym celu w konsoli Asystenta domowego wpisujemy:
cd ~/AIS/custom_components/ais_hello
git pull
restart usługi ais:
pm2 restart ais
Podsumowanie
Po ponownym uruchomieniu systemu mamy już nasze liczniki jako “pełnoprawne sensory” w systemie.
Możemy pytać o ich status, używać ich w automatyzujących wyświetlać w interfejsie, śledzić historię i przedstawiać na wykresie itd.
Istotne jest to, że nie musimy już martwić się o ich odświeżanie, zrobi to za nas system. Wszystko co jeszcze należy zrobić to zaimplementować kod w funkcji update (tak żeby pobierał odczyty licznika) oraz dodać graficzny konfigurator - zajmiemy się tym w kolejnych częściach. Jak będziemy mieli te dwie rzeczy to ostatni punkt to dodanie integracji jako sub modułu do Asystenta domowego - to też opiszemy.
Zadanie domowe
Czy ktoś jest w stanie dodać ikonkę w kodzie? Tak żeby pojawiła się w atrybutach sensora: