AccuWeather Forecast Antwort File parsen

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Benutzeravatar
Jimbaem
Beiträge: 62
Registriert: 19.12.2014, 19:03
Wohnort: Schuttertal

Re: AccuWeather Forecast Antwort File parsen

Beitrag von Jimbaem » 10.06.2019, 19:18

@FBK2904:

Das ist doch mal ne Aussage, warum finde ich das mit der Suchfunktion hier im Forum nicht :?: :wink:

Mit den "CurrentConditions" hab ich generell kein Problem, da ich nur sehr wenige Daten beziehe und die passen eigentlich immer.
Mich Interessiert vielmehr der "Forecast" für die nächsten Tage, könntest du mal das hier auch zur Verfügung stellen?
(geschrieben und zusammen gebastelt von einem Script-Laien wie mir :mrgreen: ).
Tja, genauso geht es mir ja auch. Ich könnte sowas nicht selbst programmieren, aber wenn ich eine Vorlage habe kann ich diese verstehen und meinen Bedürfnissen anpassen.
Mein Tipp, um die ganzen Datenstrom einmal übersichtlich zu sehen:
Das mit dem Datenstrom hab ich auch schon so gemacht. Habe auch schon überlegt das Ganze in "Einzelteile" für jeden Tag zu zerlegen und dann nach der Werten zu suchen und zu filtern.

Also Danke schon mal für dein Feedback
Gruß Jürgen

Benutzeravatar
Jimbaem
Beiträge: 62
Registriert: 19.12.2014, 19:03
Wohnort: Schuttertal

Re: AccuWeather Forecast Antwort File parsen

Beitrag von Jimbaem » 10.06.2019, 19:25

Das Problem ist ja das mehrfache Vorkommen der Suchwörter, welche sich für jeden Tag nicht unterscheiden.

Die Wetterdaten von AccuWeather sind eigentlich ganz OK und genau, was ich von OpenWeatherMap nicht behaupten konnte. Die waren teils total daneben, aber vielleicht hat sich auch hier was in den letzten Monaten getan, mal schauen.

Danke für eure Hilfe
Jürgen

Benutzeravatar
FBK2904
Beiträge: 123
Registriert: 22.03.2016, 17:12
Wohnort: Ludwigsburg

Re: AccuWeather Forecast Antwort File parsen

Beitrag von FBK2904 » 10.06.2019, 21:41

Hallo, "Ortenauer" :mrgreen:, ich habe einen Kunden in Schutterwald (Fitnessstudio)!
Jimbaem hat geschrieben:
10.06.2019, 19:18
Das ist doch mal ne Aussage, warum finde ich das mit der Suchfunktion hier im Forum nicht :?:
Weil ich bis dato mein Script noch nicht veröffentlicht habe :roll:

Jimbaem hat geschrieben:
10.06.2019, 19:18
Das mit dem Datenstrom hab ich auch schon so gemacht. Habe auch schon überlegt das Ganze in "Einzelteile" für jeden Tag zu zerlegen und dann nach der Werten zu suchen und zu filtern.
Na, dann mach' es doch und du siehst die ganzen Daten und Werte :!:

OK . . . here we go:

Code: Alles auswählen

!#####     AccuWeather - API (v5.3)     #####
!#####  (3)5-Tage Vorschau-Wetterdaten  #####
!#####   in Systemvariablen schreiben   #####
!#####      by FBK2904 (09.05.19)       #####

! ### Hier die WETTERSTATION-ID und API-KEY eintragen ###
string wetterstation_id = "123456";
string api_key = "abcdefghijklmnopqrstuvwxyz";

var url = "http://dataservice.accuweather.com/forecasts/v1/daily/5day/"#wetterstation_id#"?apikey="#api_key#"&language=de-de&details=true&metric=true";    ! 5 Tage Wetter
 dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State("wget -q -O - '"#url#"'");
 dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(1);
string Wetter_XML = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State().Replace('"', "").Replace("[", "").Replace("]", "").Replace("(", "").Replace(")", "").Replace("{", "").Replace("}", "");
!  WriteLine("Wetter_XML = "#Wetter_XML);

! ###  Heutige UnixTime (Epochdate) aus Wetter-XML heraussuchen  ###
! ###          und Aktualisierungszeit daraus berechnen          ###
string word = "DailyForecasts";
string param = "EpochDate:";
integer param_laenge = param.Length();
integer word_position = Wetter_XML.Find(word);
integer word_pos_end = Wetter_XML.Find("Sun") - word_position;
string daten = Wetter_XML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0));
string UpdateTime = daten.ToInteger().ToTime().Format("%H:%M");
 dom.GetObject("SV_WETTER_For5_UpdateTime").State(UpdateTime);
