Feinstaubwerte von Luftdaten.info

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

netspider
Beiträge: 39
Registriert: 09.04.2018, 10:43
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Feinstaubwerte von Luftdaten.info

Beitrag von netspider » 09.04.2018, 11:02

Hallo zusammen,

vor einiger Zeit habe ich mir einen Feinstaubsensor anhand der Anleitung bei https://luftdaten.info zusammengebaut.
Dieser ist nun mit meinem lokalen WLAN verbunden und stellt die Feinstaubwerte (PM10 und PM2.5) per JSON-API zur Verfügung.

Natürlich möchte man diese Werte in seine HomeMatic automatisch importieren lassen um damit verschiedene Szenarien darzustellen.
Diese Szenarien können ganz unterschiedlich ausfallen: Feinstaubalarm aufs Handy, Fenster schließen bei zu hohen Feinstaubwerten, usw...

Ich habe nun ein Skript fertig gestellt, mit dessen Hilfe die Feinstaubwerte in die HomeMatic importiert werden. Für das Skript müssen vorher folgende Variablen angelegt werden : Feinstaub_PM10 (Zahl), Feinstaub_PM2_5 (Zahl), Feinstaub_Temperatur (Zahl) und Feinstaub_Feuchte (Zahl) . Hier das Skirpt:

Code: Alles auswählen

! Die IP des lokalen Feinstaubsensors
var url = "http://[IP-ADRESSE]/data.json";
 
