Wunderground Wetter mit einfachem HM-Skript holen

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

mguenther
Beiträge: 58
Registriert: 12.02.2018, 03:13
Hat sich bedankt: 2 Mal
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von mguenther » 17.02.2018, 04:06

mguenther hat geschrieben:
mguenther hat geschrieben:Hallo Zusammen,
bin am verzweifeln und brauche eure Unterstützung. Ich wende seit kurzer Zeit homematic an, habe hier schon eine Menge gelesen, bin aber dennoch ziemlich am Anfang. Ich versuche dieses Skript zu nutzen, habe auch alle Posts hier gelesen und die Ratschläge x-Mal durchgekaut und angewandt. Ich finde meinen Fehler nicht.

Ich hatte zuerst den CUx-Daemon nicht am Laufen, da bekam ich auch Wetterdaten der Station. Nach installieren des CUx-Daemons bekomme ich nur noch "0" oder nix als Variableneintrag. Selbst wenn ich jetzt aber wieder die Zeilen für den CUx-Daemon auskommentiere und die entsprechenden anderen Zeilen für system.Exec aktiviere, bekomme ich keine Auswertung mehr!?!?!?
[...]
[...]

Gruß,
Marcus
Oh Mann... Gut dass ich momentan krank geschrieben bin und mir die Nächte um die Ohren hauen kann... Es läuft ja zumindest Olympia :D
Ich habe meinen Fehler gefunden... Das Netzwerk war nicht richtig eingerichtet. SO ein MIST!!!! Ich hatte zu erst nur eine FRITZ-BOX, habe aber vor einigen Wochen einen LTE-Router vorgeschaltet. Die Fritzbox und der LTE-Router sind per LAN verbunden und der Online-Zugang wird in der Fritzbox per LAN-Kabel verwaltet. Ich hatte in dem Zusammenhang das Gateway und den DNS geändert. Auf der CCU hatte ich das aber vergessen... Das erklärt auch, warum ich anfangs die Werte sehen konnte und dann nicht mehr...

Trotzdem danke fürs passive Mitlesen :mrgreen:
------
DANKE!

Keichi
Beiträge: 54
Registriert: 28.01.2018, 16:23

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Keichi » 17.02.2018, 14:41

Ich habe gerade mal versucht die Temperatur und die Luftfeuchtigkeit per CUxD Universal Wrapper Device zu setzen, das mit der Temperatur klappt auch ganz gut (und ich spare mir nun die Außensensoren) nur aus irgendeinen Grund will er die Luftfeuchtigkeit nich schreiben... Wer ne Idee?

Code: Alles auswählen

!CUxD Universal Wrapper Device (90) Thermostat
string cuxWDSName='CUxD.CUX9002001:1';
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("W_Temperatur").State(zahl);
dom.GetObject("Aussentemperatur").State(zahl);
dom.GetObject(cuxWDSName#'.SET_TEMPERATURE').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("W_Luftfeuchte").State(zahl);
dom.GetObject(cuxWDSName#'.SET_HUMIDITY').State(zahl);
Edit:

Die Syslog von CUxd spuckt die ganze Zeit das aus

Code: Alles auswählen

Feb 17 14:43:28 homematic-raspi daemon.warn cuxd[530]: setValue(CUX9002001:1.SET_TEMPERATURE) firmware differ '1.7' ''!
Feb 17 14:43:28 homematic-raspi daemon.warn cuxd[530]: setValue(CUX9002001:1.SET_HUMIDITY) firmware differ '1.7' ''!
CUxD is auf Version 1.12 was ja die aktuelle ist, weswegen mich der Fehler echt verwundert.[/strike]

Hat sich erledigt.. Aus irgendeinen Grund hats gereicht mal CUxD neu zu starten, danach gings plötzlich.

Luzzzmann
Beiträge: 14
Registriert: 04.03.2018, 18:39
Hat sich bedankt: 5 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Luzzzmann » 04.03.2018, 18:43

Hallo zusammen,

ich habe nun das u.a. script bei mir am laufen und versucht noch das Wetter Icon einzufügen, das klappt aber nicht.
Er gibt mir dann die URL des Icon aus nicht aber das Icon selbst.
Habt ihr einen Tip wie ich das machen muss ?

Ich habe 2 zusätzliche Sys.Variablen erstellt:

ICON und
ICON_URL beide als Zeichenkette.
Und dann das geschrieben:

Code: Alles auswählen


            string word = "icon";
            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_Icon").State(daten);


            string word = "icon_url";
            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_Icon-url").State(daten);

Vielen Dank.



funkleuchtturm hat geschrieben:Auf meiner Homepage gibt´s hierzu evtl. weitere Informationen: http://www.stall.biz/?project=wundergro ... ript-holen

In einem anderen Thread wurde sehr ausführlich und gut beschrieben, wie man die Wetterdaten von wunderground.com in die Homematic bekommt.
http://homematic-forum.de/forum/viewtop ... nderground
Allerdings verwendet diese Lösung ein TCL-Skript, was insbesondere für den Anfänger nur mit Aufwand implementierbar ist und dementsprechend Fehlermöglichkeiten hat.

Hier wird ein "Kochrezept" für die Implementierung eines wunderground.com-Wetterdatenabrufes beschrieben, der nur mit einem HM-Skript arbeitet:
1. API-Key von Wunderground besorgen wie unter o.a. Link beschrieben
2. Insgesamt 13 Systemvariable entsprechend der Vorgaben im nachfolgenden Skript sorgfältig ohne Schreibfehler (!) anlegen
(schon bei einem kleinsten Schreibfehler oder fehlender Systemvariable läuft das Skript nicht durch!)
3. Im nachfolgenden Skript den API-Key in die URL-Zeile eintragen und vorher die Funktion der URL ausprobieren
(im Browser aufrufen und dann erhält man den aktuellen XML-Wetterfile im Browser angezeigt!).
4. Ein einfaches WebUI-Programm erstellen, das auf Tastendruck oder alle 30min das nachfolgende Skript aufruft.

Fertig!

Code: Alles auswählen

        !Stand 03.04.2014  http://homematic-forum.de/forum/viewtopic.php?f=31&t=17209
        !zuerst folgende Systemvariablen anlegen
        !Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop
        !Wetter_Station                        Zeichenkette
        !Wetter_Aktualisierung             Zeichenkette
        !Wetter_Bedingungen               Zeichenkette
        !Wetter_Temperatur                  Zahl                     °C
        !Wetter_Luftfeuchte                  Zahl                      %
        !Wetter_Windbedingungen       Zeichenkette
        !Wetter_Windrichtung               Zeichenkette
        !Wetter_Windrichtg                   Zahl                       °
        !Wetter_Windgeschwindigkeit   Zahl                     km/h
        !Wetter_Windboeen                  Zahl                     km/h
        !Wetter_Luftdruck                      Zahl                      mb
        !Wetter_Luftdrucktrend             Zeichenkette
        !Wetter_Taupunkt                      Zahl                     °C
        !Wetter_UV                                Zeichenkette

        var url = "http://api.wunderground.com/api/<hier api-key>/conditions/lang:DL/q/Germany/Hierorthin.xml";

        !hier ist die Abfrage mit CUxD
        dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
        dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
        string wetter_xml = dom.GetObject("CUxD.CUX2801001: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";
        string word = "city";
        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";
        string word = "observation_time_rfc822";
        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));
        daten = daten.Substr(0, (word_position -11));
        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);
        ! Umlaute korrigieren
        ! N # Nord ***
        if (anfangsbuchstabe == "N")
                 { if (daten == "Nordwest") {daten = "Nord-West" ;} }
        ! S # Süd ***
        if (anfangsbuchstabe == "S") {
           ! 4 # Süd
           if (word_laenge == 4)  {daten = "Süd";}
           ! 8 # Südwest
           if (word_laenge == 8)  {daten = "Süd-West";}
           ! 12 # Süd-Südost
           if (word_laenge == 12) {daten = "Süd-Süd-Ost" ;}
             ! 13
           if (word_laenge == 13) {daten = "Süd-Süd-West" ;}   }

        ! W # Westen
        if (anfangsbuchstabe == "W") {
           ! 13 # West-Südwest
            if (word_laenge == 13) {daten = "West-Süd-West" ;} }

        ! O # Osten
        if (anfangsbuchstabe == "O") {
           ! 11 # Ost-Südost
           if (word_laenge == 11) {daten = "Ost-Süd-Ost" ;} }

        dom.GetObject("Wetter_Windrichtung").State(daten);
        !WriteLine(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);

        string word = "UV";
        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_UV").State(zahl);
