Wunderground Wetter mit einfachem HM-Skript holen

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

exo1987
Beiträge: 4
Registriert: 13.10.2017, 17:38

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von exo1987 » 13.10.2017, 17:49

Hallo,

ich betreibe eine Homematic CCU2 im Zusammenspiel mit OpenHab. OpenHab generiert sehr viele Logeinträge durch Systemvariablen und Programme, die Leerzeichen enthalten, deswegen würde es mich interessieren wie man die Systemvariable WD0_Windrichtung 1 in WD0_Windrichtung_1 umbenennen kann. Dies würde ich gerne für WD0-WD3 machen und auch für Windrichtung 2 WD0 - WD3. Einfach die Systemvariablen umbenennen und im Skript die folgenden Zeilen

string F9 = "maxwind,dir,1,2,5,Windrichtung 2,";!Zeichenkette

und

string F11 = "avewind,dir,1,2,5,Windrichtung 1,";!Zeichenkette

anpassen, funktioniert nicht.
Danke für eure Hilfe.
VG Chris

poisonwillow
Beiträge: 7
Registriert: 13.05.2015, 16:08

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von poisonwillow » 04.12.2017, 09:35

Hallo zusammen,

habe die 39 Seiten mittlerweile durch und mein Script Wetterdaten abholen und die Variablen befüllen klappt auch, aber NUR wenn ich das zugehörige Programm manuell ausführe...Es macht mir einfach nicht die 10 Minütige Ausführung... Bin ich betriebsblind ? Hat mir jemand einen entscheidenden Tip ?
Bild1.JPG
Bild2.JPG
bild3.JPG
CCU2 mit IFTTT/WU/NEO und jeder Menge LED Lampen im Einsatz

robsdobs
Beiträge: 510
Registriert: 08.08.2015, 22:52
Danksagung erhalten: 1 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von robsdobs » 04.12.2017, 09:42

Stelle mal bei "nur prüfen" was anderes ein.
sehr selten im Forum

poisonwillow
Beiträge: 7
Registriert: 13.05.2015, 16:08

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von poisonwillow » 04.12.2017, 12:23

robsdobs hat geschrieben:Stelle mal bei "nur prüfen" was anderes ein.
Ich könnte schwören das hatte ich am Anfang auch eingestellt, und nachdem ich ettliches geändert hatte bin ich irgendwann bei "nur prüfen" hängen geblieben.

Nachdem ich jetzt wieder umgestellt habe auf "zu Zeitpunkten auslösen" läufts auf einmal...

Danke an den stubser :-)
CCU2 mit IFTTT/WU/NEO und jeder Menge LED Lampen im Einsatz

kafisc
Beiträge: 131
Registriert: 08.09.2015, 15:14
Hat sich bedankt: 18 Mal
Danksagung erhalten: 4 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von kafisc » 09.12.2017, 15:14

Hi zusammen,

bei mir läuft seit gestern Nacht folgendes Skript nicht mehr mit folgendem Fehler:

Fehlermeldung:

Code: Alles auswählen

homematic-raspi local0.err ReGaHss: Error: IseESP::ScriptRuntimeError: !
Skript

Code: Alles auswählen

! Wettervorhersage von wunderground holen

!Stand 21.08.2017  https://homematic-forum.de/forum/viewtopic.php?t=17209

!zuerst folgende Systemvariablen anlegen
!Achtung: keine vergessen und exakte Schreibweise mit Copy & Paste

!WV_Tag                        Zeichenkette -> Forecast fuer welchen Wochentag
!WV_Kondition               Zeichenkette -> Forecast Wetterbedingung
!WV_Icon                       Zeichenkette -> Forecast URL zu Pictogramm (zeigt Bild im Protokoll / Systemvariablen)
!WV_Text                       Zeichenkette -> Forecast Text (max 200 Zeichen)
!Max_Temp_Heute               Zahl         °C -> Forecast Maximale Temperatur
!Regenwahrsch_Heute             Zahl          % -> Forecast Regenwahrscheinlichkeit (probability of precipation)
!WV_Zeit                       Zeichenkette -> Forecast erstellt um diese Zeit