!  WriteLine(daten #" = " #"UpdateTime: " #UpdateTime);

! ###    Schleifen-Vearbeitung (foreach) aller Werte für x-Tage   ###
! ###  "GenerateEnum (0,2)" = Heute(0), Morgen(1), Übermorgen(2)  ###
string Zahl;
string Unix_ED = daten.ToFloat();
foreach(Zahl,system.GenerateEnum (0,2))
{
! ###  Nächste UnixTime, Real-Wochentag und Real-Datum berechnen  ###
string UnixTime = "EpochTime_"+Zahl;
string EpochTime = Zahl.ToInteger()*86400;
EpochTime = EpochTime+Unix_ED;
string RealTime = EpochTime.ToInteger().ToTime().Format("%Y-%m-%d %H:%M:%S");
string Datum = EpochTime.ToInteger().ToTime().Format("%d.%m.");
string Tag = RealTime.ToTime();
integer wd = Tag.Format("%w").ToInteger();
string woche = "SO.;MO.;DI.;MI.;DO.;FR.;SA.";
Tag = woche.StrValueByIndex(";",wd);
 dom.GetObject("SV_WETTER_For5_Day"+Zahl).State(Tag);
 dom.GetObject("SV_WETTER_For5_Date"+Zahl).State(Datum);
!  WriteLine("");
!  WriteLine(EpochTime #" = " #Tag  #" " #Datum);

! ###  sowie jeweiliges Tages-XML herausschneiden  ###
string word = EpochTime;
string param = ",";   
integer param_laenge = param.Length();
integer word_position = Wetter_XML.Find(word);
string End = Zahl.ToInteger()+1;
string SearchEnd = "day="+End;
integer word_pos_end = Wetter_XML.Find(SearchEnd) - word_position;
string WetterXML = Wetter_XML.Substr(word_position, word_pos_end -117);  ! evtl. unnötige "http"-Reste hinten abschneiden (bis "Sources:)"
!  WriteLine("EpochDay-XML = " #WetterXML);

! ###  Allgemeine Wetterdaten heraussuchen  ###
! # Minimale Temperatur (Nacht) suchen und Wert korrigieren #
!  WriteLine("-Allgemein-");
string word = "Temperature:Minimum:";
string param = "Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5N_Temp"+Zahl).State(daten);
!  WriteLine(daten);
 
! # Minimale RealFeel-Temperatur (Nacht) suchen und Wert korrigieren #
string word = "RealFeelTemperature:Minimum:";
string param = "Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5N_TempRF"+Zahl).State(daten);
!  WriteLine(daten);

! # Maximale Temperatur (Tag) suchen und Wert korrigieren #
string word = "Maximum:";
string param = "Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5D_Temp"+Zahl).State(daten);
!  WriteLine(daten);

! # Maximale RealFeel-Temperatur (Tag) suchen und Wert korrigieren #
string word = "RealFeelTemperature:Minimum:";
string param = "Maximum:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5D_TempRF"+Zahl).State(daten);
!  WriteLine(daten);

! ###  Tages-Wetterdaten heraussuchen  ###
!  WriteLine("-Tag-");
! # WetterIcon suchen #
string word = "Day:";
string param = "Icon:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("IconPhrase:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToInteger();
 dom.GetObject("SV_WETTER_For5D_Icon"+Zahl).State(daten);
!  WriteLine(daten);

! # WetterText suchen #
string word = "Day";
string param = "LongPhrase:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Probability") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",Precipitation");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5D_Text"+Zahl).State(daten.ToLatin());
!  WriteLine(daten.ToLatin());

