Aussentemperatur von OpenWeatherMap.Org laden

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Peter0961
Beiträge: 55
Registriert: 17.04.2014, 22:38
Hat sich bedankt: 16 Mal
Danksagung erhalten: 2 Mal

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von Peter0961 » 12.02.2015, 16:50

Hallo! :?:

Funktioniert das Ganze auch ohne CUxD ?

nibblersrevenge
Beiträge: 27
Registriert: 08.10.2014, 09:38

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von nibblersrevenge » 12.02.2015, 17:02

JA, funktioniert natürlich auch ohne CUxD.

Der folgende Code läuft bei mir seit 6 Monaten fehlerfrei (mir reicht die Außentemperatur) .
Vorraussetzung: Systemvariiable mit dem Namen: 'AussenTemperatur'

Code: Alles auswählen

string weatherUrl='http://api.openweathermap.org/data/2.5/find?q=Berlin';

string stderr;
string stdout;
system.Exec("wget -q -O - "#weatherUrl, &stdout, &stderr);

string pos1='{"temp":';
string pos2=',';
integer tempPos=stdout.Find(pos1) +  pos1.Length();
stdout=stdout.Substr(tempPos,100).StrValueByIndex(pos2,0);

real aktTemp=stdout.ToFloat()-273.15;
if (aktTemp>-272){
    dom.GetObject('AussenTemperatur').Variable((stdout.ToFloat()-273.15)); 
}

Peter0961
Beiträge: 55
Registriert: 17.04.2014, 22:38
Hat sich bedankt: 16 Mal
Danksagung erhalten: 2 Mal

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von Peter0961 » 05.03.2015, 17:01

Hallo,

bei mir fehlen im WebUi hinter den Temperaturen und den anderen Werten,
die Zeichen für %, km/s, °C, hPa usw.
Ich verwende das Script Version 0r2
Kann mir da jemand weiter helfen?

nibblersrevenge
Beiträge: 27
Registriert: 08.10.2014, 09:38

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von nibblersrevenge » 06.03.2015, 15:46

Hallo Peter0961,

die Werte werden (zumindest von mir) zur Weiterverwendung ohne Einheiten gespeichert.
Suche im Script nach Einträgen wie z.B.:

Code: Alles auswählen

dom.GetObject("W_Wind_Speed").Variable(a_wert.ToString(1));
und setze die Einheit mi +"xxx" dazu:

Code: Alles auswählen

dom.GetObject("W_Wind_Speed").Variable(a_wert.ToString(1) + "m/s" );

Wagi2
Beiträge: 31
Registriert: 16.02.2015, 13:28

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von Wagi2 » 06.03.2015, 22:15

Warum nicht in den Systemvariablen bei der Definition eine Einheit angeben?
Ich denke ein String daraus zu machen hat den Nachteil dass du die Wertgrösse nicht auswerten kannst. Ich nutze z. B. die aussentemp. um eine Mail an meine Frau und mich zu schicken wenn Fenster länger als 10/20 Minuten auf und Temperatur <10°C/18°C dann email an alle Familienmitglied oder Windgeschwindigkeit >56km/h und Fenster auf Dann auch email.

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

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von papi » 31.03.2015, 13:42

Was macht Ihr denn mit den Werten, die nur temporär von OpenWeatherMap geliefert werden?

Ich habe gerade noch die Abfrage der Windböen ("Gust") mit eingebaut, aber dieser Wert wird nicht dauerhaft von der Seite geliefert.
Eben kam er noch mit, jetzt ist er weg, genau wie die Böe. :lol:
Die Variable in der CCU behält aber natürlich dann ihren Wert, das ist doof.

Code: Alles auswählen

    ! Windboeen
           string pos1="\"gust\":";
           string pos2=",";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           a_wert = wert.ToFloat() / 3.6;    ! Umrechnung in km pro Stunde
           dom.GetObject("VAR_OWM_Wind_Gust").Variable(a_wert.ToString(1));
           WriteLine("Windböen: " + a_wert.ToString(1) +" km/h");
Wenn kein Wert geliefert wird, müsste man dann doch irgendwie/irgendwann den Wert auf Null setzen?!
Das Gleiche hätten wir ja auch z.B. bei Nebel und Schnee.

Edit:

Erschwerend kommt noch dazu, dass der Wert aus der Windberechnung, die bei mir vorher abläuft, dann in der Böenberechnung wieder verwendet wird, weil er nicht durch den neuen Böenwert ersetzt wird, weil die Vaiablen den gleichen Namen haben:

Code: Alles auswählen

    ! Windgeschwingigkeit
           string pos1="\"wind\":{\"speed\":";
           string pos2=",";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           a_wert = wert.ToFloat() / 3.6;    ! Umrechnung in km pro Stunde
             if (a_wert <     0.00) {txt = "Fehler";                      } else {
             if (a_wert <     1.85) {txt = "Windstille";                  } else { 
             if (a_wert <     9.00) {txt = "geringer Wind";               } else {
             if (a_wert <    19.00) {txt = "leichter Wind";               } else {
             if (a_wert <    28.00) {txt = "schwacher Wind";              } else {
             if (a_wert <    37.00) {txt = "mäßiger Wind";                } else {
             if (a_wert <    46.00) {txt = "frischer Wind";               } else {
             if (a_wert <    56.00) {txt = "starker Wind";                } else {
             if (a_wert <    65.00) {txt = "starker bis stürmischer Wind";} else {
             if (a_wert <    74.00) {txt = "stürmischer Wind";            } else {
             if (a_wert <    83.00) {txt = "Sturm";                       } else {
             if (a_wert <   102.00) {txt = "schwerer Sturm";              } else {
             if (a_wert <   117.00) {txt = "orkanartiger Sturm";          } else {
             if (a_wert >=  117.00) {txt = "Orkan";                      }}}}}}}}}}}}}}
           dom.GetObject("VAR_OWM_Wind").State(txt);
           dom.GetObject("VAR_OWM_Wind_Speed").Variable(a_wert.ToString(1));
           WriteLine("Windgeschwindigkeit: " + txt + " mit " + a_wert.ToString(1) +" km/s");

    ! Windboeen
           string pos1="\"gust\":";
           string pos2=",";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           a_wert = wert.ToFloat() / 3.6;    ! Umrechnung in km pro Stunde
           dom.GetObject("VAR_OWM_Wind_Gust").Variable(a_wert.ToString(1));
           WriteLine("Windböen: " + a_wert.ToString(1) +" km/s");
Macht es Sinn, die Variable a_wert durch eine Vaiable b_wert zu ersetzen?
Oder kann ich eine der Variablen zu Beginn der Routine auf Null setzen, also quasi resetten? (wert = "0")?
Zuletzt geändert von papi am 31.03.2015, 14:15, insgesamt 1-mal geändert.

apollon77
Beiträge: 308
Registriert: 12.10.2013, 12:32

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von apollon77 » 31.03.2015, 14:05

Hm ... am Anfang als "Loakle Variablen" alle Werte auf die "Default/Nicht gesetzt"-Werte setzen und dann mit den Werten des Partners überschreiben und dann am Schluss in die Systemvariablen übertragen ... immer alle ...

nibblersrevenge
Beiträge: 27
Registriert: 08.10.2014, 09:38

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von nibblersrevenge » 31.03.2015, 14:06

hallo papi,
ich benötige nur die Aussentemperatur.

Der richtige weg wäre meiner Meinung nach vor dem setzen der Variable diese zu nullen.
Wenn ein neuer Wert vorhanden ist, wird der Nullwert dann gleich wieder ersetzt.

Code: Alles auswählen

 ! Windboeen
           ! ### Variable zurücksetzen ###
           dom.GetObject("VAR_OWM_Wind_Gust").Variable('-');

           string pos1="\"gust\":";
           string pos2=",";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           a_wert = wert.ToFloat() / 3.6;    ! Umrechnung in km pro Stunde
           dom.GetObject("VAR_OWM_Wind_Gust").Variable(a_wert.ToString(1));

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

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von papi » 31.03.2015, 14:18

Ach, ich hatte während des Editierens meines Beitrags gar nicht bemerkt, dass Du schon geantwortet hast.
Danke, das werde ich mal versuchen. Das ist wohl genau das, was ich gesucht habe.

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

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von papi » 31.03.2015, 14:29

Hm, irgendetwas klappt da nicht.

Ich habe zurzeit immer eine Windgeschwindigkeit von 0,7 Km/h und eine Böe von 0,6 Km/h, obwohl gar kein Wert von der API geliefert wird und obwohl ich den Reset mit verbaut habe.

Hier die aktuelle Antwort der API:
{"temp":280.888,"temp_min":280.888,"temp_max":280.888,"pressure":1001.74,"sea_level":1013.42,"grnd_level":1001.74,"humidity":95},"dt":1427801967,"wind":{"speed":13.46,"deg":280.006},"sys":{"country":"Germany"},"rain":{"3h":1.095},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}]}]}

