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 » 02.01.2019, 22:19

Kann man das nicht sogar direkt auf der Sensor Konfigurations Seite einstellen?

Xanti
Beiträge: 2
Registriert: 02.01.2019, 21:11

Re: Feinstaubwerte von Luftdaten.info

Beitrag von Xanti » 02.01.2019, 23:29

Ja, über die Option 'An eigene API senden'. Es entstehen hier aber wegen Serverauslastung gelegentlich Datenlücken. Daher wäre das lokale Abgreifen der Werte hierfür besser...

haengematte
Beiträge: 6
Registriert: 04.01.2019, 15:54

Re: Feinstaubwerte von Luftdaten.info

Beitrag von haengematte » 04.01.2019, 16:07

Hallo capitaen_z,
da der Feinstaubsensor ab und an nicht erreichbar ist, hatte ich dieses Problem ebenfalls
Ich habe es dann so gelöst, dass ich die Länge des eingelesenen Strings ermittle.
integer Laenge = feinstaub_json.Length();
Ist der String größer als 100 zeichen, so lese ich die neuen Daten aus, ansonsten "behalte" ich die alten Werte.
Damit läuft das Skript stabil.

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 » 04.01.2019, 21:46

Hört sich nach einer guten Lösung an. Kannst du dein Skript hier mal posten?

haengematte
Beiträge: 6
Registriert: 04.01.2019, 15:54

Re: Feinstaubwerte von Luftdaten.info

Beitrag von haengematte » 05.01.2019, 16:52

Hallo netspider,

ich habe dein Skript etwas erweitert.
Die Abfrage habe ich über das CUxD realisiert, und dann die Abfrage auf die Länge.
Zusätzlich merke ich mir die "alten" Werte, die dann verwendet werden wenn die Länge kleiner 100 ist.

Code: Alles auswählen

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

! Abfrage der JSON-API mit CUxD
! Neu, verbesserte Variante
dom.GetObject("CUxD.CUX2801006:3.CMD_SETS").State("wget -q --keep-session-cookies --save-cookies cookies.txt -O- '"#url#"'");
dom.GetObject("CUxD.CUX2801006:3.CMD_QUERY_RET").State(1);
string feinstaub_json = dom.GetObject("CUxD.CUX2801006:3.CMD_RETS").State();
WriteLine(feinstaub_json);

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

! Ermitteln der Laenge
integer Laenge = feinstaub_json.Length();
!WriteLine(Laenge);

! Alte Werte merken
var tmp_pm10_value = dom.GetObject("Feinstaub_PM10").Value();
var tmp_pm25_value = dom.GetObject("Feinstaub_PM2_5").Value();
var tmp_temp_value = dom.GetObject("Feinstaub_Temperatur").Value();
var tmp_hum_value = dom.GetObject("Feinstaub_Feuchte").Value();
!  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);

if (Laenge > 100)
{
  ! 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);
}
else
{
  !alte Feinstaubwerte in die Variable eintragen
  dom.GetObject("Feinstaub_PM10").State(tmp_pm10_value);
  dom.GetObject("Feinstaub_PM2_5").State(tmp_pm25_value);
  dom.GetObject("Feinstaub_Temperatur").State(tmp_temp_value);
  dom.GetObject("Feinstaub_Feuchte").State(tmp_hum_value);

}


capitaen_z
Beiträge: 130
Registriert: 05.07.2015, 19:34
Wohnort: Hamburg
Danksagung erhalten: 3 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von capitaen_z » 09.01.2019, 19:04

Danke für dein Script. Ich werde es vielleicht am Wochenende mal testen.
Man kann ja relativ leicht herausfinden ob die CCU/Raspberrymatic hängt, indem man den Sensor deaktiviert und das Script startet.
Zusätzlich habe ich mal gefragt, ob vielleicht eine HM-Erweiterung in der Firmware eingebaut werden könnte...
So ähnlich wie es beim Projekt EasyESP realisiert wurde.

VG
Leif

Benutzeravatar
Hoppla
Beiträge: 341
Registriert: 29.12.2018, 19:39
System: Alternative CCU (auf Basis OCCU)
Wohnort: Leipzsch
Hat sich bedankt: 35 Mal
Danksagung erhalten: 12 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von Hoppla » 10.02.2019, 09:59

Hallo
Ich hab den Sensor auch schon über 1 Jahr laufen, hier bin ich aber absolute Anfängerin.
Ich suche bereits seit Tagen eine Anleitung, wie man derartige Skripte einbindet, damit die Werte unter Systemparameter sichtbar werden und auch als Ereignis weiter verwendet werden können, was gegebenenfalls noch über CuxD hinaus gebraucht wird.
Derzeit werden mir dort nur die Variablen angezeigt mit dem Zeitpunkt, wann ich sie angelegt habe.
Ich hab derzeit nicht mal einen Plan,WO ich nach WAS suchen soll.

Danke

capitaen_z
Beiträge: 130
Registriert: 05.07.2015, 19:34
Wohnort: Hamburg
Danksagung erhalten: 3 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von capitaen_z » 09.05.2019, 09:48

Hallo zusammen,

ich habe jetzt das neue Script länge laufen gehabt und muss leider sagen, dass hiermit das hängen der Raspberrymatic NICHT behoben ist, wenn der Feinstaubsensor nicht erreichbar ist.

Raspberrymatic wartet auf den Feinstaubsensor und führt erst wieder Funktionen aus, wenn der Sensor seine Daten liefert!
Ich muss leider das Script wieder deaktivieren :-/
Gibt es nicht eine Möglichkeit das man ein Timeout setzen kann?

VG
Leif

mikepiko
Beiträge: 173
Registriert: 18.09.2015, 10:11
Wohnort: Drolshagen
Hat sich bedankt: 4 Mal
Danksagung erhalten: 5 Mal
Kontaktdaten:

Re: Feinstaubwerte von Luftdaten.info

Beitrag von mikepiko » 16.05.2019, 11:49

wget kennt eine Timeout Option ...

Hilft vielleicht ?!

--timeout=seconds

Zusätzlich gibt es noch einen retry counter

--tries=number

Default Timeout ist bei wget 15 Minuten ... Ist etwas hoch....

Also vielleicht
--timeout=10 --tries=1
in den Aufruf packen ?!
Systemdaten: Raspberry Pi2 ( 84xHM, 14xHMIP, 3xLanGW, 34xHue)
Firmware: 3.51.6.20200420
Addons: XML-API, CUx-Daemon, E-Mail
Voice Assist: Amazon Echo/dot/spot/show(1/3/1/3) via ioBroker

capitaen_z
Beiträge: 130
Registriert: 05.07.2015, 19:34
Wohnort: Hamburg
Danksagung erhalten: 3 Mal

Re: Feinstaubwerte von Luftdaten.info

Beitrag von capitaen_z » 14.09.2019, 11:23

Ich lagere jetzt langsam alles von der CCU bzw. Raspberrymatic auf den iobroker aus und habe jetzt keine Probleme mehr.
Kann/möchte es nicht mehr ausprobieren, aber trotzdem danke.

VG
Leif

Antworten

Zurück zu „Projektvorstellungen“