Changelog: 03.04.2014 Umlaute Himmelsrichtungen korrigiert, UV-Kennwert zugefügt. Danke für die entsprechenden Anregungen hier im Blog!

MartinBr
Beiträge: 393
Registriert: 25.01.2017, 10:51
Wohnort: Bei Berlin
Hat sich bedankt: 3 Mal
Danksagung erhalten: 8 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von MartinBr » 06.03.2018, 18:53

Hallo, ich habe das Ursprungsscript um weitere Messwerte erweitert: Regen, Regen pro Stunde und auch die Sonneneinstrahlung.
Damit kann ich meine Rolläden auch zur Verschattung am Mittag nutzen, zusammen mit dem Sonnenstandscript von Eugen; vielen Dank dafür!

Die Wetterstation muss natürlich alle Werte unterstützen, insbesondere die Solareinstrahlung.

Hier das Script:

Code: Alles auswählen

!Wunderground Wetterdaten 09.03.2017  
! 
! zuerst folgende Systemvariablen anlegen
! Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop
! 
!W_Station                Zeichenkette
!W_Aktualisierung         Zeichenkette
!W_Bedingungen            Zeichenkette
!W_Temperatur             Zahl                  °C
!W_Luftfeuchte            Zahl                  %
!W_Windbedingungen        Zeichenkette
!W_Windrichtung           Zeichenkette
!W_Windrichtg             Zahl                  °
!W_Windgeschwindigkeit    Zahl                  km/h
!W_Windboeen              Zahl                  km/h
!W_Luftdruck              Zahl                  mbar
!W_Luftdrucktrend         Zeichenkette
!W_Taupunkt               Zahl                  °C
!W_UV                     Zeichenkette
!W_Solar         	  Zahl    	        W/m2
!W_GefühlteLufttemp       Zahl                  °C
!W_Windkühle              Zahl                  °C
!W_Regenmenge             Zahl                  mm
!W_Regenmenge1h           Zahl                  mm
!Aussentemperatur           Zahl               °C

! var url = "http://api.wunderground.com/api/xxxxxxxxxxxxx/conditions/lang:DL/q/Germany/Berlin.xml";
var url = "http://api.wunderground.com/api/xxxxxxxxx/conditions/lang:DL/q/pws:IBRANDEN25.xml";

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

!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";
string word = "city";
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("W_Station").State(daten);

!string word = "observation_time";
string word = "observation_time_rfc822";
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));
daten = daten.Substr(0, (word_position -11));
dom.GetObject("W_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("W_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("W_Temperatur").State(zahl);
dom.GetObject("W_Aussentemperatur").State(zahl);
dom.GetObject("Aussentemperatur").State(zahl);

string word = "icon";
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));
string daten2 = daten;
!       dom.GetObject("WetterFct_Condition").State(daten);