! Abfrage der JSON-API
string stdout;
string stderr;
system.Exec("wget -q -O - '"#url#"'",&stderr,&stdout);
string feinstaub_json = stderr;

!Ausgabe der RAW JSON Nachricht
!WriteLine(feinstaub_json);

! Test-Ausgabe
!{"software_version": "NRZ-2017-099", "age":"33", "sensordatavalues":[{"value_type":"SDS_P1","value":"6.62"},
!{"value_type":"SDS_P2","value":"5.25"},{"value_type":"temperature","value":"33.80"},
!{"value_type":"humidity","value":"65.70"},{"value_type":"samples","value":"986786"},
!{"value_type":"min_micro","value":"236"},{"value_type":"max_micro","value":"815138"},
!{"value_type":"signal","value":"-88"}]}

integer pm10_position = feinstaub_json.Find("SDS_P1");
integer pm25_position = feinstaub_json.Find("SDS_P2");
integer temp_position = feinstaub_json.Find("temperature");
integer hum_position = feinstaub_json.Find("humidity");

!WriteLine(pm10_position);
!WriteLine(pm25_position);
!WriteLine(temp_position);
!WriteLine(hum_position);

! PM10 hat Position 17
! PM2.5 hat Position 17
! Temperatur hat Position 22 
! Feuchte hat Position 19
string pm10_value = feinstaub_json.Substr((pm10_position+17), 5);
string pm25_value = feinstaub_json.Substr((pm25_position+17), 5);
string temp_value = feinstaub_json.Substr((temp_position+22), 5);
string hum_value = feinstaub_json.Substr((hum_position+19), 5);

! Ausgabe des aktuellen Wertes
!WriteLine(pm10_value);
!WriteLine(pm25_value);
!WriteLine(temp_value);
!WriteLine(hum_value);

!Wenn Feinstaub Werte kleiner als 10 sind
integer pm10_zeichen_position = pm10_value.Find('"');
integer pm25_zeichen_position = pm25_value.Find('"');
integer temp_zeichen_position = temp_value.Find('"');
integer hum_zeichen_position = hum_value.Find('"');

!WriteLine(pm10_zeichen_position);
!WriteLine(pm25_zeichen_position);
!WriteLine(temp_zeichen_position);
!WriteLine(hum_zeichen_position);

if (pm10_zeichen_position==4) {pm10_value = pm10_value.Substr((pm10_zeichen_position)-4, 4);}
if (pm25_zeichen_position==4) {pm25_value = pm25_value.Substr((pm25_zeichen_position)-4, 4);}
if (temp_zeichen_position==4) {temp_value = temp_value.Substr((temp_zeichen_position)-4, 4);}
if (hum_zeichen_position==4) {hum_value = hum_value.Substr((hum_zeichen_position)-4, 4);}

! Ausgabe der geparsten Werte
WriteLine(pm10_value);
WriteLine(pm25_value);
WriteLine(temp_value);
WriteLine(hum_value);

!Feinstaubwert in die Variable eintragen
dom.GetObject("Feinstaub_PM10").State(pm10_value);
dom.GetObject("Feinstaub_PM2_5").State(pm25_value);
dom.GetObject("Feinstaub_Temperatur").State(temp_value);
dom.GetObject("Feinstaub_Feuchte").State(hum_value);
Viel Spaß damit! :D
Zuletzt geändert von netspider am 13.05.2018, 16:33, insgesamt 1-mal geändert.

El-Chico
Beiträge: 32
Registriert: 16.01.2016, 17:41
System: Alternative CCU (auf Basis OCCU)

Re: Feinstaubwerte von Luftdaten.info

Beitrag von El-Chico » 09.04.2018, 23:56

Hallo!

Das Skript funktioniert, vielen Dank! Ist es richtig, dass es so nur die PM10-Werte in eine Variable schreibt?

Ich habe das Skript mal angepasst (geht bestimmt geschickter? Hab da keinen echten Plan von...) und schreibe PM10, PM2,5 und zusätzlich Temp und Feuchte vom verbauten DHT22 in die Systemvariablen PM10, PM2_5, Feinstaub_Temperatur und Feinstaub_Feuchte:

Code: Alles auswählen

! Die IP des lokalen Feinstaubsensors
var url = "http://192.168.0.120/data.json";
 
! Abfrage der JSON-API
string stdout;
string stderr;
system.Exec("wget -q -O - '"#url#"'",&stderr,&stdout);
string feinstaub_json10 = stderr;
string feinstaub_json25 = stderr;
string feinstaub_Temp = stderr;
string feinstaub_Hum = stderr;

!Beim JSON-File die laenge ermitteln
integer laenge = feinstaub_json10.Length();
integer laenge = feinstaub_json25.Length();
integer laenge = feinstaub_Temp.Length();
integer laenge = feinstaub_Hum.Length();

! PM10 hat Wort-Position +51
! PM2.5 hat Wort-Position +91
! Temperatur hat Wort-Position +136
! Feuchte hat Wort-Position +178

integer wort_position = feinstaub_json10.Find("sensordatavalues");
feinstaub_json10 = feinstaub_json10.Substr((wort_position+51), 5);
feinstaub_json25 = feinstaub_json25.Substr((wort_position+91), 5);
feinstaub_Temp = feinstaub_Temp.Substr((wort_position+136), 5);
feinstaub_Hum = feinstaub_Hum.Substr((wort_position+178), 5);

! Ausgabe des aktuellen Wertes
WriteLine(feinstaub_json10);
WriteLine(feinstaub_json25);
WriteLine(feinstaub_Temp);
WriteLine(feinstaub_Hum);

!Feinstaubwert in die Variable eintragen
dom.GetObject("PM10").State(feinstaub_json10);
dom.GetObject("PM2_5").State(feinstaub_json25);
dom.GetObject("Feinstaub_Temperatur").State(feinstaub_Temp);
dom.GetObject("Feinstaub_Feuchte").State(feinstaub_Hum);
Das Skript führe ich als Programm alle 300 Sekunden (meine eingestelltes Messintervall im Sensor) aus - ist das richtig so?

netspider
Beiträge: 39
Registriert: 09.04.2018, 10:43
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von netspider » 10.04.2018, 11:01

Hi,

die Feinstaubwerte Zuordnung ist bereits hinterlegt, ich habe das mit jeweils einem gesonderten Programm gemacht.
Man kann natürlich alles mit einem Skript abziehen - geht auch ;)

Danke für die Ergänzung des Skriptes!

nuiler
Beiträge: 207
Registriert: 15.04.2012, 11:07
Wohnort: Ostalbkreis / Deutschland

Re: Feinstaubwerte von Luftdaten.info

Beitrag von nuiler » 07.05.2018, 14:20

Die Angaben wo die Werte stehen, stimmen aber nicht mehr ganz.

Bei mir kommen die Werte bei
! PM10 hat Wort-Position +51
! PM2.5 hat Wort-Position +90
! Temperatur hat Wort-Position +134
! Feuchte hat Wort-Position +176

Wobei die Werte dann so ankommen.

2.27"
1.10"
30.10
26.60
www.nuiler.de
Raspberrymatic 3.57.4.20210320 rpi3

netspider
Beiträge: 39
Registriert: 09.04.2018, 10:43
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von netspider » 07.05.2018, 14:35

Es kann sein, dass Luftdaten.info ein Update eingespielt hat.
Ich werde das mal überprüfen und mich ggf. hier melden.

netspider
Beiträge: 39
Registriert: 09.04.2018, 10:43
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von netspider » 11.05.2018, 10:57

Hier ist der Bug-Fix für das Luftdaten.info Update:

Code: Alles auswählen

! Die IP des lokalen Feinstaubsensors
var url = "http://[IP-ADRESSE]/data.json";
 
! Abfrage der JSON-API
string stdout;
string stderr;
system.Exec("wget -q -O - '"#url#"'",&stderr,&stdout);
string feinstaub_json10 = stderr;
string feinstaub_json25 = stderr;
string feinstaub_Temp = stderr;
string feinstaub_Hum = stderr;

!Beim JSON-File die laenge ermitteln
integer laenge = feinstaub_json10.Length();
integer laenge = feinstaub_json25.Length();
integer laenge = feinstaub_Temp.Length();
integer laenge = feinstaub_Hum.Length();

! PM10 hat Wort-Position +51
! PM2.5 hat Wort-Position +91
! Temperatur hat Wort-Position +136
! Feuchte hat Wort-Position +178

integer wort_position = feinstaub_json10.Find("sensordatavalues");
feinstaub_json10 = feinstaub_json10.Substr((wort_position+51), 5);
feinstaub_json25 = feinstaub_json25.Substr((wort_position+90), 5);
feinstaub_Temp = feinstaub_Temp.Substr((wort_position+134), 5);
feinstaub_Hum = feinstaub_Hum.Substr((wort_position+176), 5);

! Ausgabe des aktuellen Wertes
WriteLine("Ausgabe >= 10:");
WriteLine(feinstaub_json10);
WriteLine(feinstaub_json25);
WriteLine(feinstaub_Temp);
WriteLine(feinstaub_Hum);

!Feinstaubwert in die Variable eintragen
dom.GetObject("Feinstaub_PM10").State(feinstaub_json10);
dom.GetObject("Feinstaub_PM2_5").State(feinstaub_json25);
dom.GetObject("Feinstaub_Temperatur").State(feinstaub_Temp);
dom.GetObject("Feinstaub_Feuchte").State(feinstaub_Hum);

!Wenn Feinstaub Werte kleiner als 10 sind
integer wort_position = feinstaub_json10.Find('"');
feinstaub_json10 = feinstaub_json10.Substr((wort_position-4), 4);
integer wort_position = feinstaub_json25.Find('"');
feinstaub_json25 = feinstaub_json25.Substr((wort_position-4), 4);

! Ausgabe des aktuellen Wertes
WriteLine("Ausgabe <= 10:");
WriteLine(feinstaub_json10);
WriteLine(feinstaub_json25);

!Feinstaubwert in die Variable eintragen
dom.GetObject("Feinstaub_PM10").State(feinstaub_json10);
dom.GetObject("Feinstaub_PM2_5").State(feinstaub_json25);

El-Chico
Beiträge: 32
Registriert: 16.01.2016, 17:41
System: Alternative CCU (auf Basis OCCU)

Re: Feinstaubwerte von Luftdaten.info

Beitrag von El-Chico » 11.05.2018, 21:55

Hi!

Danke für den neuen Code! Mir fällt da gerade ein: Gibt es nicht genau das gleiche Problem der "Verschiebung" der Stellen bei Feinstaubwerten >99,9? Das kam Sylvester z.B. schon vor ;-)

Ich habe mir gerade mal meine aufgezeichneten Verläufe angeschaut - PMs < 10 wurden tatsächlich nicht angezeigt. Und die Temperatur/ Feuchte ist ebenso "betroffen" wie die Partikelwerte, logisch, da sich ja auch dort die Länge verändert und damit alles durcheinanderkommt... Temp ist dadurch in meiner Historie immer > 10°C...

Hast Du für PM > 99,9 und Temp/ Feuchte < 10 auch noch einen Code parat? Sonst muss ich nochmal basteln, aber nicht heute ;-)

