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

Re: Feinstaubwerte von Luftdaten.info

Beitrag von netspider » 20.10.2019, 16:36

Hallo zusammen,

ich konnte endlich wieder ein wenig Zeit finden, um das Skipt mit den neusten Erkenntnissen anzupassen.
Das Skript wird bei mir nur ausgeführt, wenn die HomeMatic erkennt, dass die IP-Adresse des Feinstaubsensors "anpingbar" ist.
Dies realisiere ich durch einen virtuellen PING-Sensor durch den CUx-Daemon.

Das Programm sieht bei mir so aus:
2019-10-20 16_30_45-HomeMatic WebUI.png
Hier das dazu passende Skirpt:

Code: Alles auswählen

! Die IP des lokalen Feinstaubsensors
var url = "http://[IP-ADRESSE]/data.json";

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"' &");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);   
string feinstaub_json = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
integer slenght = feinstaub_json.Length();

!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);
Wichtig ist, dass der Abruf der Daten vom Sensor mit einem "&" in den Hintergrund in der Shell geschickt wird. Ohne das "&" wartet die Homematic sonst solange die Daten zurückgeliefert werden. Der Aufruf muss also so aussehen: "wget -q -O - '"#url#"' &"

Antworten

Zurück zu „Projektvorstellungen“