string word = "icon_url";
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));
daten = "</div><img src=\"" + daten + "\" alt=\"" + daten2 + "\">";
dom.GetObject("W_Icon").State(daten);

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("W_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("W_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);
! Umlaute korrigieren
!
! N # Nord ***
if (anfangsbuchstabe == "N") {
!
if (daten == "Nordwest") {daten = "Nord-West" ;}
        }
 
! S # Süd ***
if (anfangsbuchstabe == "S") {
! 4 # Süd
if (word_laenge == 4)  {daten = "Süd";}
! 8 # Südwest
if (word_laenge == 8)  {daten = "Süd-West";}
! 12 # Süd-Südost
if (word_laenge == 12) {daten = "Süd-Süd-Ost" ;}
! 13
if (word_laenge == 13) {daten = "Süd-Süd-West" ;}
        }

! W # Westen
if (anfangsbuchstabe == "W") {
! 13 # West-Südwest
if (word_laenge == 13) {daten = "West-Süd-West" ;}
        }

! O # Osten
if (anfangsbuchstabe == "O") {
! 11 # Ost-Südost
if (word_laenge == 11) {daten = "Ost-Süd-Ost" ;}
        }
dom.GetObject("W_Windrichtung").State(daten);
!WriteLine(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("W_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("W_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("W_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("W_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("W_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("W_Taupunkt").State(zahl);

!W_Sonnenstrahlung                      Zahl                     W/m2
string word = "solarradiation";
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("W_Solar").State(zahl);

string word = "UV";
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("W_UV").State(zahl);

string word = "feelslike_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("W_GefühlteLufttemp").State(zahl);

string word = "windchill_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("W_Windkühle").State(zahl);

string word = "precip_today_metric";
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("W_Regenmenge").State(zahl);

string word = "precip_1hr_metric";
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("W_Regenmenge1h").State(zahl);


Gruß
Martin
RaspberryMatic-3.59.6 auf Tinkerboard S, CUxD 2.6, XML-1.20, ioBroker (HM,HMIP, Zigbee, Zwave und Shelly) und Alexa in einer VM unter Proxmox, VitoComfort 200

MartinBr
Beiträge: 393
Registriert: 25.01.2017, 10:51
Wohnort: Bei Berlin
Hat sich bedankt: 3 Mal
Danksagung erhalten: 8 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von MartinBr » 12.03.2018, 11:06

Hallo,

auch die Systemvariable "W_Icon" muss angelegt werden. Der Hinweis fehlte im Script.

Ich habe das jetzt korrigiert :D

Hier das vollständige Script:

Code: Alles auswählen

!Wunderground Wetterdaten 09.03.2017  
! 
! zuerst folgende Systemvariablen anlegen
! Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop
! 
!W_Station                Zeichenkette
!W_Aktualisierung         Zeichenkette
!W_Bedingungen            Zeichenkette
!W_Icon                         Zeichenkette
!W_Temperatur             Zahl                  °C
!W_Luftfeuchte            Zahl                  %
!W_Windbedingungen        Zeichenkette
!W_Windrichtung           Zeichenkette
!W_Windrichtg             Zahl                  °
!W_Windgeschwindigkeit    Zahl                  km/h
!W_Windboeen              Zahl                  km/h
!W_Luftdruck              Zahl                  mbar
!W_Luftdrucktrend         Zeichenkette
!W_Taupunkt               Zahl                  °C
!W_UV                     Zeichenkette
!W_Solar              Zahl               W/m2
!W_GefühlteLufttemp       Zahl                  °C
!W_Windkühle              Zahl                  °C
!W_Regenmenge             Zahl                  mm
!W_Regenmenge1h           Zahl                  mm
!Aussentemperatur           Zahl               °C

! var url = "http://api.wunderground.com/api/xxxxxxxxxxxxx/conditions/lang:DL/q/Germany/Berlin.xml";
var url = "http://api.wunderground.com/api/xxxxxxxxx/conditions/lang:DL/q/pws:IBRANDEN25.xml";

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

!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";
string word = "city";
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("W_Station").State(daten);

!string word = "observation_time";
string word = "observation_time_rfc822";
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));
daten = daten.Substr(0, (word_position -11));
dom.GetObject("W_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("W_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("W_Temperatur").State(zahl);
dom.GetObject("W_Aussentemperatur").State(zahl);
dom.GetObject("Aussentemperatur").State(zahl);

string word = "icon";
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));
string daten2 = daten;
!       dom.GetObject("WetterFct_Condition").State(daten);

string word = "icon_url";
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));
daten = "</div><img src=\"" + daten + "\" alt=\"" + daten2 + "\">";
dom.GetObject("W_Icon").State(daten);

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("W_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("W_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);
! Umlaute korrigieren
!
! N # Nord ***
if (anfangsbuchstabe == "N") {
!
if (daten == "Nordwest") {daten = "Nord-West" ;}
        }
 
! S # Süd ***
if (anfangsbuchstabe == "S") {
! 4 # Süd
if (word_laenge == 4)  {daten = "Süd";}
! 8 # Südwest
if (word_laenge == 8)  {daten = "Süd-West";}
! 12 # Süd-Südost
if (word_laenge == 12) {daten = "Süd-Süd-Ost" ;}
! 13
if (word_laenge == 13) {daten = "Süd-Süd-West" ;}
        }

! W # Westen
if (anfangsbuchstabe == "W") {
! 13 # West-Südwest
if (word_laenge == 13) {daten = "West-Süd-West" ;}
        }

! O # Osten
if (anfangsbuchstabe == "O") {
! 11 # Ost-Südost
if (word_laenge == 11) {daten = "Ost-Süd-Ost" ;}
        }
