Wetterstation wechselnde Grafik anzeigen

Wetterstation wechselnde Grafik anzeigen

Beitragvon steffen.krause » 6. Oktober 2015, 22:55

Ich möchte den Grafik-Link, den ich von http://www.wunderground.com zurückbekomme als kleines Symbol für das aktuelle Wetter anzeigen lassen. Auszug aus der xml Datei sieht wie beispielsweise wie folgt aus - <icon_url>http://icons.wxug.com/i/c/k/nt_cloudy.gif</icon_url>. Das habe ich erst mal auf der CCU2 in eine Variable schreiben lassen. Da sich das Wetter ändert und somit auch die Grafik, kann ich nicht einfach die URL unter Webseite im aoi NEO Creator hinterlegen. Hat jemand eine Idee? Kann ich die Variable irgendwie als HTML aus der CCU2 auslesen?
steffen.krause
 
Beiträge: 7
Registriert: 6. Oktober 2015, 22:39

Re: Wetterstation wechselnde Grafik anzeigen

Beitragvon zdenko33 » 7. Oktober 2015, 06:24

Hallo
Ich weiss nicht wie du die daten von wunderground holst, aber ich zeige dir wie ich es mache an der ccu:
zuerst dieses script, dort steht welche variablen du in der ccu anlegen musst und von velchem typ.
Es gibt zwei werte welches die xml datei für icon zurückliefert, einmal icon und einmal icon_url
das mit icon_url finde ich komplizierter, weil icon genaudasselbe liefert nur ohne den ganzen kram für webseite
z.b liefert icon das:

<icon>partlycloudy</icon>
icon_url liefert die ganze url mit .gif endung am ende
<icon_url>http://icons.wxug.com/i/c/k/nt_partlycloudy.gif</icon_url>

Unterschied am ganzen ist wenn du die 2 ergebnisse siehst, das icon ein einfaches wort partycloudy liefert ohne gif und ohne url
dieses ist für darstellung im neo als status viel einfacher...
so jetzt das script:
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
            !Wetter_Icon                                Zeichenkette

            var url = "http://api.wunderground.com/api/f9641ab1988958bc/conditions/lang:DL/q/Germany/Leer.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 = "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 = "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);


Nachdem du dieses script ausführst in der ccu werden alle angelegten variablen befüllt, so auch die variable Wetter_Icon
Für diese variable machst du dann eine statusanzeige (statusgrafik) im neo
Natürlich must du wissen was wunderground alles für grafiken liefert beim verschiedenen wetterbedingungen
Da du aber die url weisst für das wetter icon:
http://icons.wxug.com/i/c/k/nt_partlycloudy.gif
ist das kein problem, und icon liefert dasselbe ohne die .gif endung die du gar nicht brauchst, sondern fürs statusgrafiken .png endung
Ob du weisst wie das mit eigenen statusgrafiken geht weiss ich nicht aber kurz erklärt:
sagen wir mal das xml file liefert uns 3 verschiedene namen fürs icon
1. partlycloudy
2. sunny
3. cloudy
usw
jetzt legst du im neo eine grafik an und weist du der einen status für die variable Wetter_Icon
gehst du auf obige url fürs icon
http://icons.wxug.com/i/c/k/nt_partlycloudy.gif
öffnest im browser und so machst du für jede grafik
änderst nur den namen der grafik hinter /nt_
z.b nt_sunny
alle grafiken speicherst du in einem ordner, ich weiss nicht ob neo gif verarbeiten kann für statusanzeige, dann musst du mit einem programm die grafiken in png format abspeichern, oder noch besser es gibt so viele icons für wetter im web für verschiedene wetter zustandsnamen, holst du dir diese im png format und änderst nur die namen so um, wie underground seine icons nennt: cloudy, sunny, usw.
schau hier
http://www.binicki.de/flip2
falls dir die wetter grafiken gefallen kannst du sie so laden
http://binicki.de/flip2/images/weather/1.png
die zahl 1 änderst du von 1-44

Jetzt importierst du die grafiken im neo unter importieren status grafik
zuerst brauchst du erstmal eine für undefined und default zustand, das können egal welche sein und heissen undefined.png, default.png
alle andere nennst du state_cloudy.png, state_sunny.png usw. davor immer state_
deine wettergrafiken müssen nicht state_ heissen sondern diesen namen vergibst du beim importieren
am besten kannst du bei mediola nachsehen, habe ich in einem fb thread beschrieben:
https://www.facebook.com/mediola.haussteuerung/posts/911036425616391
dort steht auch das bild vom neo import für status grafiken....
viel spass :lol:
zdenko33
 
Beiträge: 253
Registriert: 8. Dezember 2014, 20:52

Re: Wetterstation wechselnde Grafik anzeigen

Beitragvon steffen.krause » 7. Oktober 2015, 08:20

Danke für die ausführliche Beschreibung. Ich werde den Weg mit den localen Icons ausprobieren. Da ich die verschiedenen Icons der Wetterzustände von wunderground.com noch nicht alle zusammen habe wollte ich die mir einfach über die URL direkt anzeigen lassen. Jetzt muß ich mal ein bischen beobachten und sammeln was die so alles anbieten und diese Bildchen (oder eben andere die zum Style der Oberfläche passen) einbinden. Die Grafik Importfunktion habe ich schon getestet. Geht ganz gut.
steffen.krause
 
Beiträge: 7
Registriert: 6. Oktober 2015, 22:39

Re: Wetterstation wechselnde Grafik anzeigen

Beitragvon zdenko33 » 7. Oktober 2015, 08:27

nichts zu danken :)

steffen.krause hat geschrieben: Da ich die verschiedenen Icons der Wetterzustände von wunderground.com noch nicht alle zusammen habe wollte ich die mir einfach über die URL direkt anzeigen lassen.

das wäre schön wenn mediola so etwas einbauen würde, einfach wie statusgrafiken eine webseite nach dem zustand einer variable. Aber das geht noch nicht, wäre sicher einfach einzubauen. Ich denke wenn, dann werden wir lange warten müssen :) oder auch nicht ;)
gruss
zdenko33
 
Beiträge: 253
Registriert: 8. Dezember 2014, 20:52


Zurück zu mediola AIO CREATOR NEO

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron