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