dom.GetObject("W_Windrichtung").State(daten);
!WriteLine(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("W_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("W_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("W_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("W_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("W_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("W_Taupunkt").State(zahl);

!W_Sonnenstrahlung                      Zahl                     W/m2
string word = "solarradiation";
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("W_Solar").State(zahl);

string word = "UV";
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("W_UV").State(zahl);

string word = "feelslike_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("W_GefühlteLufttemp").State(zahl);

string word = "windchill_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("W_Windkühle").State(zahl);

string word = "precip_today_metric";
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("W_Regenmenge").State(zahl);

string word = "precip_1hr_metric";
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("W_Regenmenge1h").State(zahl);
  
Gruß Martin
RaspberryMatic-3.59.6 auf Tinkerboard S, CUxD 2.6, XML-1.20, ioBroker (HM,HMIP, Zigbee, Zwave und Shelly) und Alexa in einer VM unter Proxmox, VitoComfort 200

just
Beiträge: 9
Registriert: 21.03.2018, 15:29

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von just » 21.03.2018, 15:32

Hallo,

auch die Systemvariable "W_Aussentemperatur" muss angelegt werden.

MartinBr
Beiträge: 393
Registriert: 25.01.2017, 10:51
Wohnort: Bei Berlin
Hat sich bedankt: 3 Mal
Danksagung erhalten: 8 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von MartinBr » 21.03.2018, 21:35

Richtig, werde ich noch oben eintragen.
Martin


Hier noch mal das Script:

Code: Alles auswählen

!Wunderground Wetterdaten 09.03.2017  
! 
! zuerst folgende Systemvariablen anlegen
! Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop
! 
!W_Station                Zeichenkette
!W_Aktualisierung         Zeichenkette
!W_Bedingungen            Zeichenkette
!W_Temperatur             Zahl                  °C
!W_Luftfeuchte            Zahl                  %
!W_Windbedingungen        Zeichenkette
!W_Windrichtung           Zeichenkette
!W_Windrichtg             Zahl                  °
!W_Windgeschwindigkeit    Zahl                  km/h
!W_Windboeen              Zahl                  km/h
!W_Luftdruck              Zahl                  mbar
!W_Luftdrucktrend         Zeichenkette
!W_Taupunkt               Zahl                  °C
!W_UV                     Zeichenkette
!W_Solar              Zahl               W/m2
!W_GefühlteLufttemp       Zahl                  °C
!W_Windkühle              Zahl                  °C
!W_Regenmenge             Zahl                  mm
!W_Regenmenge1h           Zahl                  mm
!Aussentemperatur           Zahl               °C
!W_Aussentemperatur           Zahl               °C
! 
! var url = "http://api.wunderground.com/api/xxxxxxxxxxxxx/conditions/lang:DL/q/Germany/Berlin.xml";
var url = "http://api.wunderground.com/api/xxxxxxxxx/conditions/lang:DL/q/pws:IBRANDEN25.xml";

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

!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";
string word = "city";
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("W_Station").State(daten);

!string word = "observation_time";
string word = "observation_time_rfc822";
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));
daten = daten.Substr(0, (word_position -11));
dom.GetObject("W_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("W_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("W_Temperatur").State(zahl);
dom.GetObject("W_Aussentemperatur").State(zahl);
dom.GetObject("Aussentemperatur").State(zahl);

string word = "icon";
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));
string daten2 = daten;
!       dom.GetObject("WetterFct_Condition").State(daten);

string word = "icon_url";
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));
daten = "</div><img src=\"" + daten + "\" alt=\"" + daten2 + "\">";
dom.GetObject("W_Icon").State(daten);

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("W_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("W_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);
! Umlaute korrigieren
!
! N # Nord ***
if (anfangsbuchstabe == "N") {
!
if (daten == "Nordwest") {daten = "Nord-West" ;}
        }
 
! S # Süd ***
if (anfangsbuchstabe == "S") {
! 4 # Süd
if (word_laenge == 4)  {daten = "Süd";}
! 8 # Südwest
if (word_laenge == 8)  {daten = "Süd-West";}
! 12 # Süd-Südost
if (word_laenge == 12) {daten = "Süd-Süd-Ost" ;}
! 13
if (word_laenge == 13) {daten = "Süd-Süd-West" ;}
        }

! W # Westen
if (anfangsbuchstabe == "W") {
! 13 # West-Südwest
if (word_laenge == 13) {daten = "West-Süd-West" ;}
        }

! O # Osten
if (anfangsbuchstabe == "O") {
! 11 # Ost-Südost
if (word_laenge == 11) {daten = "Ost-Süd-Ost" ;}
        }