! # Niederschlag-Wahrscheinlichkeit (%) suchen #
string word = "Day:";
string param = "PrecipitationProbability:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("ThunderstormProbability:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5D_NiedSchl"+Zahl).State(daten);
!  WriteLine(daten);

! # Windgeschwindigkeit suchen und auch in Text umwandeln #
string word = "Day:";
string param = "Wind:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5D_WindAkt"+Zahl).State(daten);
!  WriteLine(daten);
!  #  Umsetzung in Wetterdienst-Windtexte  #
      if (daten <     0.00) {daten = "???"                          ;} else {
      if (daten <     1.00) {daten = "Windstille"                   ;} else {
      if (daten <     5.00) {daten = "Leiser Zug"                   ;} else {
      if (daten <    11.00) {daten = "Leichte Brise"                ;} else {
      if (daten <    19.00) {daten = "Schwacher Wind"               ;} else {
      if (daten <    28.00) {daten = "Mäßiger Wind"                 ;} else {
      if (daten <    38.00) {daten = "Auffrischender Wind"          ;} else {
      if (daten <    49.00) {daten = "Starker Wind"                 ;} else {
      if (daten <    61.00) {daten = "Starker bis stürmischer Wind" ;} else {
      if (daten <    74.00) {daten = "Stürmischer Wind"             ;} else {
      if (daten <    88.00) {daten = "Sturm"                        ;} else {
      if (daten <   102.00) {daten = "Schwerer Sturm"               ;} else {
      if (daten <   117.00) {daten = "Orkanartiger Sturm"           ;} else {
      if (daten >=  117.00) {daten = "Orkan"                        ;} }}}}}}}}}}}}}
 dom.GetObject("SV_WETTER_For5D_WindAktTXT"+Zahl).State(daten);
!  WriteLine(daten);

! # Windrichtung (Text) suchen #
string word = "Day:";
string param = "Localized:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("English:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5D_WindDir"+Zahl).State(daten);
!  WriteLine(daten);

! # Windboen suchen #
string word = "Day:";
string param = "WindGust:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5D_WindBoen"+Zahl).State(daten);
!  WriteLine(daten);

! ###  Nacht-Wetterdaten heraussuchen  ###
!  WriteLine("-Nacht-");
! # WetterIcon suchen #
string word = "Night:";
string param = "Icon:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("IconPhrase:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToInteger();
 dom.GetObject("SV_WETTER_For5N_Icon"+Zahl).State(daten);
!  WriteLine(daten);

! # WetterText suchen #
string word = "Night:";
string param = "LongPhrase:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Probability:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",Precipitation");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5N_Text"+Zahl).State(daten.ToLatin());
!  WriteLine(daten.ToLatin());

! # Niederschlag-Wahrscheinlichkeit (%) suchen #
string word = "Night:";
string param = "PrecipitationProbability:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("ThunderstormProbability:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5N_NiedSchl"+Zahl).State(daten);
!  WriteLine(daten);

! # Windgeschwindigkeit suchen und auch in Text umwandeln #
string word = "Night:";
string param = "Wind:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5N_WindAkt"+Zahl).State(daten);
!  WriteLine(daten);
!  #  Umsetzung in Wetterdienst-Windtexte  #
      if (daten <     0.00) {daten = "???"                          ;} else {
      if (daten <     1.00) {daten = "Windstille"                   ;} else {
      if (daten <     5.00) {daten = "Leiser Zug"                   ;} else {
      if (daten <    11.00) {daten = "Leichte Brise"                ;} else {
      if (daten <    19.00) {daten = "Schwacher Wind"               ;} else {
      if (daten <    28.00) {daten = "Mäßiger Wind"                 ;} else {
      if (daten <    38.00) {daten = "Auffrischender Wind"          ;} else {
      if (daten <    49.00) {daten = "Starker Wind"                 ;} else {
      if (daten <    61.00) {daten = "Starker bis stürmischer Wind" ;} else {
      if (daten <    74.00) {daten = "Stürmischer Wind"             ;} else {
      if (daten <    88.00) {daten = "Sturm"                        ;} else {
      if (daten <   102.00) {daten = "Schwerer Sturm"               ;} else {
      if (daten <   117.00) {daten = "Orkanartiger Sturm"           ;} else {
      if (daten >=  117.00) {daten = "Orkan"                        ;} }}}}}}}}}}}}}
 dom.GetObject("SV_WETTER_For5N_WindAktTXT"+Zahl).State(daten);
