Wettervorhersage über AccuWeather

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

MichaelN
Beiträge: 6664
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 495 Mal
Danksagung erhalten: 1028 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 22.08.2021, 14:48

chriwi hat geschrieben:
22.08.2021, 11:14
Als Logikwert mit true/false, um den Alarm über "Leak" zu bekommen. Die API sagt hier auch Boolean.
mmmh, wie möchtest Du denn den Durchschnitt von true/false berechnet haben?
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 +++

chriwi
Beiträge: 51
Registriert: 20.12.2019, 16:42
Hat sich bedankt: 13 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von chriwi » 22.08.2021, 15:13

Meine Annahme war, dass analog zum String kein Min/Max existiert und daher nur avg als SV Sinn macht.
(Wie wertest du den Wettertext hier aus?)
Bei meinen Current Conditions werte ich nur die nächste Stunde aus.
Ansonsten sehe ich zwei Optionen interessant, ggf. über einen Flag zu steuern:
- A) Wenn mind. ein "True" in der def. Anzahl der Stunden existiert, dann ist die SV = True
- B) Die Mehrheit aus "True" und "False" wird ausgewertet.
Raspberry Pi 4 auf Bullseye mit Homebridge und HomeMatic 3.65.11 (piVCCU3, RPI-RF-MOD)
Homematic-HAP
HmIP-PSM, HmIP-PS, HmIP-BSM x2, HmIP-BROLL x17, HmIP-WTH2, HmIP-STH, HmIP-SWSD x3, HmIP-WRC6
Garagentor (HMIP-SWDO, HM-LC-Sw1-Pl-CT-R1)
Solar-log Base 15, FW 5.1.1
IKEA Tradfi (Licht, ShortButton -> Garagentor)
HM-pdetect mit Fritzbox-Config (Anwesenheit)

MichaelN
Beiträge: 6664
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 495 Mal
Danksagung erhalten: 1028 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 22.08.2021, 16:51

War doch nicht so einfach, zumindest wenn man die Möglichkeit berücksichtigen will, das das jemand nicht nur bei CurrentCondition anwendet.

Ab V1.8 kann das Skript nun auch mit Systemvariablen Typ Logik umgehen. Das macht natürlich nur Sinn, wenn an der Stelle auch nur boolesche Werte (true/false) geliefert werden. Dann wird der max-Wert true annehmen, wenn mindestens einmal true enthalten war. Der min-Wert wird false, wenn mindestens einmal false enthalten war. Der avg-Wert wird true, wenn die meisten übermittelten Werte true waren, ansonsten false. Damit das funktioniert, muss in NameSVavg0 der Name einer Systemvariable Typ Logik eingetragen sein. Auch wenn man den avg-Wert gar nicht braucht. Man kann dann die gleiche SV wie für min oder max eintragen. Der avg-Wert wird dann überschrieben.

Außerdem wird nun per Voreinstellung der API-Abruf auf deutsch erfolgen und deutsche Umlaute korrekt umgesetzt.

Skript siehe Beitrag 1
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 +++

chriwi
Beiträge: 51
Registriert: 20.12.2019, 16:42
Hat sich bedankt: 13 Mal
Danksagung erhalten: 1 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von chriwi » 23.08.2021, 20:40

Besten Dank, Michael! Ich habe auf die letzte Version des Skripts aktualisiert und warte jetzt auf Regen ;-)

Edit: funktioniert wunderbar - danke nochmals!
Bild
Dateianhänge
39331938-0CF2-43FB-B71B-341ABC06B65C.jpeg
Raspberry Pi 4 auf Bullseye mit Homebridge und HomeMatic 3.65.11 (piVCCU3, RPI-RF-MOD)
Homematic-HAP
HmIP-PSM, HmIP-PS, HmIP-BSM x2, HmIP-BROLL x17, HmIP-WTH2, HmIP-STH, HmIP-SWSD x3, HmIP-WRC6
Garagentor (HMIP-SWDO, HM-LC-Sw1-Pl-CT-R1)
Solar-log Base 15, FW 5.1.1
IKEA Tradfi (Licht, ShortButton -> Garagentor)
HM-pdetect mit Fritzbox-Config (Anwesenheit)

Mallet125
Beiträge: 3
Registriert: 07.07.2022, 17:07
System: CCU

Re: Wettervorhersage über AccuWeather

Beitrag von Mallet125 » 12.07.2022, 14:01

Hallo Michael,

vielen Dank für Deine Arbeit. Auf Basis deines Skriptes habe meine Version erstellt und auch die Variablen per skript generiert. Den Code dazu kann man via skript testen einmal laufen lassen und damit die Variablen anlegen lassen. Diese Version möchte ich gerne mit euch teilen:

Code: Alles auswählen