var url = "http://api.wunderground.com/api/xxxxxxx/forecast/lang:DL/q/Germany/Sindelfingen.xml";

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

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

    !hier den Auszugebenden tag anpassen, period 2 ist der nächste tag
    integer wort_position = wetter_xml.Find("period 2");
    wetter_xml = wetter_xml.Substr(wort_position, (laenge - wort_position));
    !WriteLine(wetter_xml);

    !Daten mit Suchworten aus XML-File ausfiltern:
    string word = "title";
    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));
    WriteLine(daten);
    dom.GetObject("WV_Tag").State(daten);

    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("WV_Kondition").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("WV_Icon").State(daten);

    string word = "fcttext_metric";
    integer word_laenge = word.Length();
    integer word_position = wetter_xml.Find(word);
    string daten = wetter_xml.Substr((word_position + word_laenge + 1 + 9), 200);
    integer word_position = daten.Find(word);
    daten = daten.Substr(0, (word_position-5));
    !umlaut ö finden, zeichen ö   
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¶"))
    {
       if (txtneu == "")
       {
           txtneu = teilstr;
       }else{
           txtneu = txtneu # "ö" # teilstr;
       }
    }
    daten = txtneu;

    !umlaut ü finden, zeichen ü   
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¼"))
    {
       if (txtneu == "")
       {
          txtneu = teilstr;
       }else{
          txtneu = txtneu # "ü" # teilstr;
       }
    }
    daten = txtneu;

    !umlaut ä finden, zeichen ä
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¤"))
    {
       if (txtneu == "")
       {
          txtneu = teilstr;
       }else{
          txtneu = txtneu # "ä" # teilstr;
       }
    }
    daten = txtneu;

    !umlaute korrigiert, zeichen à entfernen
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("Ã"))
    {
       if (txtneu == "")
      {
         txtneu = teilstr;
      }else{
         txtneu = txtneu # "" # teilstr;
      }
    }
    daten = txtneu;
    
    dom.GetObject("WV_Text").State(daten);

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

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

    string word = "pretty_short";
    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("WV_Zeit").State(daten);
Es werden noch folgende Variablen befüllt:
WV_Tag
WV_Kondition
WV_Icon
WV_Text

Ist das bei euch auch so? Bin für jeden Tipp dankbar.

Grüße
kafisc

Benutzeravatar
papi
Beiträge: 371
Registriert: 18.12.2013, 08:40
Wohnort: Willich, NRW
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von papi » 09.12.2017, 16:34

Nö, geht noch.

Prüfe doch mal den in Deinem Skript aufzurufenden Link im Browser, ob und vor allem welche Daten er zurückliefert.
Ggfs. musst Du Dir eine alternative Wetterstation suchen.

Benutzeravatar
Moonrider
Beiträge: 66
Registriert: 25.08.2017, 13:17

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Moonrider » 27.12.2017, 16:00

Ich hab mal eine Frage.
Ich möchte den Sonnenauf und Sonnenuntergang mit angezeigt haben und weiterverarbeiten. Nun kann ich mir ja die "Befehle" oder besser Namen für die Werte bei wunderground holen.
Da ich aber nicht mehr unter forecast oder conditions bin, sondern unter astronomy, muss ich auch eine andere URL abfragen. Siehe Bild unten.
Soweit so gut, wenn ich das richtig verstanden habe.
Nun mein Problem, kann ich einfach das hier vorliegende Skript nehmen, die andere URL eintragen, Systemvariablen anlegen und soweit alles rausschmeisen und nur durch Sonnenaufgang und Untergang ersetzen ? Da ich skripttechnisch nicht so der Held bin, wäre es nett, wenn mir einer sagen könnte was ich unbedingt brauche und was raus kann.

So long
dd.PNG
So long

Marcus

Benutzeravatar
Moonrider
Beiträge: 66
Registriert: 25.08.2017, 13:17

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Moonrider » 27.12.2017, 20:39

So, als absoluter Skriptidiot hab ich mich jetzt mal datan gewagt. Wie erwartet ohne Erfolg. Vielleicht kann mir jemand sagen was ich falsch mache. (wahrscheinlich alles).

1. Ich habe eine Systemvariable W_Sonnenuntergang als Zahl angelegt. (ich habe es auch als Zeichenkette versucht, ging auch nicht)
2. Dann habe ich ein Zeitprogramm ganztägig, alle 1 stunde angelegt mit folgendem Skript. Bei dem Skript handelt es sich um das hier bekannte Skript für die Wetterdaten.
3. Api link funktioniert.

API Link

Code: Alles auswählen