!  WriteLine(daten);

! # Windrichtung (Text) suchen #
string word = "Night:";
string param = "Localized:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("English:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5N_WindDir"+Zahl).State(daten);
!  WriteLine(daten);

! # Windboen suchen #
string word = "Night:";
string param = "WindGust:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5N_WindBoen"+Zahl).State(daten);
!  WriteLine(daten);
}
Das Script holt sich die 5-Tage Vorschau (in diesem Fall nur 3 Tage) und beschreibt dann die entsprechenden SysVar's.
Dies kann in Zeile 36 auch auf z.B. 5 Tage "foreach(Zahl,system.GenerateEnum (0,4))" geändert werden.
Es muss eine große Anzahl an SysVar's (mit einer Endung "0", "1", "2", usw.) angelegt werden.

Das Script holt sich erst einmal einige Grunddaten und zerlegt diese dann in "Tages-Strings" und verarbeitet das ganze
dann in einer Schleife für die entsprechenden Tages- und Nachtwerte.

Die Zeile 61 muss auch angepasst werden, da der Wert "word_pos_end -117" abhängig von dem Wetter-Stationsname ist !

Achja ... wer sich wundert, warum ich in meinen Scripten jeweils bei "Temperature" bzw. "RelativeHumidity" die Werte verbiege?
-> Weil die Messwerte meines an der Haus-Nordseite hängenden Funk-Temperatur-Feuchtesensor (HM-WDS10-TH-O)
nicht mit den Wetterstations-Werten ganz übereinstimmt :lol:

Grüssle,
Frank

Benutzeravatar
FBK2904
Beiträge: 123
Registriert: 22.03.2016, 17:12
Wohnort: Ludwigsburg

Re: AccuWeather Forecast Antwort File parsen

Beitrag von FBK2904 » 10.06.2019, 21:49

Jimbaem hat geschrieben:
10.06.2019, 19:25
Das Problem ist ja das mehrfache Vorkommen der Suchwörter, welche sich für jeden Tag nicht unterscheiden.
Das stimmt nur bedingt.
Wenn Du dir den Datenstrom genauer anschaust, gibt es sehr wohl diverse Unterschiede (Tag, Nacht,etc.), wie Du konkret
nach bestimmten Werten suchen und dann auswerten kannst. So mache ich es auch in meinen AccuWeather-Scripten.

Grüssle,
Frank

Benutzeravatar
Jimbaem
Beiträge: 62
Registriert: 19.12.2014, 19:03
Wohnort: Schuttertal

Re: AccuWeather Forecast Antwort File parsen

Beitrag von Jimbaem » 11.06.2019, 17:08

FBK2904 hat geschrieben:
10.06.2019, 21:41
Hallo, "Ortenauer" :mrgreen:, ich habe einen Kunden in Schutterwald (Fitnessstudio)!
Hallo Frank,

das mit Ortenau(er) stimmt schon, aber nich Schutterwald mit Schuttertal verwechseln :wink:

Danke dir für das zur Verfügung stellen des Scripts. Werde ich er mal so mit meinem API-Key testen und dann schauen was welche Werte ich davon brauche und welche nicht.
(geschrieben und zusammen gebastelt von einem Script-Laien wie mir :mrgreen: )
Also dafür sieht das Ganze aber sehr Strukturiert aus und vor allem auch gut Kommentiert, sehr hilfreich :!:
Muss mich damit erst mal befassen und schauen das ich alles verstehe :idea: . Kann ein Weilchen dauern, da ich (wir) nächste Woche im Urlaub sind.

Aber ich melde mich ob alles funktioniert hat.
DANKE !!
Jürgen

Benutzeravatar
FBK2904
Beiträge: 123
Registriert: 22.03.2016, 17:12
Wohnort: Ludwigsburg

Re: AccuWeather Forecast Antwort File parsen

Beitrag von FBK2904 » 11.06.2019, 18:03