WriteLine("Variablen werden angelegt:");
string svName = "AW_VhS_Sonneneinstrahlung";
object  svObj  = dom.GetObject(svName);
 
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtFloat);
    svObj.ValueSubType(istGeneric);
     
    svObj.DPInfo("AccuWeather aktuelle Sonneneinstrahlung");
    svObj.ValueUnit("km/h");
    svObj.ValueMin(0);
    svObj.ValueMax(300);
    svObj.State(15);
    svObj.Internal(false);
    svObj.Visible(true);
 
    dom.RTUpdate(false);
}
 
WriteLine("Variable erstellt: " svObj.Value().ToString());

string svName = "AW_VhS_Minimale_Sonneneinstrahlung";
object  svObj  = dom.GetObject(svName);
 
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtFloat);
    svObj.ValueSubType(istGeneric);
     
    svObj.DPInfo("AccuWeather Minimale Sonneneinstrahlung");
    svObj.ValueUnit("W/m²");
    svObj.ValueMin(0);
    svObj.ValueMax(300);
    svObj.State(15);
    svObj.Internal(false);
    svObj.Visible(false);
 
    dom.RTUpdate(false);
}
 
WriteLine("Variable erstellt: " svObj.Value().ToString());

string svName = "AW_VhS_Maximale_Sonneneinstrahlung";
object  svObj  = dom.GetObject(svName);
 
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtFloat);
    svObj.ValueSubType(istGeneric);
     
    svObj.DPInfo("AccuWeather Maximale Sonneneinstrahlung");
    svObj.ValueUnit("W/m²");
    svObj.ValueMin(0);
    svObj.ValueMax(300);
    svObj.State(15);
    svObj.Internal(false);
    svObj.Visible(true);
 
    dom.RTUpdate(false);
}
 
WriteLine("Variable erstellt: " svObj.Value().ToString());



string svName = "AW_VhS_durchschnittliche_Windgeschwindigkeit";
object  svObj  = dom.GetObject(svName);
 
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtFloat);
    svObj.ValueSubType(istGeneric);
     
    svObj.DPInfo("AccuWeather durchschnittliche Windgeschwindigkeit");
    svObj.ValueUnit("W/m²");
    svObj.ValueMin(0);
    svObj.ValueMax(300);
    svObj.State(15);
    svObj.Internal(false);
    svObj.Visible(true);
 
    dom.RTUpdate(false);
}
 
WriteLine("Variable erstellt: " svObj.Value().ToString());

string svName = "AW_VhS_Minimale_Windgeschwindigkeit";
object  svObj  = dom.GetObject(svName);
 
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtFloat);
    svObj.ValueSubType(istGeneric);
     
    svObj.DPInfo("AccuWeather minimale Windgeschwindigkeit");
    svObj.ValueUnit("km/h");
    svObj.ValueMin(0);
    svObj.ValueMax(300);
    svObj.State(15);
    svObj.Internal(false);
    svObj.Visible(false);
 
    dom.RTUpdate(false);
}
 
WriteLine("Variable erstellt: " svObj.Value().ToString());

string svName = "AW_VhS_Maximale_Windgeschwindigkeit";
object  svObj  = dom.GetObject(svName);
 
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtFloat);
    svObj.ValueSubType(istGeneric);
     
    svObj.DPInfo("AccuWeather maximale Windgeschwindigkeit");
    svObj.ValueUnit("km/h");
    svObj.ValueMin(0);
    svObj.ValueMax(300);
    svObj.State(15);
    svObj.Internal(false);
    svObj.Visible(true);
 
    dom.RTUpdate(false);
}
 
WriteLine("Variable erstellt: " svObj.Value().ToString());

if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtString);
    svObj.ValueSubType(istChar8859);
     
    svObj.DPInfo("AccuWeather Start der Vorhersage");
    svObj.ValueUnit("");
    svObj.State("some text");
    svObj.Internal(false);
    svObj.Visible(true);
 
    dom.RTUpdate(false);
}
 
WriteLine("Variable erstellt: " svObj.Value().ToString());

string  svName = "AW_VhS_Vorhersage-bis";
object  svObj  = dom.GetObject(svName);
 
if (!svObj){   
    object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
 
    svObj = dom.CreateObject(OT_VARDP);
 
    svObjects.Add(svObj.ID());
 
    svObj.Name(svName);   
    svObj.ValueType(ivtString);
    svObj.ValueSubType(istChar8859);
     
    svObj.DPInfo("AccuWeather Gültigkeit der Vorhersage");
    svObj.ValueUnit("");
    svObj.State("some text");
    svObj.Internal(false);
    svObj.Visible(true);
 
    dom.RTUpdate(false);
}
WriteLine("Variable erstellt: " svObj.Value().ToString());
WriteLine("Alle Variablen sind nun angelegt.");
btw: ich habe folgende Variablen definiert:

Code: Alles auswählen

