Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Hobyist
Beiträge: 139
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von Hobyist » 29.06.2020, 11:06

Hallo Zusammen

Ich habe eine Wetterstation von der ich die Daten über Wunderground mit diesem folgenden bekannten Script hole. Es funktioniert sehr gut, sofern Wunderground Online ist.
Das Script stammt von dem Bekannten Beitrag unter viewtopic.php?f=18&t=17209&start=690

Code: Alles auswählen

!Wetterdaten_Wunderground_holen
!Stand 13.04.2019  http://homematic-forum.de/forum/viewtopic.php?f=31&t=17209
        !zuerst folgende Systemvariablen anlegen
        !Achtung: keine vergessen und exakte Schreibweise mit Drag&Drop
        !W_Station                  	Zeichenkette
        !W_Aktualisierung            	Zeichenkette
        !W_Temperatur               	Zahl      °C
        !W_Luftfeuchtigkeit        	Zahl       %
        !W_Windgeschwindigkeit 	Zahl       km/h
        !W_Windboeen               	Zahl       km/h
        !W_Regen_d                   	Zahl       l
        !W_Regen_h                   	Zahl       l
        !W_Luftdruck                 	Zahl       hPa
        !W_Ort			     	Zeichenkette
        !W_Windrichtung            	Zahl       °
         
      var url = "https://api.weather.com/v2/pws/observations/current?stationId=DEINE_STATION&format=xml&units=m&apiKey=DEIN_API_KEY";

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();

string word = "temp";
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);

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

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

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

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

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

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

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

string word = "neighborhood";
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 latin = daten.ToLatin();
dom.GetObject("W_Ort").State(latin);

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

Wenn man mit der Davis Wetterstation auch die Meteobridge in Betrieb hat, kann man im internen Netz die Daten direkt holen, ohne über extern Wunderground zu gehen.

Der Aufruf lautet: "http://ip-of-meteobridge/cgi-bin/livedataxml.cgi"
Als Resultat bekommt man dann die Daten wie folgt angezeigt:

<logger>
<THB date="20121227224318" id="thb0" temp="26.0" hum="37" dew="10.2" press="1008.8" seapress="1010.1" fc="2"/>
<TH date="20130104141909" id="th0" temp="9.1" hum="95" dew="8.3"/>
<RAIN date="20130104141856" id="rain0" rate="0.0" total="3.0" delta="0.0"/>
<WIND date="20130104141916" id="wind0" dir="109" gust="0.9" wind="2.2" chill="9.1"/>
</logger>

Siehe auch hier: https://www.meteobridge.com/wiki/index. ... ervices/de

Ich wollte nun fragen, da ich dem Programmieren einfach nicht genug kundig bin, ob jemand das obige Script ändern könnten auf das neue Datenset? Ich wäre wirklich sehr dankbar.

Der Vorteil liegt auf der Hand, man kann so nur im Intranet die eigenen Wetterdaten holen und verwerten und dies beinahe in "Realtime".

Ich weiss, dass es sehr mutig ist, solch eine Bitte zustellen. Wie auch immer, herzlichen Dank im voraus.
CCU3 Start Up, Wohnort Schweiz

MichaelN
Beiträge: 9649
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von MichaelN » 29.06.2020, 11:21

Probier einfach mal aus, ob mein AccuWeather-Skrpt (siehe Signatur) Dir da weiterhilft. Das ist eigentlich ziemlich robust programmiert, um XML oder JSON zu parsen. Sollte (ohne das ich eine tiefergehende Analyse durchgeführt habe) auch mit deinem Input klar kommen.

Bei string func = musst Du dann deine URL eintragen
integer Stunden = 12; auf 1 setzen
string xmlTimeStart = "EpochDateTime"; auf "logger"

ach ja, und natürlich die anderen Anpassungen, die sowieso beim Einsatz des Skript nötig wären, wie Suchstrings, SV-Namen und so.

Viel Glück :lol:
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Hobyist
Beiträge: 139
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von Hobyist » 29.06.2020, 16:40

Danke für den Tipp. Ja also, ich muss sagen, gewaltige Arbeit!