Jimbaem hat geschrieben:
11.06.2019, 17:08
das mit Ortenau(er) stimmt schon, aber nich Schutterwald mit Schuttertal verwechseln :wink:
Weiss ich, aber ist ja fast um die Ecke :lol: .

Jimbaem hat geschrieben:
11.06.2019, 17:08
Kann ein Weilchen dauern, da ich (wir) nächste Woche im Urlaub sind.
Wieee in Urlaub fahren? Da "unten" ist doch das schönste Fleckchen der Erde :mrgreen: .
Trotzdem einen schönen und erholsamen Urlaub!

Jimbaem hat geschrieben:
11.06.2019, 17:08
Aber ich melde mich ob alles funktioniert hat.
Kein Problem ... immer her mit den Fragen :)

Grüssle,
Frank

Benutzeravatar
Jimbaem
Beiträge: 62
Registriert: 19.12.2014, 19:03
Wohnort: Schuttertal

Re: AccuWeather Forecast Antwort File parsen

Beitrag von Jimbaem » 11.06.2019, 18:51

Alles Richtig beantwortet, wir wohnen hier wo andere Urlaub machen :D
  • gerade mal 25 km entfernt, aber das können Welten sein
  • heißeste und schönste Gegend Deutschlands, Kaiserstuhl mit guuuuutem Wein
  • Fragen werden kommen, bin ich mir sicher
Europapark, Titisee, Feldberg, Triberg, Vogesen, Kandel, Schwarzwälder Hof, Kinzigtal, Dorotheenhütte, Schwarzwälder Freilichtmuseum Vogtsbauernhof, ich hör jetzt auf zu schwärmen :P

Jürgen

Fonzo
Beiträge: 1692
Registriert: 22.05.2012, 08:40

Re: AccuWeather Forecast Antwort File parsen

Beitrag von Fonzo » 11.06.2019, 22:22

Jimbaem hat geschrieben:
10.06.2019, 19:16
Sorry, habs trotzdem noch nicht begriffen wie das in NEO aussehen soll und was ich dafür brauche.
Dafür gibt es mehrere Möglichkeiten. Wenn Du eine CCU nutzt musst Du Dir auf der CCU eben ein Skript erstellen, das die einzelnen Werte in Systemvariablen ablegt und zeigst dann eben die einzelnen Werte in Textfeldern an. Einfacher geht das wenn Du ein NEO Plugin nutzt, das Dir die Wetterdaten gleich als Gerät in NEO anbietet, dann musst Du nicht die Werte aus einzelnen Variablen zusammensuchen und auch kein Skript schreiben.

Ich selber nutzte dafür das NEO Plugin IP-Symcon. Da ziehst Du einfach ein Webseitenelement in NEO auf und weist dann als Status Zusammenfassung des Wetters zu.
wetter openweather 3.png
wetter openweather 3.png (5.53 KiB) 163 mal betrachtet
Sieht dann z.B. so aus:
wetter openweather 1.png
Alternativ kannst Du auch die einzelnen Werte einem Textfeld zuweisen
wetter openweather 2.png
Das gleiche Vorgehen kannst Du auch mit anderen Wetterdaten machen einfach den Status in NEO zuweisen und Du hast Wetterdaten z.B. Pollenflug
wetter pollen.png
Da kann Dir auch in der Regel SUS egal sein, ein Textfeld gibt es schon immer, wüste nicht was sich daran ändern sollte und ein Webseitenelement ändert sich auch nicht wirklich durch SUS. Bis auf die letzte sinnvolle Anpassung durch SUS im Webseitenelement mit HTML Grundgerüst.
Jimbaem hat geschrieben:
10.06.2019, 19:16
Aber egal, die ganzen Diskussionen bzgl. SUS und den gesalzenen Preisen haben mich so genervt das ich für mich entschieden habe in diese Richtung nichts mehr zu Investieren. Bin ganz zufrieden mit meiner 'alten' Version.
Ich persönlich kann nur immer wieder sagen wenn einen SUS nervt, dann soll man es bleiben lassen, so viele NEO Plugin spezifische Updates gibt es meist doch nicht, und wenn man dann doch mal meint ein Update wäre notwendig, kann man das immer noch im nachhinein entscheiden.