integer AnzahlTags = 8; !-Anzahl der eingetragenen XML-Tags
string xmlTagStart = 'Temperature,RealFeelTemperature,RelativeHumidity,CloudCover,TotalLiquid,EpochDateTime,Wind,SolarIrradiance'; !- Oder ,WindGust wenn Dir die Böen wichtiger sind
string xmlTagEnd = "RealFeelTemperature,WetBulbTemperature,IndoorRelativeHumidity,MobileLink,Rain,WeatherIcon,Direction,MobileLink"; !- oder ,RelativeHumidity für die Böen
string xmlWertStart = "Value,Value,:,:,Value,:,Value,Value"; !-Suchstring vor dem Wert
string xmlWertEnd = 'Unit,Unit,",",Unit,",Unit,Unit'; !-Suchstring nach dem Wert
string xmlWertStartOffset = "7,7,1,1,7,1,7,7"; !-Länge Wert-Suchstring + Anzahl Zeichen bis zum Wert
string xmlWertEndOffset = "9,9,2,2,9,2,9,9"; !-StartOffset + Anzahl Zeichen zwischen Zahl und Ende-String
string NameSVavg0         = "AW_VhS_Durchschnittstemperatur,AW_VhS_Gefühlte_Temperatur,AW_VhS_Feuchte,AW_VhS_Wolken,AW_VhS_Regen_gesamt,,AW_VhS_durchschnittliche_Windgeschwindigkeit,AW_VhS_Sonneneinstrahlung";
string NameSVmin0         = "AW_VhS_Minimaltemperatur,AW_VhS_Gefühlte_Minimaltemperatur,AW_VhS_Feuchte_min,AW_VhS_Wolken_min,AW_VhS_Regen_min,AW_VhS_Vorhersage-von,AW_VhS_Minimale_Windgeschwindigkeit,AW_VhS_Minimale_Sonneneinstrahlung";
string NameSVmax0         = "AW_VhS_Maximaltemperatur,AW_VhS_Gefühlte_Maximaltemperatur,AW_VhS_Feuchte_max,AW_VhS_Wolken_max,AW_VhS_Regen_max,AW_VhS_Vorhersage-bis,AW_VhS_Maximale_Windgeschwindigkeit,AW_VhS_Maximale_Sonneneinstrahlung";
integer RegenFlag         = 4;      !- Position der Regendaten (ab 0 zählen) zur Ausgabe der Gesamtmenge - auf 999 setzen, wenn stattdessen der Tagesdurchschnitt gewünscht ist
integer WindFlag          = 999;    ! Position der Winddaten (zur Umrechnung von km/h in m/s) - auf 999 setzen, wenn keine Umrechnung gewünscht oder kein Wind ausgewertet werden soll
integer Stunden           = 12;     !- Anzahl der Stunden, die ausgewertet werden (min 1 / max 12)
boolean SAVE              = true;   !- in SV speichern: auf false für Testbetrieb, sonst true
Viel Spaß damit.

MichaelN
Beiträge: 6664
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 495 Mal
Danksagung erhalten: 1028 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 12.07.2022, 14:25

Mallet125 hat geschrieben:
12.07.2022, 14:01
und auch die Variablen per skript generiert
Genau das habe ich ganz bewusst nicht in meinem Skript eingebaut. Wenn man sich mal die anderen Skripte zum Thema Wetter anschaut, stellt man fest, daß genau das der Grund für viele Problem und Rückfragen ist. Zunächst mal scheint es für den einfachen User besser zu sein, wenn das Skript ihm alles abnimmt. Aber dann kommt der Punkt, wo jemand ohne genauere Kenntnisse Dinge anpassen möchte. Und da er die Zusammenhänge nicht überblickt heisst es dann schnell "geht bei mir nicht".

Zum anderen ist es ja nur ein einmaliger Vorgang selber ein paar Variablen anzulegen. Da ist das Erstellen eines Skripts und die notwendigen Tetsläufe aufwendiger.

Drittens würde das nicht die Flexibilität ermöglichen genau die Daten auszuwerten, die man selber benötigt. Theoretisch könnte man auch das Anlegen der Systemvariablen automatisieren (also nicht so, wie Du es gemacht hast, sondern auf Basis variabler Daten), aber dann müsste man noch irgendwie erraten (oder definieren) welchen Variablentyp, mit welcher Range und Einheit man benötigt.

Unterm Strich: ich lege die SV's lieber selber an, dann habe ich die Kontrolle über mein System.

Ach ja, und wenn Du SV automatisch anlegst, dann solltest Du unreferenzierte Zugriffe auf Objekte vermeiden:

Code: Alles auswählen

object  svObj  = dom.GetObject(svName);
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 +++

Hordeia
Beiträge: 18
Registriert: 01.11.2021, 15:29
System: CCU
Hat sich bedankt: 9 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Hordeia » 24.11.2022, 09:18