dom.GetObject("W_Windrichtung").State(daten);
!WriteLine(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("W_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("W_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("W_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("W_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("W_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("W_Taupunkt").State(zahl);

!W_Sonnenstrahlung                      Zahl                     W/m2
string word = "solarradiation";
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("W_Solar").State(zahl);

string word = "UV";
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("W_UV").State(zahl);

string word = "feelslike_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("W_GefühlteLufttemp").State(zahl);

string word = "windchill_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("W_Windkühle").State(zahl);

string word = "precip_today_metric";
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("W_Regenmenge").State(zahl);

string word = "precip_1hr_metric";
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("W_Regenmenge1h").State(zahl);
RaspberryMatic-3.59.6 auf Tinkerboard S, CUxD 2.6, XML-1.20, ioBroker (HM,HMIP, Zigbee, Zwave und Shelly) und Alexa in einer VM unter Proxmox, VitoComfort 200

Luzzzmann
Beiträge: 14
Registriert: 04.03.2018, 18:39
Hat sich bedankt: 5 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Luzzzmann » 22.03.2018, 09:22

Hallo.

ich habe das jetzt so problemlos laufen:
Auch mit Anzeige des Wetter-Logos

Code: Alles auswählen

  
	!Stand 02.03.2018  http://homematic-forum.de/forum/viewtopic.php?f=31&t=17209
		!zuerst folgende Systemvariablen anlegen
		!Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop
		!Wetter_Station	Zeichenkette
		!Wetter_Aktualisierung			Zeichenkette
		!Wetter_Bedingungen				Zeichenkette
		!Wetter_Temperatur				Zahl		°C
		!Wetter_Luftfeuchte				Zahl		%
		!Wetter_Windbedingungen			Zeichenkette
		!Wetter_Windrichtung			Zeichenkette
		!Wetter_Windrichtg				Zahl		°
		!Wetter_Windgeschwindigkeit		Zahl		km/h
		!Wetter_Windboeen				Zahl		km/h
		!Wetter_Luftdruck				Zahl		mb
		!Wetter_Luftdrucktrend			Zeichenkette
		!Wetter_Taupunkt				Zahl		°C
		!Wetter_UV						Zeichenkette
		!Wetter_Icon					Zeichenkette
		!Wetter_Icon-url				Zeichenkette
		!Wetter_Solar					Zahl		W/m2
		!Wetter_GefühlteLufttemp		Zahl		°C
		!Wetter_Windkühle				Zahl		°C
		!Wetter_Regenmenge				Zahl		mm
		!Wetter_Regenmenge1h			Zahl		mm



            var url = "http://api.wunderground.com/api/<xxxxxxxxxxxx>/conditions/lang:DL/q/Germany/<City>.xml";

            !hier ist die Abfrage mit CUxD
            !dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
            !dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
            !string wetter_xml = dom.GetObject("CUxD.CUX2801001: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";
            string word = "city";
            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";
            string word = "observation_time_rfc822";
            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));
            daten = daten.Substr(0, (word_position -11));
            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);
            ! Umlaute korrigieren
            ! N # Nord ***
            if (anfangsbuchstabe == "N")
                     { if (daten == "Nordwest") {daten = "Nord-West" ;} }
            ! S # Süd ***
            if (anfangsbuchstabe == "S") {
               ! 4 # Süd
               if (word_laenge == 4)  {daten = "Süd";}
               ! 8 # Südwest
               if (word_laenge == 8)  {daten = "Süd-West";}
               ! 12 # Süd-Südost
               if (word_laenge == 12) {daten = "Süd-Süd-Ost" ;}
                 ! 13
               if (word_laenge == 13) {daten = "Süd-Süd-West" ;}   }

            ! W # Westen
            if (anfangsbuchstabe == "W") {
               ! 13 # West-Südwest
                if (word_laenge == 13) {daten = "West-Süd-West" ;} }

            ! O # Osten
            if (anfangsbuchstabe == "O") {
               ! 11 # Ost-Südost
               if (word_laenge == 11) {daten = "Ost-Süd-Ost" ;} }

            dom.GetObject("Wetter_Windrichtung").State(daten);
            !WriteLine(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);

            string word = "UV";
            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_UV").State(zahl);


			string word = "icon";
			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));
			string daten2 = daten;
			!       dom.GetObject("Wetter_Icon").State(daten);

			string word = "icon_url";
			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));
			daten = "</div><img src=\"" + daten + "\" alt=\"" + daten2 + "\">";
			dom.GetObject("Wetter_Icon-url").State(daten);
        

			string word = "solarradiation";
			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_Solar").State(zahl);

			string word = "feelslike_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_GefühlteLufttemp").State(zahl);

			string word = "windchill_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_Windkühle").State(zahl);

			string word = "precip_today_metric";
			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_Regenmenge").State(zahl);

			string word = "precip_1hr_metric";
			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_Regenmenge1h").State(zahl);

Tobias78
Beiträge: 1464
Registriert: 27.06.2010, 01:01
Wohnort: Braunschweig
Hat sich bedankt: 4 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Tobias78 » 11.05.2018, 21:37

Hi,
ich habe mir erlaubt, das Skript noch etwas an meine Bedürfnisse anzupassen. Ich hoffe die Adaption ist für die Ur-Skript-Entwickler OK?

Das Skript läuft soweit einwandfrei, es gibt KEINE FEHLERMELDUNGEN mehr im Log.
Die Fehlermeldung wurde durch den Abschnitt "Windbedingungen" verursacht, könnte also auch im Originalskript Fehler verursachen.

Es wird ab sofort automatisch geprüft, ob die jeweilige Variable auch existert und nur dann geändert, bzw. auch dann nur, wenn der Wert sich verändert hat.

Beseht an den neuen Funktionen Interesse?

Letzte Baustelle: Ich verwende zwingend CUxD. SystemExec ist nicht durchgängig implementiert.

Code: Alles auswählen