Benutzeravatar
Jimbaem
Beiträge: 62
Registriert: 19.12.2014, 19:03
Wohnort: Schuttertal

Re: AccuWeather Forecast Antwort File parsen

Beitrag von Jimbaem » 12.06.2019, 19:00

FBK2904 hat geschrieben:
10.06.2019, 21:41

OK . . . here we go:

Code: Alles auswählen

!#####     AccuWeather - API (v5.3)     #####
!#####  (3)5-Tage Vorschau-Wetterdaten  #####
!#####   in Systemvariablen schreiben   #####
!#####      by FBK2904 (09.05.19)       #####

! ### Hier die WETTERSTATION-ID und API-KEY eintragen ###
string wetterstation_id = "123456";
string api_key = "abcdefghijklmnopqrstuvwxyz";

var url = "http://dataservice.accuweather.com/forecasts/v1/daily/5day/"#wetterstation_id#"?apikey="#api_key#"&language=de-de&details=true&metric=true";    ! 5 Tage Wetter
 dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State("wget -q -O - '"#url#"'");
 dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(1);
string Wetter_XML = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State().Replace('"', "").Replace("[", "").Replace("]", "").Replace("(", "").Replace(")", "").Replace("{", "").Replace("}", "");
!  WriteLine("Wetter_XML = "#Wetter_XML);

! ###  Heutige UnixTime (Epochdate) aus Wetter-XML heraussuchen  ###
! ###          und Aktualisierungszeit daraus berechnen          ###
string word = "DailyForecasts";
string param = "EpochDate:";
integer param_laenge = param.Length();
integer word_position = Wetter_XML.Find(word);
integer word_pos_end = Wetter_XML.Find("Sun") - word_position;
string daten = Wetter_XML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0));
string UpdateTime = daten.ToInteger().ToTime().Format("%H:%M");
 dom.GetObject("SV_WETTER_For5_UpdateTime").State(UpdateTime);
!  WriteLine(daten #" = " #"UpdateTime: " #UpdateTime);

! ###    Schleifen-Vearbeitung (foreach) aller Werte für x-Tage   ###
! ###  "GenerateEnum (0,2)" = Heute(0), Morgen(1), Übermorgen(2)  ###
string Zahl;
string Unix_ED = daten.ToFloat();
foreach(Zahl,system.GenerateEnum (0,2))
{
! ###  Nächste UnixTime, Real-Wochentag und Real-Datum berechnen  ###
string UnixTime = "EpochTime_"+Zahl;
string EpochTime = Zahl.ToInteger()*86400;
EpochTime = EpochTime+Unix_ED;
string RealTime = EpochTime.ToInteger().ToTime().Format("%Y-%m-%d %H:%M:%S");
string Datum = EpochTime.ToInteger().ToTime().Format("%d.%m.");
string Tag = RealTime.ToTime();
integer wd = Tag.Format("%w").ToInteger();
string woche = "SO.;MO.;DI.;MI.;DO.;FR.;SA.";
Tag = woche.StrValueByIndex(";",wd);
 dom.GetObject("SV_WETTER_For5_Day"+Zahl).State(Tag);
 dom.GetObject("SV_WETTER_For5_Date"+Zahl).State(Datum);
!  WriteLine("");
!  WriteLine(EpochTime #" = " #Tag  #" " #Datum);

! ###  sowie jeweiliges Tages-XML herausschneiden  ###
string word = EpochTime;
string param = ",";   
integer param_laenge = param.Length();
integer word_position = Wetter_XML.Find(word);
string End = Zahl.ToInteger()+1;
string SearchEnd = "day="+End;
integer word_pos_end = Wetter_XML.Find(SearchEnd) - word_position;
string WetterXML = Wetter_XML.Substr(word_position, word_pos_end -117);  ! evtl. unnötige "http"-Reste hinten abschneiden (bis "Sources:)"
!  WriteLine("EpochDay-XML = " #WetterXML);

! ###  Allgemeine Wetterdaten heraussuchen  ###
! # Minimale Temperatur (Nacht) suchen und Wert korrigieren #
!  WriteLine("-Allgemein-");
string word = "Temperature:Minimum:";
string param = "Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5N_Temp"+Zahl).State(daten);
!  WriteLine(daten);
 
! # Minimale RealFeel-Temperatur (Nacht) suchen und Wert korrigieren #
string word = "RealFeelTemperature:Minimum:";
string param = "Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5N_TempRF"+Zahl).State(daten);
!  WriteLine(daten);

! # Maximale Temperatur (Tag) suchen und Wert korrigieren #
string word = "Maximum:";
string param = "Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5D_Temp"+Zahl).State(daten);
!  WriteLine(daten);

! # Maximale RealFeel-Temperatur (Tag) suchen und Wert korrigieren #
string word = "RealFeelTemperature:Minimum:";
string param = "Maximum:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat()+1.5;    ! Wert um 1.5 erhöhen
 dom.GetObject("SV_WETTER_For5D_TempRF"+Zahl).State(daten);
!  WriteLine(daten);

! ###  Tages-Wetterdaten heraussuchen  ###
!  WriteLine("-Tag-");
! # WetterIcon suchen #
string word = "Day:";
string param = "Icon:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("IconPhrase:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToInteger();
 dom.GetObject("SV_WETTER_For5D_Icon"+Zahl).State(daten);
!  WriteLine(daten);

! # WetterText suchen #
string word = "Day";
string param = "LongPhrase:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Probability") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",Precipitation");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5D_Text"+Zahl).State(daten.ToLatin());
!  WriteLine(daten.ToLatin());

