Wunderground Wetter mit einfachem HM-Skript holen

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Benutzeravatar
funkleuchtturm
Beiträge: 2367
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von funkleuchtturm » 15.03.2014, 09:28

derAuge hat geschrieben:Die ersten Schritte konnte ich erfolgreich abschließen (Key - Ort)
das heisst, Du kannst mit dem Browser den XML-File abrufen und anzeigen ??

Wenn nicht , musst Du das erst klären bzw. sicherstellen.
derAuge hat geschrieben:muss ich bei diesee variante noch Geräte in CUxD anlegen?
Klar, nach der CUxD -Installation musst Du das Gerät auch anlernen. Siehe Anleitung CUxD!

Aber probier doch erst mal mit system.exec aus, ob das Skript funktioniert.

... die CUxD-Abfrage im Skript ist so richtig.
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
derAuge
Beiträge: 94
Registriert: 02.02.2014, 09:58
Wohnort: Münsterland

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von derAuge » 15.03.2014, 17:29

funkleuchtturm hat geschrieben:
derAuge hat geschrieben:Die ersten Schritte konnte ich erfolgreich abschließen (Key - Ort)
das heisst, Du kannst mit dem Browser den XML-File abrufen und anzeigen ??

Wenn nicht , musst Du das erst klären bzw. sicherstellen.
Das passte alles.
funkleuchtturm hat geschrieben:
derAuge hat geschrieben:Die ersten Schritte konnte ich erfolgreich abschließen (Key - Ort)
derAuge hat geschrieben:muss ich bei diesee variante noch Geräte in CUxD anlegen?
Klar, nach der CUxD -Installation musst Du das Gerät auch anlernen. Siehe Anleitung CUxD!

Aber probier doch erst mal mit system.exec aus, ob das Skript funktioniert.

... die CUxD-Abfrage im Skript ist so richtig.

Nun habe ich das Handbuch durchgelesen ;-)
Auf Seite 109 bin ich dann zum erfolg gekommen
5.9.2 System.Exec (16 Kanäle)

Das muss / sollte man wissen. (Nun weiß ich es)


Und nun werden die Variablen auch aktualisiert.

Aber:

Code: Alles auswählen

 Wetter_Aktualisierung: Last Updated on März 15, 16:59 CET 
Die Umlaute passen nicht


Gruß
derAuge
CCU2 # 3xHM-CC-RT-DN # 1x HM-CC-TC mit HM-CC-VD # HM-WDS30-T-O # 2x HM-LC-Sw2-FM # HM-Sen-MDIR-O-2 # HM-Sen-MDIR # HQ WebUI Version 2.5.1 # CUxD-V0.67 # CUxD-Highcharts 1.4.3 # HCS 0.0.3.2 # CCU.IO 1.0.47 # DashUI 0.9beta121

Benutzeravatar
funkleuchtturm
Beiträge: 2367
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von funkleuchtturm » 15.03.2014, 19:00

derAuge hat geschrieben:Aber:

Code: Alles auswählen
Wetter_Aktualisierung: Last Updated on März 15, 16:59 CET


Die Umlaute passen nicht
Danke für den Hinweis, das hab ich bei mir auch gesehen. Aber ich hatte keine Lust wegen dieser "Unschönheit" mich nochmal in die Buchstabenzählerei des Skriptes einzuarbeiten.
Wenn Du Lust hast, kannst Du das ja korrigieren und hier posten.
Das hat den Vorteil, dass man sich in die Skripterei an einer konkreten Aufgabe einarbeiten kann :D
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

rigolio
Beiträge: 17
Registriert: 29.10.2013, 21:38

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von rigolio » 17.03.2014, 12:25

Vielen Dank für das Skript. Hat bei mir auf Anhieb funktioniert und das Kaufen der Wetterstation erspart.

:!:

joesilver8
Beiträge: 10
Registriert: 19.03.2014, 15:43

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von joesilver8 » 19.03.2014, 16:10

Hallo,

