♾ Własna integracja - 3. Platforma integracji

3. Platforma integracji

:infinity: 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 :wink:

Czy ktoś jest w stanie dodać ikonkę w kodzie? Tak żeby pojawiła się w atrybutach sensora:

3 polubienia

Tak na sucho bez testowania:

from homeassistant.const import DEVICE_CLASS_ENERGY
    @property
    def device_class(self):
        return DEVICE_CLASS_ENERGY