! # Niederschlag-Wahrscheinlichkeit (%) suchen #
string word = "Day:";
string param = "PrecipitationProbability:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("ThunderstormProbability:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5D_NiedSchl"+Zahl).State(daten);
!  WriteLine(daten);

! # Windgeschwindigkeit suchen und auch in Text umwandeln #
string word = "Day:";
string param = "Wind:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5D_WindAkt"+Zahl).State(daten);
!  WriteLine(daten);
!  #  Umsetzung in Wetterdienst-Windtexte  #
      if (daten <     0.00) {daten = "???"                          ;} else {
      if (daten <     1.00) {daten = "Windstille"                   ;} else {
      if (daten <     5.00) {daten = "Leiser Zug"                   ;} else {
      if (daten <    11.00) {daten = "Leichte Brise"                ;} else {
      if (daten <    19.00) {daten = "Schwacher Wind"               ;} else {
      if (daten <    28.00) {daten = "Mäßiger Wind"                 ;} else {
      if (daten <    38.00) {daten = "Auffrischender Wind"          ;} else {
      if (daten <    49.00) {daten = "Starker Wind"                 ;} else {
      if (daten <    61.00) {daten = "Starker bis stürmischer Wind" ;} else {
      if (daten <    74.00) {daten = "Stürmischer Wind"             ;} else {
      if (daten <    88.00) {daten = "Sturm"                        ;} else {
      if (daten <   102.00) {daten = "Schwerer Sturm"               ;} else {
      if (daten <   117.00) {daten = "Orkanartiger Sturm"           ;} else {
      if (daten >=  117.00) {daten = "Orkan"                        ;} }}}}}}}}}}}}}
 dom.GetObject("SV_WETTER_For5D_WindAktTXT"+Zahl).State(daten);
!  WriteLine(daten);

! # Windrichtung (Text) suchen #
string word = "Day:";
string param = "Localized:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("English:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5D_WindDir"+Zahl).State(daten);
!  WriteLine(daten);

! # Windboen suchen #
string word = "Day:";
string param = "WindGust:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5D_WindBoen"+Zahl).State(daten);
!  WriteLine(daten);

! ###  Nacht-Wetterdaten heraussuchen  ###
!  WriteLine("-Nacht-");
! # WetterIcon suchen #
string word = "Night:";
string param = "Icon:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("IconPhrase:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToInteger();
 dom.GetObject("SV_WETTER_For5N_Icon"+Zahl).State(daten);
!  WriteLine(daten);

! # WetterText suchen #
string word = "Night:";
string param = "LongPhrase:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Probability:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",Precipitation");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5N_Text"+Zahl).State(daten.ToLatin());
!  WriteLine(daten.ToLatin());