eigentlich hört sich das ja einfach an, aber irgendwie stell ich mich wohl zu blöd an.
Also die Systemvariablen sind per "Copy&Paste" angelegt.

Script ist auch kopiert, Api angepasst, und Cuxd aktiviert (...1003 ist das richtige Gerät), system-exec deaktiviert.

Code: Alles auswählen

var url = "http://api.wunderground.com/api/xxxxxxxxx/conditions/lang:DL/q/Germany/Neuwied.xml";

!hier ist die Abfrage mit CUxD
dom.GetObject("CUxD.CUX2801003:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801003:1.CMD_QUERY_RET").State(1);
string wetter_xml = dom.GetObject("CUxD.CUX2801003:1.CMD_RETS").State();

!hier ist die Abfrage mit system.Exec
!string stdout;
!string stderr;
!system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
!WriteLine(stdout);
!string wetter_xml = stdout;
!WriteLine(wetter_xml);

!Beim XML-File den ueberfluessigen Header entfernen
integer laenge = wetter_xml.Length();
integer wort_position = wetter_xml.Find("display_location");
wetter_xml = wetter_xml.Substr(wort_position, (laenge - wort_position));
!WriteLine(wetter_xml);

!Daten mit Suchworten aus XML-File ausfiltern:

string word = "full";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
dom.GetObject("Wetter_Station").State(daten);

string word = "observation_time";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
dom.GetObject("Wetter_Aktualisierung").State(daten);

string word = "weather";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
dom.GetObject("Wetter_Bedingungen").State(daten);

string word = "temp_c";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("Wetter_Temperatur").State(zahl);

string word = "relative_humidity";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
integer zahl = daten.ToFloat();
dom.GetObject("Wetter_Luftfeuchte").State(zahl);

string word = "wind_string";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
dom.GetObject("Wetter_Windbedingungen").State(daten);

string word = "wind_dir";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
word_laenge =daten.Length();
string anfangsbuchstabe = daten.Substr(0,1);
if (word_laenge == 7) {daten = "Suedost";}
if (word_laenge == 8) {daten = "Suedwest";}
!if ((word_laenge == 13)  {daten = "West-Suedwest";}
!if (word_laenge == 13) && (anfangsbuchstabe == "O";)   {daten = "Sued-Suedwest";}
if (word_laenge == 11) {daten = "Ost-Suedost";}
if (word_laenge == 12) {daten = "Sued-Suedost";}
dom.GetObject("Wetter_Windrichtung").State(daten);

string word = "wind_degrees";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
integer zahl = daten.ToFloat();
dom.GetObject("Wetter_Windrichtg").State(zahl);

string word = "wind_kph";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
integer zahl = daten.ToFloat();
dom.GetObject("Wetter_Windgeschwindigkeit").State(zahl);

string word = "wind_gust_kph";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
integer zahl = daten.ToFloat();
dom.GetObject("Wetter_Windboeen").State(zahl);

string word = "pressure_mb";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
integer zahl = daten.ToFloat();
dom.GetObject("Wetter_Luftdruck").State(zahl);

string word = "pressure_trend";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
dom.GetObject("Wetter_Luftdrucktrend").State(daten);

string word = "dewpoint_c";
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge +1), 100);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("Wetter_Taupunkt").State(zahl);
Das Cuxd-Gerät ist ebenfalls in Cuxd angelegt.

Wenn ich das Skript händisch starte, so wird es auch ausgeführt und das Aktualisierungsdatum der Variablen wird aktualisiert.
Leider habben die Variablen keinen Inhalt, siehe Screenshot.

Im Systemprotokoll findet sich dan folgender Eintrag:

Mar 19 15:24:34 homematic-ccu2 local0.err ReGaHss: Error: IseXmlRpc::CallGetValue: XmlrpcTypeToIseVal failed [../Platform/DOM/iseXmlRpc.cpp (1455)]
Mar 19 15:24:34 homematic-ccu2 local0.err ReGaHss: Error: IseHssDP::ReadValue: CallGetValue failed; sVal = [../Platform/DOM/iseDOMdpHSS.cpp (130)]

