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ść
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
Dzięki za cenne uwagi @abnvle
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
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
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"]
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.