Integracja Syngeos

Cześć wszystkim,
Po stworzeniu jednej integracji postanowiłem zabrać się za drugą.
Oto integracja dla stacji jakości powietrza Syngeos konfigurowalna przez interfejs użytkownika. Integracja jest dostępna w HACS po dodaniu niestandardowego repozytorium.

Byłbym wdzięczny za zostawienie gwiazdki na GitHubie oraz informacji w razie wystąpienia problemów lub zapotrzebowania na jakąś brakującą funkcjonalność :smiley:

2 Likes

Cześć,

  • W manifest.json masz:
    “version”: “v0.0.0”
  • Nie walidujesz w ogóle błędów HTTP. Przed response.json() - response.raise_for_status()
  • Nie walidujesz w żaden sposób odpowiedzi API
  • ClientSession powinieneś stworzyć raz w __init__ a teraz masz tak, że każdy krok config flow tworzy nową sesje
  • W sensor.py przekazujesz title to SyngeosSensor, ale po co? Skoro i tak go nie używasz. A oprócz tego np. duplikujesz logikę native_value, available, pressure, air_pressure, pm25, itd
2 Likes

Dzięki za cenne uwagi @abnvle :grinning_face:
Wersja integracji w manifest.json ustawia się automatycznie przez github action do danego wydania, ale w tym przypadku najpierw zrobiłem wydanie, a dopiero potem dodałem action - zaraz to poprawię.
Co do pozostałych punktów to jutro siąde i zrobię poprawki :+1:

To popraw sobie jeszcze:

  • sprawdzaj None przed tym jak iterujesz sensory bo apiData.get("sensors") może zwrócić None i przy for sensor in sensors wywali TypeError

  • popraw też logikę sprawdzania dostępności encji bo masz coś takiego:
    if self.get_sensor_state(apiData.get(“sensors”), “air_pressure”):
    return True
    return False

    Więc, jak sensor = 0 albo pusty to get_sensor_state zwróci false. A jak zwróci false, to encja będzie unavailable pomimo tego, że dane są.

  • zwróć też uwagę, że błędnie typujesz hinty. Dla przykładu: parametr sensors typujesz jako dict a później iterujesz go jako liste - poprawnie byłoby zrobić list[dict[str, Any]]

  • w wyjątkach nie musisz łapać tak szeroko, wystarczy aiohttp i socket

:stuck_out_tongue:

2 Likes

Hej, w aktualizacji 1.0.1 poprawiłem rzeczy wylistowane powyżej :slightly_smiling_face:
Jeśli jeszcze coś można dopracować lub napisać lepiej to proszę o feedback

1 Like

Tak na szybko:
Masz małe Skutki uboczne w getterach (sensor.py) W klasie SyngeosSensor funkcja get_sensor_state jest wywoływana przez właściwość (property) native_value. Wewnątrz tej funkcji modyfikujesz stan obiektu: przypisujesz słownik do self._attr_extra_state_attributes. W HA gettery (takie jak native_value) mogą być wywoływane wielokrotnie i nie powinny mieć skutków ubocznych. Modyfikowanie atrybutów encji podczas odczytu jej wartości to antywzorzec.

PEP 8: Zmienne w Pythonie powinny używać snake_case.

SensorEntityDescription i tłumaczenia (sensor.py): Masz mieszankę kluczy. Czasami definiujesz name="CAQI index", a czasami używasz tylko translation_key . Najlepsze jest usunięcie parametru name całkowicie z i trzymanie nazw (np. “CAQI index”, “Benzene”) w string.json

Typowanie zwrotu metody init: ody __init__ w klasach (jak w SyngeosClient czy encjach) zwracają None. To mi sie podoba

A i dodaj biblotekę geopy do manifest: "requirements": ["geopy==2.4.1"]

1 Like

Fajna integracja, choć sam od kilku lat używam NR i http request aby pobrać dane sensorów z interesującej mnie stacji. Nie wiem jak inni, ale ja skoro już pobieram stan sensora to i od razu jego wartość procent limitu aby od razu widząc kartę wiedzieć o ile przekroczona jest norma.

1 Like

W tej integracji procent normy jest dostępny w atrybucie threshold_level w poszczególnych encjach. Zapomniałem to dopisać do opisu integracji :sweat_smile:

1 Like

Lepiej takie rzeczy wyciągać do encji. Lepiej pracuje się na encjach niż na atrybutach.

1 Like