<response><version>0.1</version><termsofService>http://www.wunderground.com/weather/api/d/terms.html</termsofService><features><feature>astronomy</feature></features><moon_phase><percentIlluminated>65</percentIlluminated><ageOfMoon>9</ageOfMoon><current_time><hour>20</hour><minute>20</minute></current_time><sunset><hour>16</hour><minute>26</minute></sunset><sunrise><hour>8</hour><minute>03</minute></sunrise><moonset><hour>0</hour><minute>48</minute></moonset><moonrise><hour>12</hour><minute>53</minute></moonrise></moon_phase><sun_phase><sunset><hour>16</hour><minute>26</minute></sunset><sunrise><hour>8</hour><minute>03</minute></sunrise></sun_phase></response>

Skript

Code: Alles auswählen

!Astrodaten von wunderground.com holen



        
      var url = "http://api.wunderground.com/api/trallalla/astronomy/lang:DL/q/Germany/pws:IOBOBERH4.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("observation_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));
        daten = daten;
        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));

string Text01=daten.StrValueByIndex(" ", 0);
string Text02=daten.StrValueByIndex(" ", 1);
string Text03=daten.StrValueByIndex(" ", 2);
string Text04=daten.StrValueByIndex(" ", 3);
string Text05=daten.StrValueByIndex(" ", 4);

string wochentag = "";
if (Text01 == "Mon,") {wochentag = "Montag" ;}
if (Text01 == "Tue,") {wochentag = "Dienstag" ;}
if (Text01 == "Wed,") {wochentag = "Mittwoch" ;}
if (Text01 == "Thu,") {wochentag = "Donnerstag" ;}
if (Text01 == "Fri,") {wochentag = "Freitag" ;}
if (Text01 == "Sat,") {wochentag = "Samstag" ;}
if (Text01 == "Sun,") {wochentag = "Sonntag" ;}

if(Text03=="Jan") {Text03 = "Januar" ;}
if(Text03=="Feb") {Text03 = "Februar" ;}
if(Text03=="Mar") {Text03 = "März" ;}
if(Text03=="Apr") {Text03 = "April" ;}
if(Text03=="May") {Text03 = "Mai" ;}
if(Text03=="Jun") {Text03 = "Juni" ;}
if(Text03=="Jul") {Text03 = "Juli" ;}
if(Text03=="Aug") {Text03 = "August" ;}
if(Text03=="Sep") {Text03 = "September" ;}
if(Text03=="Oct") {Text03 = "Oktober" ;}
if(Text03=="Nov") {Text03 = "November" ;}
if(Text03=="Dec") {Text03 = "Dezember" ;}

string outText= wochentag # ", " # Text02 # ". " # Text03 # " " # Text04 # " / " # Text05 # " Uhr";
daten = outText;

        dom.GetObject("W_Sonnenuntergang").State(daten);
 
        string word = "sunset";
        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_Sonnenuntergang").State(daten);

Ich habe echt ganz wenig Ahnung von Skripten und habe gelöscht was ich gedacht habe. Habt Nachsicht mit mir, ich lern es schon noch. :lol:
Zuletzt geändert von alchy am 27.12.2017, 21:03, insgesamt 2-mal geändert.
Grund: Code in Codetags posten
So long

Marcus

ecky78
Beiträge: 164
Registriert: 03.06.2016, 21:55
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 51 Mal
Danksagung erhalten: 8 Mal

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von ecky78 » 27.12.2017, 20:59

Kurze Zwischenfrage: Warum nutzt du nicht die Astro-Funktion, die die CCU schon mitbringt?

Code: Alles auswählen

var auf = system.SunriseTime("%H:%M").ToString();
var ab = system.SunsetTime("%H:%M").ToString();
WriteLine(auf);
WriteLine(ab);
Grüße, Ecky
Grüße,
Ecky

Benutzeravatar
Moonrider
Beiträge: 66
Registriert: 25.08.2017, 13:17

Re: Wunderground Wetter mit einfachem HM-Skript holen

Beitrag von Moonrider » 27.12.2017, 21:05

Ich dachte immer, die (Zeitsteuerung) wäre nicht so zuverlässig.
Außerdem geht es mir denke ich mehr ums basteln mit dem Skript. Ich finde es super, was hier einige für tolle Skripte schreiben und ich versuche es wenigstens halbwegs zu verstehen. Das ist mehr learning by doing.
Aber trotzdem danke für den Tipp
So long

Marcus

Antworten

Zurück zu „Projektvorstellungen“