! # Niederschlag-Wahrscheinlichkeit (%) suchen #
string word = "Night:";
string param = "PrecipitationProbability:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("ThunderstormProbability:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5N_NiedSchl"+Zahl).State(daten);
!  WriteLine(daten);

! # Windgeschwindigkeit suchen und auch in Text umwandeln #
string word = "Night:";
string param = "Wind:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5N_WindAkt"+Zahl).State(daten);
!  WriteLine(daten);
!  #  Umsetzung in Wetterdienst-Windtexte  #
      if (daten <     0.00) {daten = "???"                          ;} else {
      if (daten <     1.00) {daten = "Windstille"                   ;} else {
      if (daten <     5.00) {daten = "Leiser Zug"                   ;} else {
      if (daten <    11.00) {daten = "Leichte Brise"                ;} else {
      if (daten <    19.00) {daten = "Schwacher Wind"               ;} else {
      if (daten <    28.00) {daten = "Mäßiger Wind"                 ;} else {
      if (daten <    38.00) {daten = "Auffrischender Wind"          ;} else {
      if (daten <    49.00) {daten = "Starker Wind"                 ;} else {
      if (daten <    61.00) {daten = "Starker bis stürmischer Wind" ;} else {
      if (daten <    74.00) {daten = "Stürmischer Wind"             ;} else {
      if (daten <    88.00) {daten = "Sturm"                        ;} else {
      if (daten <   102.00) {daten = "Schwerer Sturm"               ;} else {
      if (daten <   117.00) {daten = "Orkanartiger Sturm"           ;} else {
      if (daten >=  117.00) {daten = "Orkan"                        ;} }}}}}}}}}}}}}
 dom.GetObject("SV_WETTER_For5N_WindAktTXT"+Zahl).State(daten);
!  WriteLine(daten);

! # Windrichtung (Text) suchen #
string word = "Night:";
string param = "Localized:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("English:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0));
 dom.GetObject("SV_WETTER_For5N_WindDir"+Zahl).State(daten);
!  WriteLine(daten);

! # Windboen suchen #
string word = "Night:";
string param = "WindGust:Speed:Value:";
integer param_laenge = param.Length();
integer word_position = WetterXML.Find(word);
integer word_pos_end = WetterXML.Find("Unit:") - word_position;
string daten = WetterXML.Substr(word_position, word_pos_end);
word_position = daten.Find(param);
daten = daten.Substr(word_position + param_laenge, daten.Length());
word_pos_end = daten.Find(",");
daten = daten.Substr(0, (word_pos_end -0)).ToFloat();
 dom.GetObject("SV_WETTER_For5N_WindBoen"+Zahl).State(daten);
!  WriteLine(daten);
}
Hallo Frank,

konnte es natürlich nicht verwarten dein Script mal zu testen.
Habe meine Daten im Script eingegeben und ein paar SV_Variablennamen angepasst und getestet.

Was soll ich sagen,

Absolut T O P :D :D :D ,
super übersichtlich, einfach an meine Bedürfnisse anpassbar, das Script ist echt Klasse :!: :!:

Werde weiterhin testen und mich melden wenn ich Fragen habe :mrgreen:

nochmals DANKE !

Grüße aus dem Schuttertal :!:
Jürgen

Benutzeravatar
FBK2904
Beiträge: 123
Registriert: 22.03.2016, 17:12
Wohnort: Ludwigsburg

Re: AccuWeather Forecast Antwort File parsen

Beitrag von FBK2904 » 15.06.2019, 12:47

Jimbaem hat geschrieben:
10.06.2019, 19:16
Sorry, habs trotzdem noch nicht begriffen wie das in NEO aussehen soll und was ich dafür brauche.
Sodele ... hier noch zwei Screenshots zu meinen beiden Scripten, wie die generierten Daten bildlich in meiner
NEO dargestellt werden.

Einmal die "CurrentConditions" auf meiner Hauptseite:
AW - CurrentConditions.PNG

Und die "Forecasts" für 3 Tage aus dem 5-Tage XML:
(reicht mir, da die Wetterfrösche sowieso nicht langfristiger ihre Vorhersagen hinbekommen :x )
AW - Forecast (5-Day).PNG

Grüssle,
Frank

Antworten

Zurück zu „HomeMatic allgemein“