Aussentemperatur von OpenWeatherMap.Org laden

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

Moderator: Co-Administratoren

pilsbiertrinker
Beiträge: 2
Registriert: 29.10.2017, 15:49

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von pilsbiertrinker » 26.01.2018, 17:02

Ich bin fündig geworden.
Das Problem ist der URL Aufruf.

Siehe auch: viewtopic.php?f=26&t=41413&p=412148#p412148

Bin zwar nicht wirklich fit in Sachen Skripte aber es funktioniert bei mir wenn ich die URL zusätzlich in Anführungszeichen setze.
string weatherUrl="'http://api.openweathermap.org/data/2.5/ ... xxxxxxxxxx'";

BenFish
Beiträge: 6
Registriert: 22.05.2016, 19:58

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von BenFish » 27.02.2018, 07:33

Bei mir funktioniert es mit folgender Änderung:

Code: Alles auswählen

if(CUxD){
    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();
}else{
    system.Exec("wget -q -O - '" # weatherUrl # "'", &stdout, &stderr);
}

ChrisDaHub
Beiträge: 6
Registriert: 19.02.2014, 02:41

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von ChrisDaHub » 25.04.2018, 22:02

Hi,

danke für diesen äußerst interessanten Thread.
Ich bin mal so frei und fasse das Skript auf dem aktuellen Stand hier zusammen:

Code: Alles auswählen

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/weather?q=Ort,de&appid=xxxxxxanpassenxxxxx";

    if(CUxD){
    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();
}else{
    system.Exec("wget -q -O - '" # weatherUrl # "'", &stdout, &stderr);
}

    ! 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
    string pos1="\"gust\":";
    string pos2=",";
    if(stdout.Find(pos1)>-1){
        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");
    }else{        
        ! ### Variable zurücksetzen ###
        dom.GetObject("VAR_OWM_Wind_Gust").Variable(0);
    }

    ! 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"));

    }
Alle Variablen in Gänsefüßchen hinter dom.GetObject, also beispielsweise "VAR_OWM_Regen3h" müssen manuell in der CCU angelegt werden. Gibt es hier eine Empfehlung für den Datentyp?

Hab ich übersehen?

Liebe Grüße
Chris
Zuletzt geändert von alchy am 25.04.2018, 22:56, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

mcbert
Beiträge: 69
Registriert: 03.07.2018, 18:51

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von mcbert » 10.07.2018, 21:01

ChrisDaHub hat geschrieben:
25.04.2018, 22:02
Gibt es hier eine Empfehlung für den Datentyp?
Die Systemvariablen sind bei mir ausschliesslich vom Typ Zahl
Ausser:

Code: Alles auswählen

VAR_OWM_Wind_Speed 
VAR_OWM_Windrichtung
VAR_OWM_Zeit
die hab ich als Zeichenkette.


Ist der Wert VAR_OWM_Regen3h bei euch gefüllt?
Bei mir fehlt der in der API oder gibts da noch einen Trick? Rückgabewerte sind:

Code: Alles auswählen

coord	
lon	11.58
lat	48.14
weather	
0	
id	803
main	"Clouds"
description	"broken clouds"
icon	"04d"
base	"stations"
main	
temp	290.76
pressure	1016
humidity	72
temp_min	290.15
temp_max	291.15
visibility	10000
wind	
speed	1.5
deg	250
clouds	
all	75
dt	1531246800
sys	
type	1
id	4887
message	0.0022
country	"DE"
sunrise	1531193099
sunset	1531249970
id	2867714
name	"Muenchen"
cod	200

mcbert
Beiträge: 69
Registriert: 03.07.2018, 18:51

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von mcbert » 10.07.2018, 21:09

Noch eine Frage zu CuxD (ist das erstmal, das ich es nutze)

Sobald ich die Variable auf "true" setze (bzw. lasse)

Code: Alles auswählen

    if(CUxD){
WriteLine("1");
    dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '" # weatherUrl # "'");
WriteLine("2"); 
   dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
WriteLine("3");
    stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
Bekomme ich als Ausgabe nur noch 1 d.h. der wget schein schon nciht zu funktionieren. Wie debugged man bei CuxD?


Lösung:
Ma muss natürlich bei CuxD erst ein Gerät 28 anlegen (siehe auch https://technikkram.net/2017/08/homemat ... c-ersetzen)

Bastian79
Beiträge: 41
Registriert: 16.03.2017, 10:36
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 11 Mal
Danksagung erhalten: 1 Mal

Re: Aussentemperatur von OpenWeatherMap.Org laden

Beitrag von Bastian79 » 28.08.2018, 11:07

Hallo mcbert,
mcbert hat geschrieben:
10.07.2018, 21:01
Ist der Wert VAR_OWM_Regen3h bei euch gefüllt?
Bei mir fehlt der in der API oder gibts da noch einen Trick?
Bei mir die gleiche Situation, nach etwas forschen bin ich auf diesen Thread gestoßen:
https://openweathermap.desk.com/custome ... howing-up-
Dort heißt es unter anderem:
There is a case when precipitation data is not provided by the weather stations (simply not measured).
Sprich es liefern leider nicht alle Wetterstationen diesen Wert.
---
Generell denke ich dass es besser ist die API mit folgenden Zusätzen aufzurufen:
&units=metric (bereits von mape erwähnt, weniger Konvertierung im Skript erforderlich)
&lang=DE (bringt die description bereits in gewünschter Zielsprache also z.B: "Überwiegend bewölkt" statt "scattered clouds"
also etwa so

Code: Alles auswählen

http://api.openweathermap.org/data/2.5/weather?id=111ORTID111&APPID=111APIKEY111[b]&mode=metric&lang=DE[/b]
Was man vielleicht auch noch nutzen könnte ist folgende Information die zurückgegeben wird

Code: Alles auswählen

dt	1531246800
welche die Data receiving time in Unix, UTC bereitsstellt. Müsste man nur in Datum / Uhrzeit konvertieren und eine eigene Systemvaribale mit Zeichenkette zuweisen, dann weiß man nicht nur wann die Wetterdaten in die CCU2 geladen wurden sondern auch deren Alter.

Viele Grüße, Bastian

Antworten

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