Aktiviere ich die System-Exec Variante, so erfolgt keine Fehlermeldung im Log, aber das Ergebnis bleibt das Gleiche.
Kann leider den Fehler nicht finden.
Wäre schön, wenn mir jemand mit dem Zaunpfahl winken könnte. Danke

PS: URL funktioniert im Browser.
Dateianhänge
sysvar.png
Systemvariablen

looxer01
Beiträge: 442
Registriert: 06.05.2012, 13:17

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von looxer01 » 19.03.2014, 17:09

wenn du deine URL in den Browser eingibst, dann siehst du ja, dass ein Fehler von Wunderground zurückkommt
Ergo: die URL ist falsch. Siehe Seite 1 letzter post von mir (in diesem Thread)

EDIT
hab`s nochmal gecheckt und deine url geht. Ich glaube ich hatte einen slash zuviel gepastet.

Benutzeravatar
funkleuchtturm
Beiträge: 2367
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von funkleuchtturm » 19.03.2014, 21:27

Hallo joesilver8

... das ist doch schon mal gut. Ich vermute den Fehler bei den Systzemvariablen, dass irgendwie vielleicht ein Leerzeichen o.ä. beim Copy&paste reingerutscht ist.
Am besten probierst Du das Skript händisch aus, indem Du an das Ende oder auch zwischendrin einige WriteLine-Befehle platzierst. Dann kannst Du sehen , ob das Skript überhaupt bis zu diesem Punkt läuft.

Mach doch mal ans Ende des Skripts den Befehl:

Writeline("Wetter_Taupunkt ="#zahl);

und schau Dir das Ergebnis an.

Übrigens: Hast Du bei Deiner Homematic in den Systemeinstellungen auch als DNS die IP Deines Routers eingetragen ?
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

joesilver8
Beiträge: 10
Registriert: 19.03.2014, 15:43

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von joesilver8 » 19.03.2014, 22:57

Habe die Systemvariablen zunächst überprüft und keinen Fehler festgestellt.
Habe dann trotzdem alle Variablen neu angelegt.
Gleiches Ergebnis.

Habe, wie vorgeschlagen, den WriteLine-Befehl an 3 verschiedenen Stellen im Script eingebaut und getestet.
Ergebnis siehe Screenshot. Das Script schein also bis zum Ende zu laufen (dauert auch einige Zeit).

Ja, als DNS ist auch die IP des Routers eingetragen.

Die Scriptfehlerprüfung sagt übrigens: Kein Fehler

Mir fehlt es leider an weiteren Ideen.

Gruß

joesilver
Dateianhänge
skripttest.png
skripttest.png (22.06 KiB) 6508 mal betrachtet

Benutzeravatar
funkleuchtturm
Beiträge: 2367
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 357 Mal
Kontaktdaten:

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von funkleuchtturm » 19.03.2014, 23:34

... aktiviere mal im Skript die Zeile WriteLine(wetter_xml);
Wird jetzt der komplette Wetter-string ausgegeben??
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

joesilver8
Beiträge: 10
Registriert: 19.03.2014, 15:43

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von joesilver8 » 19.03.2014, 23:55

Bei diesem Versuch erfolg gar keine Ausgabe.
Im Systemlog finden sich weiterhin diese Fehlermeldung:

Mar 19 23:50:20 homematic-ccu2 local0.err ReGaHss: Error: IseXmlRpc::CallGetValue: XmlrpcTypeToIseVal failed [../Platform/DOM/iseXmlRpc.cpp (1455)]
Mar 19 23:50:20 homematic-ccu2 local0.err ReGaHss: Error: IseHssDP::ReadValue: CallGetValue failed; sVal = [../Platform/DOM/iseDOMdpHSS.cpp (130)]

Es sieht so aus, als wenn er zwar das Skript fehlerfrei abarbeitet, aber vorher das XML nicht lesen kann.
Kann dies noch was mit Freigaben oder so zu tun haben?

Gruß

joesilver

Antworten

Zurück zu „Projektvorstellungen“