!*************************************************
!**       Wetter_heute_Skript                   **
!*************************************************
!13.05.2018 
! - Fehler bereinigt, so dass Systemvariablen nur bei Änderung beschrieben werden
!12.05.2018 Modifiziert von Tobias78, 
! - es werden keine negativen Nierderschlagmengen ausgegeben => korrigiert zu 0
! - es werden nur vorhandene Systemvariablen beschrieben, die die nicht gewünscht sind oder leer bleiben: nicht erstellen oder einfach löschen
! - Makro überprüft automatisch, welche Variablen vorhanden sind
! - Weitergeben der Parameter an Homeputer (optional), wenn sich diese ändern (kann über "false" ausgeschaltet werden)
! 		- hierzu in Homeputer Makro mit dem Namen "ANZ_SYS_WETTER_HEUTE" anlegen, oder URL in Zeile 46 ändern
! 		- in Homeputer im Makro ANZ_SYS_WETTER_HEUTE gleiche Variablen mit gleichem Typ anlegen, wie auf der CCU. Umlaute in HP ändern. Also ü => ue 
!   	- hierfür ist die Zusatzsoftware CL-Web-Server erforderlich
! - Systemvariable nur ändern, wenn sich der Wert ändert. So kann auf Variablenänderung getriggert werden.
! - Debug-Modus integriert, schaltbar über Variable "Debug"
! - Makro benötigt auf einem Rasperry3 ca. 12-15 Sekunden. Auf der CCU ggf. länger, also GEDULT BEIM TESTEN!
! - ICON-URL in ICON_URL umbenannt, das "-" gibt nur Probleme
!*************************************************
!Stand 02.03.2018  http://homematic-forum.de/forum/viewtopic.php?f=31&t=17209
!zuerst folgende Systemvariablen anlegen
!Achtung: Schreibweise mit Drag&Drop (nur die anlegen, die gebraucht werden!)
!W_Station   Zeichenkette 
!W_Aktualisierung         Zeichenkette
!W_Bedingungen            Zeichenkette
!W_Temperatur            Zahl      °C
!W_Luftfeuchte            Zahl      %
!W_Windbedingungen         Zeichenkette [dies könnte noch Probleme machen. Ich nutze es nicht!]
!W_Windrichtung         Zeichenkette
!W_Windrichtg            Zahl      °
!W_Windgeschwindigkeit      Zahl      km/h
!W_Windboeen            Zahl      km/h
!W_Luftdruck            Zahl      mb 
!W_Luftdrucktrend         Zeichenkette 
!W_Taupunkt            Zahl      °C 
!W_UV                  Zeichenkette
!W_Icon               Zeichenkette
!W_Icon_url            Zeichenkette
!W_Solar               Zahl      W/m2
!W_GefühlteLufttemp      Zahl      °C
!W_Windkühle            Zahl      °C 
!W_Regenmenge            Zahl      mm
!W_Regenmenge1h         Zahl      mm
		  
!-------------------------------------------------------------------------------------------------------------------------------------------
! Debugging einschalten = true oder aussschalten = false
! z.B. zum Test unter "Script testen"
!boolean debug =true;
boolean debug =false;
! ------------------------------------------------------------------------------------------------------------------------------------------
! Senden an Homeputer einschalten = "URL=" oder aussschalten = false
! CL-Web-Server und Homeputer CL müssen auf der CCU installiert sein, wenn die Funktion genutzt wird
! Achtung: Homeputer-Makro-Name muss in Großbuchstaben geschrieben werden, "=" am Ende nicht vergessen!
! Beispielurl = "http://192.168.0.3/addons/contronics/CLWebI.ccc?SETVARBYNAME&ANZ_SYS_WETTER_HEUTE=";
! 
var homeputer_url = "http://192.168.0.3/addons/contronics/CLWebI.ccc?SETVARBYNAME&ANZ_SYS_WETTER_HEUTE";
!var homeputer_url = "false";
! ------------------------------------------------------------------------------------------------------------------------------------------
!var url = "http://api.wunderground.com/api/<xxxxxxxxxxxx>/conditions/lang:DL/q/Germany/<City>.xml";
var url = "http://api.wunderground.com/api/xxxxxxxxxxxxx/conditions/lang:DL/q/Germany/EDVE.xml";
! ------------------------------------------------------------------------------------------------------------------------------------------
!hier ist die Abfrage mit CUxD 
!Achtung, CUxD wird auch weiter unten noch verwendet, um die Variablen an Homeputer zu übertragen
dom.GetObject("CUxD.CUX2801002:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801002:1.CMD_QUERY_RET").State(1);
string W_xml = dom.GetObject("CUxD.CUX2801002:1.CMD_RETS").State();

