Forum Smart'ny Dom

Jakość powietrza or...
 

Jakość powietrza oraz warunki pogodowe w openHAB  

Strona 1 / 2
  RSS
adrian
(@adrian)
Prezes

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ć?

  1. Zakładamy konto w serwisie Airly, aby otrzymać unikalny klucz, który umożliwia odczyt danych
  2. Określamy naszą lokalizację: szerokość i długość geograficzną
  3. Wyszukujemy najbliższy dla naszej lokalizacji czujnik Airly
  4. Instalujemy i konfigurujemy w openHab odpowiednie dodatki
  5. Dodajemy elementy (Items) w openHab
  6. Dodajemy plik z transformacjami
  7. 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

Airly API Key

  • Klucz będzie wykorzystywany w dalszej części. Będę go nazywał AIRLY_API_KEY
Określamy naszą lokalizację: szerokość i długość geograficzna

  • 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.

 

Cytuj
Dodane : 02/12/2018 5:27 pm
kadasz, Krzysztofch, malygrzegorz i 1 osób polubiło
Tagi tematu
isom
 isom
(@isom)
Zasłużony Moderator

Zainspirowałeś mnie @adrian , musze to ogarnąć w Domoticzu 🙂 

OdpowiedzCytuj
Dodane : 02/12/2018 7:06 pm
Krzysztofch i adrian polubień
Flaoo
(@flaoo)
Początkujący

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.

OdpowiedzCytuj
Dodane : 03/12/2018 12:01 pm
adrian polubień
DAM04
(@dam04)
Nowy

W aplikacji działa ok, a jak to pokazać w PaperUI?

OdpowiedzCytuj
Dodane : 04/02/2019 8:07 pm
edass
(@edass)
Początkujący

@DAM04

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 🙁 

OdpowiedzCytuj
Dodane : 04/02/2019 8:35 pm
DAM04
(@dam04)
Nowy

No mi się pokazuje tylko na apce w telefonie, gdzie mogę wybrać Sitemaps

OdpowiedzCytuj
Dodane : 04/02/2019 8:50 pm
adrian
(@adrian)
Prezes

http://adres-ip:8080/basicui/app?sitemap=nazwaSiteMap

OdpowiedzCytuj
Dodane : 04/02/2019 8:52 pm
DAM04
(@dam04)
Nowy

a jak to pokazać w PaperUI?

OdpowiedzCytuj
Dodane : 04/02/2019 9:27 pm
adrian
(@adrian)
Prezes

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 

OdpowiedzCytuj
Dodane : 04/02/2019 9:31 pm
lacky
(@lacky)
Młodzik

Świetny tutorial, prawie mam, ale brakuje mi ikon w załaczniku tak u mnie wygląda, proszę nakierować mnie co mam zrobić 🙂

OdpowiedzCytuj
Dodane : 26/02/2019 9:17 pm
adrian
(@adrian)
Prezes

Jak wrócę do Polszy to udostępnienie swoje ikonki do ściągnięcia i wgrania do OH2

OdpowiedzCytuj
Dodane : 27/02/2019 1:45 am
adrian
(@adrian)
Prezes

@lacky

https://www.smartnydom.pl/download/paczka-ikon-do-openhab/

OdpowiedzCytuj
Dodane : 27/02/2019 10:06 pm
lacky
(@lacky)
Młodzik

Dziękuję 🙂 Mam tak samo

 

Jestem jak już w innym temacie pisałem bardzo początkujący. Muszę teraz popracować nad wykresami.

OdpowiedzCytuj
Dodane : 28/02/2019 7:01 am
sdsi
 sdsi
(@sdsi)
Młodzik

@adrian

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

OdpowiedzCytuj
Dodane : 04/04/2019 1:32 pm
adrian
(@adrian)
Prezes
Dodane przez: sdsi

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.

OdpowiedzCytuj
Dodane : 04/04/2019 9:55 pm
sdsi
 sdsi
(@sdsi)
Młodzik

@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?
OdpowiedzCytuj
Dodane : 05/04/2019 6:23 pm
adrian
(@adrian)
Prezes

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

OdpowiedzCytuj
Dodane : 05/04/2019 8:18 pm
sdsi
 sdsi
(@sdsi)
Młodzik

@adrian

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ć?

 

OdpowiedzCytuj
Dodane : 06/04/2019 8:56 am
adrian
(@adrian)
Prezes

a zbierasz dane z tego czujnika do bazy danych?

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
OdpowiedzCytuj
Dodane : 06/04/2019 9:07 am
sdsi
 sdsi
(@sdsi)
Młodzik

@adrian 

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ć?

OdpowiedzCytuj
Dodane : 10/04/2019 1:15 pm
Strona 1 / 2
Udostępnij:



Udostępnij
  • 1
    Share
  
Pracuję

Proszę Zaloguj Się lub Zarejestruj