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:
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);