So sähe übrigens die Antwort der API aus, wenn die Böe mitgeliefert würde:
{"temp":280.888,"temp_min":280.888,"temp_max":280.888,"pressure":1001.74,"sea_level":1013.42,"grnd_level":1001.74,"humidity":95},"dt":1427801967,"wind":{"speed":13.46,"gust":23.08,"deg":280.006},"sys":{"country":"Germany"},"rain":{"3h":1.095},"clouds":{"all":92},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}]}]}

Und hier nochmal vorsichtshalber das komplette Script:

Code: Alles auswählen

    string CityName="Anrath"; 
    boolean CUxD=true;

    string txt; 
    var stdout; 
    real wert;
    real a_wert;
    integer wert_pos;
    string stderr;
    string pos2=",";    ! oder   string pos2="}";
    string weatherUrl="http://api.openweathermap.org/data/2.5/find?q=" + CityName;

    dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - " # weatherUrl);
    dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
    stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

    ! Aussentemperatur
           string pos1="{\"temp\":"; 
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,10).StrValueByIndex(pos2,0);
           real a_wert = wert.ToFloat() - 273.15;
           if (a_wert>-273.15) {
            dom.GetObject("VAR_OWM_AussenTemperatur").Variable(a_wert); 
            WriteLine ("aktuelle Aussentemperatur: " # a_wert # "°C"); 

    ! minimale Aussentemperatur
           string pos1="\"temp_min\":"; 
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,10).StrValueByIndex(pos2,0);
           real a_wert = wert.ToFloat() - 273.15;
           if (a_wert>-273.15) {
            dom.GetObject("VAR_OWM_Aussen_min_Temperatur").Variable(a_wert); 
            WriteLine ("minimale Aussentemperatur: " # a_wert # "°C"); 
          }

    ! maximale Aussentemperatur
           string pos1="\"temp_max\":"; 
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,10).StrValueByIndex(pos2,0);
           real a_wert = wert.ToFloat() - 273.15;
           if (a_wert>-273.15) {
               dom.GetObject("VAR_OWM_Aussen_max_Temperatur").Variable(a_wert); 
               WriteLine ("maximale Aussentemperatur: " # a_wert # "°C"); 
           }         

    ! Luftdruck
           integer a_wert;
           string pos1="\"pressure\":";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           a_wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           dom.GetObject("VAR_OWM_Luftdruck").Variable(a_wert.ToInteger());       
           WriteLine ("Luftdruck: " # a_wert # " hPa");         
           
    ! Relative Luftfeuchtigkeit
           real a_wert;
           string pos1="\"humidity\":";
           string pos2=",";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           a_wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           dom.GetObject("VAR_OWM_RelFeuchte").Variable(a_wert.ToInteger());
           WriteLine ("Relative Luftfeuchtigkeit: " # a_wert # " %");

    ! Windgeschwingigkeit
           string pos1="\"wind\":{\"speed\":";
           string pos2=",";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           a_wert = wert.ToFloat() / 3.6;    ! Umrechnung in km pro Stunde
             if (a_wert <     0.00) {txt = "Fehler";                      } else {
             if (a_wert <     1.85) {txt = "Windstille";                  } else { 
             if (a_wert <     9.00) {txt = "geringer Wind";               } else {
             if (a_wert <    19.00) {txt = "leichter Wind";               } else {
             if (a_wert <    28.00) {txt = "schwacher Wind";              } else {
             if (a_wert <    37.00) {txt = "mäßiger Wind";                } else {
             if (a_wert <    46.00) {txt = "frischer Wind";               } else {
             if (a_wert <    56.00) {txt = "starker Wind";                } else {
             if (a_wert <    65.00) {txt = "starker bis stürmischer Wind";} else {
             if (a_wert <    74.00) {txt = "stürmischer Wind";            } else {
             if (a_wert <    83.00) {txt = "Sturm";                       } else {
             if (a_wert <   102.00) {txt = "schwerer Sturm";              } else {
             if (a_wert <   117.00) {txt = "orkanartiger Sturm";          } else {
             if (a_wert >=  117.00) {txt = "Orkan";                      }}}}}}}}}}}}}}
           dom.GetObject("VAR_OWM_Wind").State(txt);
           dom.GetObject("VAR_OWM_Wind_Speed").Variable(a_wert.ToString(1));
           WriteLine("Windgeschwindigkeit: " + txt + " mit " + a_wert.ToString(1) +" km/h");

    ! Windboeen
               ! ### Variable zurücksetzen ###
               dom.GetObject("VAR_OWM_Wind_Gust").Variable('-');
           string pos1="\"gust\":";
           string pos2=",";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           a_wert = wert.ToFloat() / 3.6;    ! Umrechnung in km pro Stunde
           dom.GetObject("VAR_OWM_Wind_Gust").Variable(a_wert.ToString(1));
           WriteLine("Windböen: " + a_wert.ToString(1) +" km/h");

    ! Windrichtung
         real wert;
         string pos1="\"deg\":";
         string pos2="}";
         integer wert_pos = stdout.Find(pos1) +  pos1.Length();
         wert = stdout.Substr(wert_pos,10).StrValueByIndex(pos2,0);
         real a_wert = wert.ToFloat();
             if (a_wert <    0.0) {txt = "Fehler" ;}else {
             if (a_wert <   22.5) {txt = "Nord"      ;} else {
             if (a_wert <   67.5) {txt = "Nord-Ost"     ;} else {
             if (a_wert <  112.5) {txt = "Ost"      ;} else {
             if (a_wert <  157.5) {txt = "Sued-Ost"     ;} else {
             if (a_wert <  202.5) {txt = "Sued"      ;} else {
             if (a_wert <  247.5) {txt = "Sued-West"     ;} else {
             if (a_wert <  292.5) {txt = "West"      ;} else {
             if (a_wert <  337.5) {txt = "Nord-West"     ;} else {
             if (a_wert <= 360.0) {txt = "Nord"      ;} else {
             if (a_wert >  360.0) {txt = "Fehler" ;} }}}}}}}}}}   
          dom.GetObject("VAR_OWM_Windrichtung").State(txt);
          WriteLine("Windrichtung: " + txt);     

    ! Bewölkung
           string pos1="clouds\":{\"all\":";
           string pos2="}";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           integer a_wert;
           a_wert = stdout.Substr(wert_pos,10).StrValueByIndex(pos2,0);
           dom.GetObject("VAR_OWM_Bewoelkung").Variable(a_wert.ToInteger()); 
           WriteLine ("Bewölkung: " # a_wert # " %");         

    ! Niederschlag über 3h
           real a_wert;
           string pos1="rain\":{\"3h\":";
           string pos2="}";
           integer wert_pos = stdout.Find(pos1) +  pos1.Length();
           a_wert = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
           dom.GetObject("VAR_OWM_Regen3h").Variable(a_wert.ToInteger());
           WriteLine ("Regen in 3h: " # a_wert # " mm");

     ! Zeit der Wetterdaten setzen
           dom.GetObject("VAR_OWM_Zeit").State(system.Date("%Y-%m-%d %H:%M:%S"));

    }
Zuletzt geändert von papi am 31.03.2015, 14:33, insgesamt 1-mal geändert.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“