Hallo,
erstmal vielen Dank für ein tolles Skript und eine sehr gute Doku! Auch ich bin weiter gekommen, Danke!
Ich nutze CCU3, kein CUXD, Systemvariablen sind 1x angelegt, das Original-Skript läuft (momentan noch auf 1 h beschränkt),
URL funktioniert und auch anpassen hat schon irgendwie funktioniert.

Meine letzte Variante konnte ich jedoch nicht mehr testen.

Nun ist mir etwas aufgefallen bezüglich Testversion. Mir scheint, sie basiert noch auf Zeilen, die mit dem CUXD arbeiten.
Die Zeilen, die zu suchen sind:

Code: Alles auswählen

!- Abruf der Daten
dom.GetObject(CUXD_Device#".CMD_SETS").State(func);
dom.GetObject(CUXD_Device#".CMD_QUERY_RET").State(1);
recXML = dom.GetObject(CUXD_Device#".CMD_RETS").State(); 
Sehen heute etwas anders aus:

Code: Alles auswählen

!- Abruf der Daten
if ( !CUXD_Device ) {
! system.exec
system.Exec(func, &recXML, &error);
} else {
! CUxD
dom.GetObject(CUXD_Device#".CMD_SETS").State(func);
dom.GetObject(CUXD_Device#".CMD_QUERY_RET").State(1);
recXML = dom.GetObject(CUXD_Device#".CMD_RETS").State();
}
if(!recXML)
  {
  if ( CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.6: keine Antwort vom Wetter-Server!]"); }
  WriteLine("MichaelN Script AccuWeather V1.6: keine Antwort vom Wetter-Server!");
  quit;
  }
if( !recXML.Contains(xmlTimeStart) )
  { ! V1.6 division by Null abfangen
  if (CUXD_Device ) { (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.6: xmlTimeStart falsch definiert!]"); }
  WriteLine("MichaelN Script AccuWeather V1.6: xmlTimeStart falsch definiert!");
  quit;
  }
Damit funktioniert ein einfaches Ersetzen der drei Zeilen in der Version ohne CUXD nicht, die Abfrage an den Server bleibt bestehen.

Frage: Kann ich in dieser Version (ohne CUXD) keine Testvariante erstellen?
Einfaches ja/nein reicht. Dann warte ich mit dem Test.


---
P. S. Für alle anderen, die beim Anlegen der Systemvariablen Mühe haben, empfehle ich:
https://technikkram.net/blog/2019/01/10 ... -loeschen/
Das in eine ForEach Schleife und fertig.

MichaelN
Beiträge: 6664
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 495 Mal
Danksagung erhalten: 1028 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 24.11.2022, 12:34

Da irgendwann die Auswahl mit / ohne Cuxd reinkam, sind die Test Daten nun an einer leicht anderen Stelle einzusetzen. Ich habe es in Beitrag 1 angepasst.
Hordeia hat geschrieben:
24.11.2022, 09:18
P. S. Für alle anderen, die beim Anlegen der Systemvariablen Mühe haben, empfehle ich:
https://technikkram.net/blog/2019/01/10 ... -loeschen/
Das in eine ForEach Schleife und fertig.
Meinst Du wirklich, das jemand, der Probleme hat über die WebUI Systemvariablen anzulegen, damit weiter kommt? :roll:
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 +++

Hordeia
Beiträge: 18
Registriert: 01.11.2021, 15:29
System: CCU
Hat sich bedankt: 9 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Hordeia » 25.11.2022, 07:38

MichaelN hat geschrieben:
24.11.2022, 12:34
Da irgendwann die Auswahl mit / ohne Cuxd reinkam, sind die Test Daten nun an einer leicht anderen Stelle einzusetzen. Ich habe es in Beitrag 1 angepasst.
Hordeia hat geschrieben:
24.11.2022, 09:18
P. S. Für alle anderen, die beim Anlegen der Systemvariablen Mühe haben, empfehle ich:
https://technikkram.net/blog/2019/01/10 ... -loeschen/
Das in eine ForEach Schleife und fertig.
Meinst Du wirklich, das jemand, der Probleme hat über die WebUI Systemvariablen anzulegen, damit weiter kommt? :roll:
Hallo,
großartig! Vielen vielen Dank für Deine spontane Hilfe! Klappt super!
Obwohl ich mich etwas schäme, hätte ja drauf kommen können die gesamte Schleife zu ersetzen, sorry für die Umstände.
Meinst Du wirklich, dass jemand, der Probleme hat über die WebUI Systemvariablen anzulegen, damit weiter kommt? :roll:
Nein, aber wenn man sich mit solchen Skripten beschäftigt, sollte man damit was anfangen können. Ich neige zu Flüchtigkeitsfehlern über das UI.

Antworten

Zurück zu „Projektvorstellungen“