EDIT: Ne, Dein Code geht bei mir doch nicht. Er erkennt die PM-Werte "falsch". Bei PM10=6,6 und PM2.5=5,3 zeigt mir das Skript folgendes:
Ausgabe >= 10:
6.67"
5.30"
14.70
87.10
Es wird nicht erkannt, dass der Wert <10 ist...

netspider
Beiträge: 39
Registriert: 09.04.2018, 10:43
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von netspider » 13.05.2018, 16:35

# Update

Ich habe nun das Skript so angepasst, dass es nun auch mit Werten von 0 bis 100 klar kommt.

Code: Alles auswählen

! Die IP des lokalen Feinstaubsensors
var url = "http://[IP-Adresse]/data.json";
 
! Abfrage der JSON-API
string stdout;
string stderr;
system.Exec("wget -q -O - '"#url#"'",&stderr,&stdout);
string feinstaub_json = stderr;

!Ausgabe der RAW JSON Nachricht
!WriteLine(feinstaub_json);

! Test-Ausgabe
!{"software_version": "NRZ-2017-099", "age":"33", "sensordatavalues":[{"value_type":"SDS_P1","value":"6.62"},
!{"value_type":"SDS_P2","value":"5.25"},{"value_type":"temperature","value":"33.80"},
!{"value_type":"humidity","value":"65.70"},{"value_type":"samples","value":"986786"},
!{"value_type":"min_micro","value":"236"},{"value_type":"max_micro","value":"815138"},
!{"value_type":"signal","value":"-88"}]}

integer pm10_position = feinstaub_json.Find("SDS_P1");
integer pm25_position = feinstaub_json.Find("SDS_P2");
integer temp_position = feinstaub_json.Find("temperature");
integer hum_position = feinstaub_json.Find("humidity");

!WriteLine(pm10_position);
!WriteLine(pm25_position);
!WriteLine(temp_position);
!WriteLine(hum_position);

! PM10 hat Position 17
! PM2.5 hat Position 17
! Temperatur hat Position 22 
! Feuchte hat Position 19
string pm10_value = feinstaub_json.Substr((pm10_position+17), 5);
string pm25_value = feinstaub_json.Substr((pm25_position+17), 5);
string temp_value = feinstaub_json.Substr((temp_position+22), 5);
string hum_value = feinstaub_json.Substr((hum_position+19), 5);

! Ausgabe des aktuellen Wertes
!WriteLine(pm10_value);
!WriteLine(pm25_value);
!WriteLine(temp_value);
!WriteLine(hum_value);

!Wenn Feinstaub Werte kleiner als 10 sind
integer pm10_zeichen_position = pm10_value.Find('"');
integer pm25_zeichen_position = pm25_value.Find('"');
integer temp_zeichen_position = temp_value.Find('"');
integer hum_zeichen_position = hum_value.Find('"');

!WriteLine(pm10_zeichen_position);
!WriteLine(pm25_zeichen_position);
!WriteLine(temp_zeichen_position);
!WriteLine(hum_zeichen_position);

if (pm10_zeichen_position==4) {pm10_value = pm10_value.Substr((pm10_zeichen_position)-4, 4);}
if (pm25_zeichen_position==4) {pm25_value = pm25_value.Substr((pm25_zeichen_position)-4, 4);}
if (temp_zeichen_position==4) {temp_value = temp_value.Substr((temp_zeichen_position)-4, 4);}
if (hum_zeichen_position==4) {hum_value = hum_value.Substr((hum_zeichen_position)-4, 4);}

! Ausgabe der geparsten Werte
WriteLine(pm10_value);
WriteLine(pm25_value);
WriteLine(temp_value);
WriteLine(hum_value);

!Feinstaubwert in die Variable eintragen
dom.GetObject("Feinstaub_PM10").State(pm10_value);
dom.GetObject("Feinstaub_PM2_5").State(pm25_value);
dom.GetObject("Feinstaub_Temperatur").State(temp_value);
dom.GetObject("Feinstaub_Feuchte").State(hum_value);

El-Chico
Beiträge: 32
Registriert: 16.01.2016, 17:41
System: Alternative CCU (auf Basis OCCU)

Re: Feinstaubwerte von Luftdaten.info

Beitrag von El-Chico » 14.05.2018, 21:33

Hi netspider!

Vielen vielen Dank für das Skript! Jetzt läuft das wieder :-)

El-Chico
Beiträge: 32
Registriert: 16.01.2016, 17:41
System: Alternative CCU (auf Basis OCCU)

Re: Feinstaubwerte von Luftdaten.info

Beitrag von El-Chico » 14.06.2018, 11:50

Hallo!

Kann es sein, dass es erneut ein Firmwareupdate gab? Ich bekomme als Rückgabewert nur noch Text und keine Zahlenwerte mehr? Sensor ist bereits neugestartet worden und zeigt in seinem Webinterface auch Werte an...

Antworten

Zurück zu „Projektvorstellungen“