Aber eben ich bin leider überfordert...
Habe keinen API-Key, keine Orts-ID, usw. etc. uff. Was mache damit... Denke, dann muss ich es wohl sein lassen. :shock:
CCU3 Start Up, Wohnort Schweiz

MichaelN
Beiträge: 9649
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von MichaelN » 29.06.2020, 16:42

Bei string func = musst Du dann deine URL eintragen
Die hat natürlich keinen API-Key.... Also soweit musst Du schon mitdenken, sonst wird das nichts. Ich kann Dich da nicht hintragen, den Weg wirst Du schon selber gehen müssen. Auch wenn er hart und steinig ist.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von alchy » 29.06.2020, 20:18

Nicht immer ist es sinnvoll die Copy der Copy der Copy anzupassen.
Da dein Dienstleister auch eine Textausgabe anbietet, wäre es wahrscheinlich sogar noch einfacher auf die XML-Struktur zu verzichten.
ip-of-meteobridge musst du natürlich anpassen.

Code: Alles auswählen

string url = "http://ip-of-meteobridge/cgi-bin/livedata.cgi";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
if (!srueck == "") {WriteLine("Abfrage in Ordnung \n");
WriteLine(srueck);
}else{WriteLine("keine Rueckgabe");}
Damit solltest du erstmal eine grundsätzliche Ausgabe der Daten erhalten. (Was natürlich aber auch ohne CUxD gehen würde usw.)
Dann musst du nur noch die Rückgabe entsprechend behandeln.

Mit Angabe der gewollten Daten und Posten der >>Scriptexecuter JSON Ausgabe << von dem Script kann ich auch schnell weiter helfen.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Hobyist
Beiträge: 139
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von Hobyist » 29.06.2020, 20:44

Danke alchy! Ich muss dies zuerst mal zu Hause ausprobieren.
CCU3 Start Up, Wohnort Schweiz

Hobyist
Beiträge: 139
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von Hobyist » 30.06.2020, 19:49

So ich habe mit folgender URL im Chrome folgende Daten erhalten:

http://user:passwort@ipadresse/cgi-bin/livedata.cgi

20200630173429 th0 29.3 44 15.8 0
20200630173443 sol0 156 0
20200630173453 wind0 219 0.0 0.4 29.3 0
20200630173447 rain0 0.0 275.2 0.0 0
20200630173417 thb0 25.2 52 14.6 960.6 1017.2 2 0
Diese Daten erkenne ich und kann sie zuordnen.

Ich musste aber leider nach dem Aufruf im Chrome und Firefox noch manuell bestätigen, dass ich dies tun will. Also müsste ich dieses manuelle Enter-Taste drücken irgendwie noch mitgeben können.

Somit habe ich folgendes Script eingegeben:

Code: Alles auswählen

string url = "http://user:passwort@ipadresse/cgi-bin/livedata.cgi";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
if (!srueck == "") {WriteLine("Abfrage in Ordnung \n");
WriteLine(srueck);
}else{WriteLine("keine Rueckgabe");}
Die HM Script Editor Standardausgabe bleibt leer.

Auf Jason umgeschaltet sieht die Ausgabe wie folgt aus

Code: Alles auswählen

{
  "srueck": "",
  "sessionId": "",
  "httpUserAgent": "",
  "url": "http:\/\/meteobridge:meteobridge@192.168.178.66\/cgi-bin\/livedata.cgi",
  "STDOUT": ""
}
Möchte aber noch sagen, dass ich noch kein CUxD Gerät eröffnet habe... Habe aber CUxD installiert für die HUE Lampen. AUch habe ich ein Gerät installiert um die Wetterstationsdaten von Wunderground abzulegen.

Somit habe ich folgende offenen Punkte welche mir nicht klar sind:
- URL Enter-Taste mitgeben
- CUxD Geräte was genau ist da zu machen
- warum sind da in der URL die Backslahs mit \/ versehen

Bitte Nachsicht mit mir haben, man kann nicht so viel voraussetzen. :oops:

Danke für einen nächsten Schritt.
Zuletzt geändert von alchy am 30.06.2020, 19:57, insgesamt 1-mal geändert.
Grund: Code in Codetags posten
CCU3 Start Up, Wohnort Schweiz

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von alchy » 30.06.2020, 20:18

