Jeśli chcesz posiadać informacje o jakości powietrza w Twojej okolicy, ale nie masz jeszcze odpowiednich czujników lub chcesz porównywać dane z własnych czujników z tymi dostępnymi w Internecie, to ten tutorial może Ci pomóc.
Dane o jakości powietrza będą odczytywane z popularnego w Polsce serwisu Airly.
Odczytywane będą:
- Index jakości powietrza: CAQI
- Poziom zanieczyszczenia powietrza
- Opis poziomu zanieczyszczenia powietrza
- Poziom pyłków zawieszonych PM1, PM2.5, PM10
- Poziom zanieczyszczenia w skali opracowanej przez Międzynarodową Organizację Zdrowia (WHO)
- Temperaturę, Ciśnienie, Wilgotność
W Airly mamy 3 możliwości odczytów danych
- odczyt z najbliższego czujnika znajdującego się w pobliżu naszej lokalizacji
- odczyt uśredniony z kilku czujników w okolicy na podstawie naszej odległości
- odczyt danych z konkretnego czujnika
W tym opisie przedstawię jak odczytać dane z konkretnego czujnika.
Co będziemy robić?
- Zakładamy konto w serwisie Airly, aby otrzymać unikalny klucz, który umożliwia odczyt danych
- Określamy naszą lokalizację: szerokość i długość geograficzną
- Wyszukujemy najbliższy dla naszej lokalizacji czujnik Airly
- Instalujemy i konfigurujemy w openHab odpowiednie dodatki
- Dodajemy elementy (Items) w openHab
- Dodajemy plik z transformacjami
- Konfigurujemy SiteMap'ę
Na koniec otrzymamy takie coś: YouTube
No to zaczynamy
Zakładamy konto w serwisie Airly, aby otrzymać unikalny klucz, który umożliwia odczyt danych
- Wchodzimy na stronę Airly i rejestrujemy własne konto
- Po zarejestrowaniu konta oraz zalogowaniu się do serwisu klucz API jest już dla nas dostępny. Znajduje się on po prawej stronie w żółtej ramce. Klucz pokaże się, gdy klikniemy ten wyświetlony tekst
- Klucz będzie wykorzystywany w dalszej części. Będę go nazywał AIRLY_API_KEY
Określamy naszą lokalizację: szerokość i długość geograficzna
- Korzystamy np. z serwisu https://www.wspolrzedne-gps.pl/
- Wprowadzamy adres w formacie: ulica nr domu, kod pocztowy, miejscowość, kraj
- Po wciśnięciu przycisku Uzyskaj współrzędne GPS adres zostanie odszukany, a współrzędne geograficzne zostaną pokazane na mapie. Możemy przesunąć punkt na mapie, aby jeszcze doprecyzować nasz adres, jeśli będzie taka potrzeba
- Zapisujemy współrzędne do wykorzystania w kolejnych krokach
- LAT - jako szerokość geograficzna,
- LNG - długość geograficzna
Wyszukujemy najbliższy dla naszej lokalizacji czujnik Airly
- Mając już AIRLY_API_KEY, LAT, LNG jesteśmy w stanie wyszukać najbliższy czujnik Airly
- Konstruujemy adres URL, który wkleimy do przeglądarki
Format URL jest następujący:
https://airapi.airly.eu/v2/installations/nearest?lat= LAT&lng=LNG&maxDistanceKM=10&maxResults=3&apikey=AIRLY_API_KEY
- W niebieskich wpisujemy odpowiednio nasze uzyskane wczesniej szerokość / długość geograficzną oraz klucz Airly
- Czerwone możemy w zależności od potrzeb zmodyfikować
- DistanceKM - maksymalna odległość czujników od naszej lokalizacji w kilometrach - tutaj 10
- maxResult - ile czujników ma odszukać w ramach naszej lokalizacji i odległości - tutaj 3 czujniki
- Po spreparowaniu adresu URL wklejamy go do przeglądarki
- Powinniśmy uzyskać listę wszystkich dostępnych czujników w ramach naszej lokalizacji oraz wprowadzonej odległości
- W niebieskiej ramce opisany jest każdy z czujników. To co musimy zrobić to wybrać jeden z nich patrząc po adresach.
- Po wybraniu jednego z nich zapisujemy jego id - dalej bedę używał SENSOR_ID
Instalujemy i konfigurujemy w openHab odpowiednie dodatki
- W openHab instalujemy Binding: HTTP Binding i Transformacje: JSONPath oraz MAP Transformation
- Ja wykorzystuję do tego PaperUI
- Instalacja: HTTP Binding
- Instalacja JSONPath oraz MAP Transformation
- Konfigurujemy teraz HTTP Binding
- Przygotowujemy URL, format
https://airapi.airly.eu/v2/measurements/installation?installationId= SENSOR_ID&apikey=AIRLY_API_KEY
- Żeby sprawdzić, czy zrobiliśmy adres poprawnie, wklejamy go do przeglądarki. Jeśli jest OK powinniśmy otrzymać coś takiego
- Konstruujemy dwa parametry, które wpiszemy do konfiguracji HTTP Binding
airly.url= https://airapi.airly.eu/v2/measurements/installation?installationId= SENSOR_ID&apikey=AIRLY_API_KEY
airly.updateInterval=120000
airly.updateInterval określa jak często mają być odczytywane dane z czujnika. Wartość jest w milisekundach czyli 120000 - oznacza 2min
Z sewisu Airly można
- odczytać maksymalnie 1000 razy dziennie dane z czujników - więc odczyty co 2min będą zupełnie okay.
- odczyty to średnia wartość z ostatniej godziny.
Parametry: airly.url, airly.updateInterval wpisujemy do pliku konfiguracyjnego http.cfg znajdującego się w katalogu
/etc/openhab2/services
lub z wykorzystaniem PaperUI
- wchodzimy w konfigurację HTTP Binding
- uruchamiamy konfigurację w trybie eksperta
- dodajmy parametry konfiguracyjne
- dodajemy 2 parametry airly.url oraz airly.updateInterval i zapisujemy wciskając przycisk Save
Dodajemy elementy (Items) w openHab
- Dodajemy plik airly.items w katalogu /etc/openhab2/items
- W pliku mamy
Group:Number:AVG average_outside_pm Number airly_quality_index "Index [%.0f]" <air_caqi> {http="<[airly:120000:JSONPATH($.current.indexes[?(@.name=='AIRLY_CAQI')].value)]"} String airly_quality_description "Opis [%s]" <air_caqi> {http="<[airly:120000:JSONPATH($.current.indexes[?(@.name=='AIRLY_CAQI')].description)]"} String airly_quality_level "Jakośc powietrza [MAP(airly.map):%s]" <air_caqi> {http="<[airly:120000:JSONPATH($.current.indexes[?(@.name=='AIRLY_CAQI')].level)]"} String airly_quality_level_raw "Jakośc powietrza [%s]" <air_caqi> {http="<[airly:120000:JSONPATH($.current.indexes[?(@.name=='AIRLY_CAQI')].level)]"} Number airly_pm1 "PM1 [%.2f µg/m3]" (average_outside_pm) {http="<[airly:120000:JSONPATH($.current.values[?(@.name=='PM1')].value)]"} Number airly_pm25 "PM2.5 [%.2f µg/m3]" <air_pm25> (average_outside_pm) {http="<[airly:120000:JSONPATH($.current.values[?(@.name=='PM25')].value)]"} Number airly_pm10 "PM10 [%.2f µg/m3]" <air_pm10> (average_outside_pm) {http="<[airly:120000:JSONPATH($.current.values[?(@.name=='PM10')].value)]"} Number airly_pressure "Ciśnienie [%.0f hPa]" <my_pressure> {http="<[airly:120000:JSONPATH($.current.values[?(@.name=='PRESSURE')].value)]"} Number airly_humidity "Wilgotnośc [%.2f %%]" <humidity> {http="<[airly:120000:JSONPATH($.current.values[?(@.name=='HUMIDITY')].value)]"} Number airly_temperature "Temperatura [%.2f °C]" <temperature> {http="<[airly:120000:JSONPATH($.current.values[?(@.name=='TEMPERATURE')].value)]"} Number airly_pm25_who "PM2.5 [%.0f %%]" <air_pm25> {http="<[airly:120000:JSONPATH($.current.standards[?(@.pollutant=='PM25')].percent)]"} Number airly_pm10_who "PM10 [%.0f %%]" <air_pm10> {http="<[airly:120000:JSONPATH($.current.standards[?(@.pollutant=='PM10')].percent)]"} Number chart_airly_avarage_outside_pm "" <my_period> Number chart_airly_pm1 "" <my_period> Number chart_airly_pm25 "" <my_period> Number chart_airly_pm10 "" <my_period>
Dodajemy plik z transformacjami
- w katalogu /etc/opnahb2/transform dodajemy plik o nazwie airly.map z następującą treścią:
VERY_LOW=Doskonała LOW=Dobra MEDIUM=Umiarkowana HIGH=Dostateczna VERY_HIGH=Zła EXTREME=Bardzo zła -=Brak danych
Konfigurujemy SiteMap'ę
- W istniejącym pliku SiteMap dodajemy (lub dodajemy nowy)
Frame label="CAQI" { Text item=airly_quality_index valuecolor=[>=150="#800080",>=125="#990000",>=100="#E40000",>=75="#E48100",>=50="#FFD912",>=25="#B0DD10",>=0="#58B109"] Text item=airly_quality_description valuecolor=[airly_quality_index>=150="#800080",airly_quality_index>=125="#990000",airly_quality_index>=100="#E40000",airly_quality_index>=75="#E48100",airly_quality_index>=50="#FFD912",airly_quality_index>=25="#B0DD10",airly_quality_index>=0="#58B109"] Text item=airly_quality_level valuecolor=[airly_quality_index>=150="#800080",airly_quality_index>=125="#990000",airly_quality_index>=100="#E40000",airly_quality_index>=75="#E48100",airly_quality_index>=50="#FFD912",airly_quality_index>=25="#B0DD10",airly_quality_index>=0="#58B109"] } Frame label="Normy WHO" { Text item=airly_pm25_who Text item=airly_pm10_who } Frame label="Pyłki" { Text item=airly_pm1 valuecolor=[>150="#800080",>110="#990000",>80="#E40000",>50="#E48100",>25="#FFD912",>10="#B0DD10",>=0="#58B109"] { Switch item=chart_airly_pm1 mappings=[0="1H",1="4H",2="8H",3="1D",4="3D",5="1T",6="1M",7="4M",8="1R"] Chart item=airly_pm1 period=h refresh=60000 visibility=[chart_airly_pm1==0] service="influxdb" Chart item=airly_pm1 period=4h refresh=60000 visibility=[chart_airly_pm1==1] service="influxdb" Chart item=airly_pm1 period=8h refresh=60000 visibility=[chart_airly_pm1==2] service="influxdb" Chart item=airly_pm1 period=D refresh=60000 visibility=[chart_airly_pm1==3] service="influxdb" Chart item=airly_pm1 period=3D refresh=3600000 visibility=[chart_airly_pm1==4] service="influxdb" Chart item=airly_pm1 period=W refresh=3600000 visibility=[chart_airly_pm1==5] service="influxdb" Chart item=airly_pm1 period=M refresh=3600000 visibility=[chart_airly_pm1==6] service="influxdb" Chart item=airly_pm1 period=4M refresh=3600000 visibility=[chart_airly_pm1==7] service="influxdb" Chart item=airly_pm1 period=Y refresh=3600000 visibility=[chart_airly_pm1==8] service="influxdb" } Text item=airly_pm25 valuecolor=[>200="#800080",>150="#990000",>110="#E40000",>55="#E48100",>30="#FFD912",>15="#B0DD10",>=0="#58B109"] { Switch item=chart_airly_pm25 mappings=[0="1H",1="4H",2="8H",3="1D",4="3D",5="1T",6="1M",7="4M",8="1R"] Chart item=airly_pm25 period=h refresh=60000 visibility=[chart_airly_pm25==0] service="influxdb" Chart item=airly_pm25 period=4h refresh=60000 visibility=[chart_airly_pm25==1] service="influxdb" Chart item=airly_pm25 period=8h refresh=60000 visibility=[chart_airly_pm25==2] service="influxdb" Chart item=airly_pm25 period=D refresh=60000 visibility=[chart_airly_pm25==3] service="influxdb" Chart item=airly_pm25 period=3D refresh=3600000 visibility=[chart_airly_pm25==4] service="influxdb" Chart item=airly_pm25 period=W refresh=3600000 visibility=[chart_airly_pm25==5] service="influxdb" Chart item=airly_pm25 period=M refresh=3600000 visibility=[chart_airly_pm25==6] service="influxdb" Chart item=airly_pm25 period=4M refresh=3600000 visibility=[chart_airly_pm25==7] service="influxdb" Chart item=airly_pm25 period=Y refresh=3600000 visibility=[chart_airly_pm25==8] service="influxdb" } Text item=airly_pm10 valuecolor=[>350="#800080",>280="#990000",>180="#E40000",>90="#E48100",>50="#FFD912",>25="#B0DD10",>=0="#58B109"] { Switch item=chart_airly_pm10 mappings=[0="1H",1="4H",2="8H",3="1D",4="3D",5="1T",6="1M",7="4M",8="1R"] Chart item=airly_pm10 period=h refresh=60000 visibility=[chart_airly_pm10==0] service="influxdb" Chart item=airly_pm10 period=4h refresh=60000 visibility=[chart_airly_pm10==1] service="influxdb" Chart item=airly_pm10 period=8h refresh=60000 visibility=[chart_airly_pm10==2] service="influxdb" Chart item=airly_pm10 period=D refresh=60000 visibility=[chart_airly_pm10==3] service="influxdb" Chart item=airly_pm10 period=3D refresh=3600000 visibility=[chart_airly_pm10==4] service="influxdb" Chart item=airly_pm10 period=W refresh=3600000 visibility=[chart_airly_pm10==5] service="influxdb" Chart item=airly_pm10 period=M refresh=3600000 visibility=[chart_airly_pm10==6] service="influxdb" Chart item=airly_pm10 period=4M refresh=3600000 visibility=[chart_airly_pm10==7] service="influxdb" Chart item=airly_pm10 period=Y refresh=3600000 visibility=[chart_airly_pm10==8] service="influxdb" } Switch item=chart_airly_avarage_outside_pm mappings=[0="1H",1="4H",2="8H",3="1D",4="3D",5="1T",6="1M",7="4M",8="1R"] Chart item=average_outside_pm period=h refresh=60000 visibility=[chart_airly_avarage_outside_pm==0] service="influxdb" Chart item=average_outside_pm period=4h refresh=60000 visibility=[chart_airly_avarage_outside_pm==1] service="influxdb" Chart item=average_outside_pm period=8h refresh=60000 visibility=[chart_airly_avarage_outside_pm==2] service="influxdb" Chart item=average_outside_pm period=D refresh=60000 visibility=[chart_airly_avarage_outside_pm==3] service="influxdb" Chart item=average_outside_pm period=3D refresh=3600000 visibility=[chart_airly_avarage_outside_pm==4] service="influxdb" Chart item=average_outside_pm period=W refresh=3600000 visibility=[chart_airly_avarage_outside_pm==5] service="influxdb" Chart item=average_outside_pm period=M refresh=3600000 visibility=[chart_airly_avarage_outside_pm==6] service="influxdb" Chart item=average_outside_pm period=4M refresh=3600000 visibility=[chart_airly_avarage_outside_pm==7] service="influxdb" Chart item=average_outside_pm period=Y refresh=3600000 visibility=[chart_airly_avarage_outside_pm==8] service="influxdb" } Frame label="Warunki atmosferyczne" { Text item=airly_pressure Text item=airly_humidity valuecolor=[>80="navy",>60="blue",>40="green",>20="olive",<=20="red"] Text item=airly_temperature valuecolor=[>35="red",>31="maroon",>27="orange",>20="green",>12="teal",>7="olive",>0="navy",<=0="blue"] }
I to powinno być już wszystko.
Jeśli coś będzie niejasne do dajcie znać - dopiszę, poprawię.
Tutaj do ściągnięcia są pliki openHab - dla leniwych 😉
Uwaga: w instrukcji nie opisuję, jak zapisywać dane do bazy danych w OH2 na potrzeby rysowania wykresów. Jest wiele różnych mechanizmów. Zapraszam na Forum Smart'ny Dom jeśli nie będziesz wiedzieć jak.
Zainspirowałeś mnie @adrian , musze to ogarnąć w Domoticzu 🙂
Wyświetlam dane w OH z Airly już od zeszłego roku. Trochę w inny sposób, bo przez skrypty PHP. Teraz mając swój czujnik pyłków porównuję dane z Airly(450m do czujnika) i bardzo ładnie się to pokrywa. W sumie dlaczego miało by to się nie pokrywać, skoro w Airly używają tak samo chińskich sensorów jak ja. Nie patrzę na te cyferki ze strachem w oczach czy telefonem w ręce. Daje to ogólny zarys tego czym oddychamy i czy opłaca się w danym momencie wietrzyć dom, żeby potem wszystko nie śmierdziało.
W aplikacji działa ok, a jak to pokazać w PaperUI?
Na kompie pokazuje się to w BasicUI.
@all
Jak przetłumaczyć resztę komunikatów pobieranych z Airly np. Well... It's been better ?
Dodanie ich tłumaczenia do airly.map nie załatwia sprawy 🙁
No mi się pokazuje tylko na apce w telefonie, gdzie mogę wybrać Sitemaps
http://adres-ip:8080/basicui/app?sitemap=nazwaSiteMap
a jak to pokazać w PaperUI?
PaperUI pokazuje Things (rzeczy) - ten opis - jak podłączyć Airly do openHab nie wykorzystuje Things, więc w PaperUI nie zobaczysz. Zobaczysz w każdym wykorzystującym siteMap ClassicUI, BasicUI itp
Jak wrócę do Polszy to udostępnienie swoje ikonki do ściągnięcia i wgrania do OH2
Dziękuję 🙂 Mam tak samo
Jestem jak już w innym temacie pisałem bardzo początkujący. Muszę teraz popracować nad wykresami.
dziękuję za ten wątek.
a dałbyś radę zrobić coś podobnego i zintegrować openhab z serwisem https://burze.dzis.net/ ? tam też jest API dla podobnych celów.
pozdrowienia
a dałbyś radę zrobić coś podobnego i zintegrować openhab z serwisem https://burze.dzis.net/ ? tam też jest API dla podobnych celów.
Od razu daję znać, że nie dam radę. Mam trochę priorytetów w AFE Firmware i tutaj się skupiami nockami.
@adrian - ok. proszę o parę informacji:
mam krzaczki zamiast polskich znaków - gdzie to ustawić?gdzie wgrać ikonki?- gdzie OH2 przechowuje natywne konfiguracje, tzn stworzone poprzez Paper UI?
hey openHab ma bardzo dobrą wg mnie dokumentacja.
Ja całą wiedzę zdobywam z tego miejsca i nic więcej nie potrzebuje
Natywna konfiguracja: https://www.openhab.org/docs/administration/jsondb.html
dzięki. jasne - czytam i się uczę 🙂
nie mam wykresów, no i te przyciski godzinowe wyglądają jak wyglądają - pomożesz co mam ustawić?
a zbierasz dane z tego czujnika do bazy danych?
- https://www.openhab.org/docs/configuration/persistence.html
- https://www.openhab.org/addons/#persistence
Z przyciskami będzie gorzej
- albo je ograniczyć (ilość)
- albo pisz własny styl dla tego interfejsu używają CSS. Ja tego nie robiłem, nie pomogę. Google'aj z frazą "basic UI CSS" lub podepnij się może pod ten wątek
dziękuję. prawie wszystko gra - mam wykresy. dzięki Twojemu przykładowi z monitoringiem zanieczyszczenia powietrza ogarnąłem jakoś podstawy OpenHaba i wiele się nauczyłem.
pytanie mam jedno na ten moment - czy Ty na wykresach masz aktualną godzinę? jak mam 2 godziny wstecz mimo, że ustawiłem w PaperUI właściwą strefę czasową, sam serwer też wskazuje aktualną godzinę... co mam zrobić?