!hier ist die Abfrage mit system.Exec
!string stdout;
!string stderr;
!system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
!if(debug){WriteLine("Komplett : "#stdout);}
!WriteLine(stdout);
!string W_xml = stdout;
! ------------------------------------------------------------------------------------------------------------------------------------------
! Ab hier ist keine manuelle Einstellung mehr nötig
! ------------------------------------------------------------------------------------------------------------------------------------------
!Beim XML-File den ueberfluessigen Header entfernen
integer laenge = W_xml.Length();
integer wort_position = W_xml.Find("display_location");
W_xml = W_xml.Substr(wort_position, (laenge - wort_position));
!if(debug){WriteLine("W_xml ohne Header : "#W_xml);}

!Daten mit Suchworten aus XML-File ausfiltern:

!string word = "full";
object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Station");
if (oVar) {
	string word = "city";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Station : "#daten);}
	if (dom.GetObject("W_Station") <> 0){
		if (dom.GetObject("W_Station").Value() <> daten) {
		if(debug){WriteLine("W_Station geändert");}
		dom.GetObject("W_Station").State(daten);}
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_STATION="#daten#"'");
			if(debug) {WriteLine("spezialurl : "#spezialurl);}
			dom.GetObject("CUxD.CUX2801002:2.CMD_SETS").State("wget -q -O /dev/null '"#homeputer_url# ".W_STATION=" #daten# "'");
			dom.GetObject("CUxD.CUX2801002:2.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Aktualisierung");
if (oVar) {
	string word = "observation_time_rfc822";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	!daten = daten.Substr(0, (word_position -2));
	daten = daten.Substr(0, (word_position -11));
	if(debug){WriteLine("W_Aktualisierung : "#daten);}
	if (dom.GetObject('W_Aktualisierung').Value() <> daten) {
		dom.GetObject("W_Aktualisierung").State(daten);
		if (homeputer_url <> "false"){
			!Hier werden leider ein paar UTF Konvertierungsfehler mit übergeben. Baustelle für später
			dom.GetObject("CUxD.CUX2801002:3.CMD_SETS").State("wget -q -O /dev/null '"#homeputer_url# ".W_AKTUALISIERUNG="#daten# "'");
			dom.GetObject("CUxD.CUX2801002:3.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Bedingungen");
if (oVar) {
	string word = "weather";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Bedingungen : "#daten);}
	if (dom.GetObject("W_Bedingungen").Value() <> daten) {
		dom.GetObject("W_Bedingungen").State(daten);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_BEDINGUNGEN="#daten#"'");
			dom.GetObject("CUxD.CUX2801002:4.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:4.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Temperatur");
if (oVar) {
	string word = "temp_c";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Temperatur : "#daten);}
	real zahl = daten.ToFloat();
	if (dom.GetObject("W_Temperatur").Value() <> zahl) {
		dom.GetObject("W_Temperatur").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_TEMPERATUR="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:5.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:5.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Luftfeuchte");
if (oVar) {
	string word = "relative_humidity";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Luftfeuchte : "#daten);}
	integer zahl = daten.ToFloat();
	if (dom.GetObject("W_Luftfeuchte").Value() <> zahl) {
		dom.GetObject("W_Luftfeuchte").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_LUFTFEUCHTE="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:6.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:6.CMD_RUNS").State(1);
}}}


object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Windbedingungen");
if (oVar) {
	string word = "wind_string";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if (debug){WriteLine("W_Windbedingungen : "#daten);}
	if (dom.GetObject("W_Windbedingungen").Value() <> daten) {
		dom.GetObject("W_Windbedingungen").State(daten);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_WINDBEDINGUNGEN="#daten#"'");
			dom.GetObject("CUxD.CUX2801002:7.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:7.CMD_RUNS").State(1);
}}}

!HIER MUSS DER FEHLER ZWISCHEN SEIN!
object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Windrichtung");
if (oVar) {
	string word = "wind_dir";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("wind_dir : "#daten);}
	word_laenge =daten.Length();
	string anfangsbuchstabe = daten.Substr(0,1);
	! Umlaute korrigieren
	! N # Nord ***
	if (anfangsbuchstabe == "N")
		 { if (daten == "Nordwest") {daten = "Nord-West" ;} }
	! S # Süd ***
	if (anfangsbuchstabe == "S") {
	! 4 # Süd
	if (word_laenge == 4)  {daten = "Süd";}
	if (word_laenge == 8)  {daten = "Süd-West";}
	! 12 # Süd-Südost
	if (word_laenge == 12) {daten = "Süd-Süd-Ost" ;}
	 ! 13
	if (word_laenge == 13) {daten = "Süd-Süd-West" ;}   }

	! W # Westen
	if (anfangsbuchstabe == "W") {
	! 13 # West-Südwest
	if (word_laenge == 13) {daten = "West-Süd-West" ;} }

	! O # Osten
	if (anfangsbuchstabe == "O") {
	! 11 # Ost-Südost
	if (word_laenge == 11) {daten = "Ost-Süd-Ost" ;} }

	if (dom.GetObject("W_Windrichtung").Value() <> daten) {
		dom.GetObject("W_Windrichtung").State(daten);
		if(debug){WriteLine("W_Windrichtung : "#daten);}
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_WINDRICHTUNG="#daten#"'");
			dom.GetObject("CUxD.CUX2801002:8.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:8.CMD_RUNS").State(1);
}}}
!HIER MUSS DER FEHLER ZWISCHEN (oben) SEIN!

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Windrichtg");
if (oVar) {
	string word = "wind_degrees";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_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();
	if(debug){WriteLine("W_Windrichtg : "#daten);}
	if (dom.GetObject("W_Windrichtg").Value() <> zahl) {
		dom.GetObject("W_Windrichtg").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_WINDRICHTG="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:9.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:9.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Windgeschwindigkeit");
if (oVar) {
	string word = "wind_kph";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Windgeschwindigkeit : "#daten);}
	integer zahl = daten.ToFloat();
	if (dom.GetObject("W_Windgeschwindigkeit").Value() <> zahl) {
		dom.GetObject("W_Windgeschwindigkeit").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_WINDGESCHWINDIGKEIT="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:10.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:10.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Windboeen");
if (oVar) {
	string word = "wind_gust_kph";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Windboeen : "#daten);}
	integer zahl = daten.ToFloat();
	if (dom.GetObject("W_Windboeen").Value() <> zahl) {
		dom.GetObject("W_Windboeen").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_WINDBOEEN="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:11.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:11.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Luftdruck");
if (oVar) {
	string word = "pressure_mb";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Luftdruck : "#daten);}
	integer zahl = daten.ToFloat();
	if (dom.GetObject("W_Luftdruck").Value() <> zahl) {
		dom.GetObject("W_Luftdruck").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_LUFTDRUCK="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:12.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:12.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Luftdrucktrend");
if (oVar) {
	string word = "pressure_trend";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Luftdrucktrend : "#daten);}
	if (dom.GetObject("W_Luftdrucktrend").Value() <> daten) {
		dom.GetObject("W_Luftdrucktrend").State(daten);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_LUFTDRUCKTREND="#daten#"'");
			dom.GetObject("CUxD.CUX2801002:13.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:13.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Taupunkt");
if (oVar) {
	string word = "dewpoint_c";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_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();
	if(debug){WriteLine("W_Taupunkt : "#zahl);}
		if (dom.GetObject("W_Taupunkt").Value() <> zahl) {
		dom.GetObject("W_Taupunkt").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_TAUPUNKT="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:14.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:14.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_UV");
if (oVar) {
	string word = "UV";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_UV_daten : "#daten);}
	real zahl = daten.ToFloat();
	if (zahl < 0) {zahl = 0;}
	if(debug){WriteLine("W_UV : "#zahl);}
	if (dom.GetObject("W_UV").Value() <> zahl) {
		dom.GetObject("W_UV").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_UV="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:15.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:15.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Icon");
if (oVar) {
	string word = "icon";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge + 1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position-2));
	if(debug){WriteLine("W_Icon : "#daten);}
	string daten2 = daten;
	if (dom.GetObject("W_Icon").Value() <> daten) {
		dom.GetObject("W_Icon").State(daten);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_ICON="#daten#"'");
			dom.GetObject("CUxD.CUX2801002:16.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:16.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Icon_url");
if (oVar) {        
	string word = "icon_url";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge + 1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position-2));
	daten = "</div><img src=\"" + daten + "\" alt=\"" + daten2 + "\">";
	if(debug){WriteLine("W_Icon_url : "#daten);}
	if (dom.GetObject("W_Icon_url").Value() <> daten) {
		dom.GetObject("W_Icon_url").State(daten);
!Wird nicht an HP übertragen, da dies über die Schnittstelle Fehler verursacht
			if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_ICON_URL="#daten#"'");
			dom.GetObject("CUxD.CUX2801002:2.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:2.CMD_RUNS").State(1);
}}}


object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Solar");
if (oVar) {   
	string word = "solarradiation";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_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();
	if(debug){WriteLine("W_Solar : "#daten);}
	if (dom.GetObject("W_Solar").Value() <> zahl) {
		dom.GetObject("W_Solar").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_SOLAR="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:3.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:3.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_GefühlteLufttemp");
if (oVar) {   
	string word = "feelslike_c";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_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();
	if(debug){WriteLine("W_GefühlteLufttemp : "#daten);}
	if (dom.GetObject("W_GefühlteLufttemp").Value() <> zahl) {
		dom.GetObject("W_GefühlteLufttemp").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_GEFUEHLTELUFTTEMP="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:4.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:4.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Windkühle");
if (oVar) {  
	string word = "windchill_c";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Windkühle : "#daten);}
	real zahl = daten.ToFloat();
	if (dom.GetObject("W_Windkühle").Value() <> zahl) {
		dom.GetObject("W_Windkühle").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_WINDKUEHLE="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:5.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:5.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Regenmenge");
if (oVar) {  
	string word = "precip_today_metric";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_xml.Substr((word_position + word_laenge +1), 100);
	integer word_position = daten.Find(word);
	daten = daten.Substr(0, (word_position -2));
	if(debug){WriteLine("W_Regenmenge : "#daten);}
	real zahl = daten.ToFloat();
	if (zahl < 0) {zahl = 0;}
	if (dom.GetObject("W_Regenmenge").Value() <> zahl) {
		dom.GetObject("W_Regenmenge").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_REGENMENGE="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:6.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:6.CMD_RUNS").State(1);
}}}

object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get ("W_Regenmenge1h");
if (oVar) { 
	string word = "precip_1hr_metric";
	integer word_laenge = word.Length();
	integer word_position = W_xml.Find(word);
	string daten = W_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();
	if (zahl < 0) {zahl = 0;}
	if(debug){WriteLine("W_Regenmenge1h : "#zahl);}
	if (dom.GetObject("W_Regenmenge1h").Value() <> zahl) {
		dom.GetObject("W_Regenmenge1h").State(zahl);
		if (homeputer_url <> "false"){
			var spezialurl = ("wget -q -O /dev/null '"#homeputer_url#".W_REGENMENGE1h="#zahl#"'");
			dom.GetObject("CUxD.CUX2801002:7.CMD_SETS").State(spezialurl);
			dom.GetObject("CUxD.CUX2801002:7.CMD_RUNS").State(1);
	}}}
Gruß, Tobias.

P.S.: Skript am 12.05. 09:00 aktualisiert
P.S.: Skript am 12.05. 14:00 aktualisiert
P.S.: Skript am 13.05. 10:30 aktualisiert
--------------------------------------------
Im Einsatz und empfehlenswert:
RaspberryMatic,IO.Broker, Homeputer Studio; CuXD; PocketControl, HomeStatus, Robonect, Alexa, io.Broker
------------------------------------------

grmpf
Beiträge: 684
Registriert: 21.01.2012, 12:16
Hat sich bedankt: 8 Mal
Danksagung erhalten: 7 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von grmpf » 23.05.2018, 15:07

Wunderground ist seit über einem Jahr extrem unzuverlässig. Das führte bei mir dazu, dass mit ~95%iger-Sicherheit der wget Befehl des Skripts der Grund für die Hänger meiner CCU2 (alle 10-20 Tage) war. Ich habe diesen ausgebaut und tatsächlich läuft die CCU2 seit fast 40 Tagen problemlos. Ist zwar noch kein Beweis - aber ein starkes Indiz!

Ich schicke mir seither die Wetterdaten von meinem Wetterserver direkt als XML-Datei auf die CCU und verarbeite sie mit dem hier veröffentlichten wunderground-Skript.
Gert
________________________________
Raspi 3B+ RaspberryMatic HM+HMIP, LAN-Rep., >80 Geräte, ~180 sichtb. Kanäle, (leider) nur Funk, hoher WAF trotz analogem Wife
Raspi 3B Raspberrymatic (HM, 18x Rollladensteuerung und HMIP Heizungssteuerung in Altbau)
CCU3 (Neubauinst.) HMIPW (3x DRI, 5x DRS, kpl. FB-HZG-Steurung) plus HMIP 23x BROLL und einige Bew-/Wasser-Melder

Antworten

Zurück zu „Projektvorstellungen“