Hobyist hat geschrieben:
30.06.2020, 19:49
Diese Daten erkenne ich und kann sie zuordnen.
Davon gehe ich aus. Nur welche Daten willst du auslesen. Im Zweifelsfall wahrscheinlich alle. :P
Hobyist hat geschrieben:
30.06.2020, 19:49
Auf Jason umgeschaltet sieht die Ausgabe wie folgt aus
Du wirst das CUxD.exec Gerät (siehe Signatur) nicht installiert haben, oder die im Script verwendete Interface.Seriennummer.Kanal CUxD.CUX2801001:1
stimmt nicht mit dem installiertem Gerät überein oder oder....
Hobyist hat geschrieben:
30.06.2020, 19:49
Somit habe ich folgende offenen Punkte welche mir nicht klar sind:
- URL Enter-Taste mitgeben
- CUxD Geräte was genau ist da zu machen
- warum sind da in der URL die Backslahs mit \/ versehen

Taste sollte nach API nicht nötig sein, CUxD siehe Signatur - die \/ sind schon in Ordnung in der JSON Ausgabe

Nun gibt es mehrere Möglichkeiten.
  • CUxD.exec durchboxen dann wäre mal ein Ausgabe des Scriptes interessant, ob ich richtig geraten habe:

    Code: Alles auswählen

    object obj = datapoints.Get("CUxD.CUX2801001:1.CMD_SETS");
    if (obj){WriteLine("dp ist da");
    }else{WriteLine("Datenpunkt falsch");}
    
  • Wechseln auf system.exec.
  • ...
Du hast die Wahl.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Hobyist
Beiträge: 139
Registriert: 23.10.2019, 09:31
System: CCU
Hat sich bedankt: 39 Mal
Danksagung erhalten: 1 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von Hobyist » 01.07.2020, 20:41

Habe das Script laufen lassen und wie zu erwarten war, ist dieses Gerät nicht vorhanden. Habe es ja auch nicht erstellt. Nun warum setze ich CuXD ein? Ich brauche dies nur um den Status der HUE Lampen von der HUE-Bridge an Homematic zurück zu geben. So wenn ich mit dem mechanischen HUE-Schalter die HUE-Lampen in Betrieb nehme, melden die virtuellen CuXD Geräte den Status an Homematic zurück. Wie das aber funktioniert kann ich nicht erklären. Habe es halt mit einem guten How to do nachgemacht. :oops:

Was ich zudem realisiert habe, hängt sich CuXD immer wieder auf. Das merke ich daran, dass diese Geräte in Homematic wohl da sind, aber nicht betätigt werden können. Erst wenn man HUE über HUE in Betrieb nimmt, funktionieren die CuXD wieder. Sollte diese HUE Statusrückmeldung nun auch ohne CuXD gehen, würde ich diese auch gerne umstellen.

Wenn ich auf System.exec wechseln kann, und es einfacher ist, würde ich das bevorzugen. Dann arbeiten wir mit nativ Betriebssystem-Programmen und nicht mit Zusätzen.

Gerne würde ich alle Werte auslesen und sie in Systemvariablen ablegen. So kann ich über einen zeitgesteuerten Script-Aufruf die Systemvariablen immer wieder mit aktuellen Daten befüllen. Diese Daten würde ich dann gerne für meine Homematic-wetterabhängigen Funktionen verwenden.

Alle Software und Firmeware sind auf dem neuesten Stand.
CCU3 Start Up, Wohnort Schweiz

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Meteobridge HTTP-Request Wetter mit einfachem HM-Skript holen

Beitrag von alchy » 02.07.2020, 18:45

Dann teste eben mal das:

Code: Alles auswählen

string url = "http://192.168.178.66/cgi-bin/livedata.cgi";
! +++++++++++ Finger weg ++++++++++++
string srueck;string error;
system.Exec("wget --no-check-certificate -O - '"#url#"'" , &srueck, &error);
if (!srueck == "") {WriteLine("Abfrage in Ordnung \n");
WriteLine(srueck);
}else{WriteLine("keine Rueckgabe");}
Und wieder JSON Rückgabe ....

+ >> Fehlerprotokoll << vom Zeitpunkt der Ausführung halls das Script nichts ordentliches ausgibt.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“