Wettervorhersage über AccuWeather

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 27.10.2020, 17:23

Schau mal ob du da fündig wirst, da habe ich ein paar andere Skripte verlinkt, die etwas einfacher arbeiten
viewtopic.php?f=18&t=59270
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 +++

Gezeichneter
Beiträge: 16
Registriert: 26.10.2020, 22:21
System: CCU
Hat sich bedankt: 13 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Gezeichneter » 27.10.2020, 20:08

Hi Michael,

die Links hatte ich schon vorher überflogen, leider wirklich nur überflogen...
Der Link zu DimMyPrp hatte ich mir nun mal genauer angeschaut und siehe da Perfekt!

Danke!

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 14.11.2020, 18:24

@Muasmolle hatte mich gefragt, ob man auch Sonnenscheinstunden für den nächsten Tag auswerten kann.

Man tausche diese Blöcke aus:

Code: Alles auswählen

!-=== Hier anpassen ===
integer AnzahlTags        = 1; !-Anzahl der eingetragenen XML-Tags
string xmlTagStart        = 'RealFeelTemperatureShade';     !-XML-Start-Tag
string xmlTagEnd          = 'Heating'; !-XML-End-Tag
string xmlWertStart       = 'HoursOfSun'; !-Suchstring vor dem Wert
string xmlWertEnd         = 'DegreeDaySummary';    !-Suchstring nach dem Wert
string xmlWertStartOffset = "12";             !-Länge Wert-Suchstring + Anzahl Zeichen bis zum Wert
string xmlWertEndOffset   = "14";             !-StartOffset + Anzahl Zeichen zwischen Zahl und Ende-String
string NameSVavg0         = "SunAVG";      !- Namen der Systemvariablen fuer Durchschnitt aktueller Tag
string NameSVmin0         = "SunMIN";      !- Namen der Systemvariablen fuer min-Wert
string NameSVmax0         = "SunMAX";      !- Namen der Systemvariablen fuer max-Wert
integer RegenFlag         = 999;      !- Position der Regendaten (ab 0 zählen) zur Ausgabe der Gesamtmenge - auf 999 setzen, wenn stattdessen der Tagesdurchschnitt gewünscht ist
integer Stunden           = 5;     !- Anzahl der Tage, die ausgewertet werden (min 1 / max 5)
boolean SAVE              = true;   !- in SV speichern: auf false für Testbetrieb, sonst true

!- === ab hier nichts mehr anpassen ===
!- Suchstrings und Offset-Werte zum extrahieren der Zeit
string xmlTimeStart       = '"Date"';
integer xmlSkip           = 100;

!- XML Accuweather
string recXML;
string func = "wget -q -O - 'http://dataservice.accuweather.com/forecasts/v1/daily/5day/"#OrtsID#"?apikey="#APIKey#"&details=true&metric=true'"; 
Damit wird dann die 5-Tages-API abgefragt. Hier nach den Sonnenstunden. Die Variable "Stunden" ist jetzt allerdings nicht mehr für die Anzahl der Stunden, sondern die Anzahl der Tage zuständig. In den System-Variablen (soweit angelegt) SunAVG, SunMIN und SunMAX stehen dann die entsprechenden Ergebnisse.

Eine Änderung am restlichen Code ist soweit nicht erforderlich. Allerdings haben wir damit auch noch nicht die Sonnenscheinstunden für den NÄCHSTEN Tag. Selbst wenn man "Stunden" auf 2 setzt. Aber vielleicht hilft dies ja auch schon dem einen oder anderen bei einer speziellen Aufgabenstellung weiter.
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 +++

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 14.11.2020, 18:50

Und hier nun die Lösung, um Daten für einen bestimmten der nächsten 5 Tage auszulesen - ACHTUNG: diese Lösung ist aber nicht mehr 100% kompatibel mit dem ursprünglichen Skript!

Code: Alles auswählen

!- aktuelle 5d-Wettervorhersage V2.0 AccuWeather universell (MichaelN 14.11.2020)
!- V2.0 angepasst für 5-Tages-Vorhersage
!- benötigte Systemvariablen anlegen: siehe Inhalt von NameSVxxx0

!-=== Hier anpassen ===
string OrtsID = "123456";                           !- Hier ID für den Ort eintragen
string APIKey = "AAAAAAABBBBBBBBBBCCCCCCCCCDDDDDD"; !- Hier API-Key eintragen
string CUXD_Device = "CUxD.CUX2801001:1";           !- Hier CUxD-Device konfigurieren


!-=== Hier anpassen ===
integer AnzahlTags        = 1; !-Anzahl der eingetragenen XML-Tags
string xmlTagStart        = 'RealFeelTemperatureShade';     !-XML-Start-Tag
string xmlTagEnd          = 'Heating'; !-XML-End-Tag
string xmlWertStart       = 'HoursOfSun'; !-Suchstring vor dem Wert
string xmlWertEnd         = 'DegreeDaySummary';    !-Suchstring nach dem Wert
string xmlWertStartOffset = "12";             !-Länge Wert-Suchstring + Anzahl Zeichen bis zum Wert
string xmlWertEndOffset   = "14";             !-StartOffset + Anzahl Zeichen zwischen Zahl und Ende-String
string NameSVavg0         = "SunAVG";      !- Namen der Systemvariablen fuer Durchschnitt aktueller Tag
string NameSVmin0         = "SunMIN";      !- Namen der Systemvariablen fuer min-Wert
string NameSVmax0         = "SunMAX";      !- Namen der Systemvariablen fuer max-Wert
string NameSVDay          = "SunMorgen";   !- Namen der Systemvaiablen für den Zieltag (siehe Tagesflag)
integer RegenFlag         = 999;      !- Position der Regendaten (ab 0 zählen) zur Ausgabe der Gesamtmenge - auf 999 setzen, wenn stattdessen der Tagesdurchschnitt gewünscht ist
integer Stunden           = 5;     !- Anzahl der Tage, die ausgewertet werden (min 1 / max 5)
integer Tagesflag         = 2;     !- Tag der in NameSVDay gespeichert werden soll
boolean SAVE              = true;   !- in SV speichern: auf false für Testbetrieb, sonst true

!- === ab hier nichts mehr anpassen ===
!- Suchstrings und Offset-Werte zum extrahieren der Zeit
string xmlTimeStart       = '"Date"';
integer xmlSkip           = 100;

!- XML Accuweather
string recXML;
string func = "wget -q -O - 'http://dataservice.accuweather.com/forecasts/v1/daily/5day/"#OrtsID#"?apikey="#APIKey#"&details=true&metric=true'";

!- Arbeitsvariablen
string wert1;
string wert2;
time zeit;
integer counter; !- Sicherheitszaehler gegen Endlosschleife
integer StartPos;
integer EndPos;
integer index;
var Wert_avg;
var Wert_min;
var Wert_max;
var Wert_tmp;
var Wert_Day;
object SV;
integer SVTyp = 4; !- V1.3
string Trenner = "\t";

!- Diese Variablen enthalten am Schluss die Ergebnisse
string Day0_avg = "";


!- ENDE Deklarationen und Initialisierungen
!- ******************************************************************************************

!- 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();
if(!recXML)
  {
  (dom.GetObject(ID_DATAPOINTS)).Get(CUXD_Device#".CMD_EXEC").State("logger -t script -p user.debug [MichaelN Script AccuWeather V1.2: keine Antwort vom Wetter-Server!]");
  WriteLine("MichaelN Script AccuWeather V1.2: keine Antwort vom Wetter-Server!");
  quit;
  }
!- *** DEBUG recXML = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State();
!- *** DEBUG dom.GetObject (ID_SYSTEM_VARIABLES).Get ("xxTest").State(recXML);

xmlSkip = recXML.Find(xmlTimeStart); !- ersten Block beschneiden
recXML = recXML.Substr(xmlSkip);
  WriteLine(recXML);

!- Werte auslesen
counter = 0;
index = 0;
StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",0));

while ( (StartPos>=0) && (counter<100) ){

  if (counter < Stunden) {
    index = 0;
    while ( index < AnzahlTags ) {
    StartPos = recXML.Find(xmlTagStart.StrValueByIndex(",",index));
    EndPos = recXML.Substr(StartPos).Find(xmlTagEnd.StrValueByIndex(",",index));
    if ( EndPos == -1 )
      {
      EndPos = 5;
      WriteLine("DEBUG Z96: EndPos nicht gefunden!");
      }
    EndPos = EndPos + StartPos;
    wert2 = recXML.Substr(StartPos, EndPos-StartPos); !- nur das relevante Tag
     WriteLine("DEBUG TAG: "#wert2);
    StartPos = wert2.Find(xmlWertStart.StrValueByIndex(",",index));
    EndPos = wert2.Substr(StartPos).Find(xmlWertEnd.StrValueByIndex(",",index));
    if ( EndPos == -1 )
      {
      EndPos = 5;
      WriteLine("DEBUG Z106: EndPos nicht gefunden!");
      }
    EndPos = EndPos + StartPos;
    wert2 =  wert2.Substr(StartPos+xmlWertStartOffset.StrValueByIndex(",",index).ToInteger(),(EndPos-StartPos)-xmlWertEndOffset.StrValueByIndex(",",index).ToInteger());
      WriteLine("DEBUG WERT: "#wert2#" --- Start:"#StartPos#" --- End:"#EndPos);
    Day0_avg = Day0_avg # wert2 # ",";  !- V1.3
    !- *** DEBUG
     WriteLine("c/i/w2:"#counter#"/"#index#"/"#wert2);
    index = index + 1;

     }
  }

  StartPos = recXML.Find(xmlTimeStart);
  xmlSkip = StartPos+xmlTimeStart.Length(); !- abgearbeiteten Block ausschneiden
  recXML = recXML.Substr(xmlSkip);
  StartPos = recXML.Find(xmlTimeStart);
  if ( StartPos > -1 ) { recXML = recXML.Substr(StartPos); }
  !- *** DEBUG
  !- WriteLine("DEBUG SKIP: c"#counter#" --- Start:"#StartPos#" --- "#recXML);
  counter = counter + 1;
}


!- Werte aus Ergebnisliste fischen und wieder richtig zuordnen
counter = 0;
wert1 = "";
while ( counter < AnzahlTags ) {
    SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVavg0.StrValueByIndex(",",counter)); !- V1.3
    if ( SV ) { SVTyp = SV.ValueType(); } else { SVTyp = 4; }
    index = AnzahlTags;
    Wert_avg = 0.0;
    Wert_min = 3000000000.0;
    Wert_max = -1000.0;
    EndPos = 0;
    foreach(wert2,Day0_avg.Split(",")) {
        if ( (index % AnzahlTags) == counter ) {
            !- jeden x. Eintrag auslesen
            if ( SVTyp == 4 ) {
              !- SV Zahl (V1.3)
              Wert_tmp = wert2.ToFloat();
              Wert_avg = Wert_avg + Wert_tmp;
              EndPos = EndPos + 1;
              Wert_min = Wert_min.Min(Wert_tmp);
              Wert_max = Wert_max.Max(Wert_tmp);
            } elseif ( SVTyp == 20 ) {
              !- SV String
              if ( Wert_avg.VarType() == 4 )
              { Wert_avg = Wert_avg # Trenner # wert2; } else
              { Wert_avg = wert2; }
            } else {
              !- SV keine Zahl, kein String, keine Ergebnisse
              Wert_avg = 0;
            }
            if ( index == Tagesflag ) {
            ! durch Tagesflag definierter Tag errreicht
              Wert_Day = Wert_tmp;
            }
            !- *** DEBUG
            WriteLine("c/i/EP/w:"#counter#"/"#index#"/"#EndPos#"/"#wert2);
        }
        index = index + 1;
    }
    !- Durchschnitt berechnen
    if ( (RegenFlag <> counter) && ( SVTyp == 4 ) ) {
    Wert_avg = Wert_avg/EndPos; }
    !- Werte in die SV schieben
    !- *** DEBUG
      WriteLine("*** DEBUG Werte für SV ***");
      WriteLine("--AVG--"#NameSVavg0.StrValueByIndex(",",counter)#": "#Wert_avg);
      WriteLine("--MIN--"#NameSVmin0.StrValueByIndex(",",counter)#": "#Wert_min);
      WriteLine("--MAX--"#NameSVmax0.StrValueByIndex(",",counter)#": "#Wert_max);

    if ( SV && SAVE ) {SV.State(Wert_avg);}
    SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmin0.StrValueByIndex(",",counter));
    if ( SV && SAVE ) {SV.State(Wert_min);}
    SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVmax0.StrValueByIndex(",",counter));
    if ( SV && SAVE ) {SV.State(Wert_max);}
    SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get(NameSVDay.StrValueByIndex(",",counter));
    if ( SV && SAVE ) {SV.State(Wert_Day);}
    !- *** DEBUG
      wert1 = wert1 #"*"# xmlTagStart.StrValueByIndex(",",counter) #"* avg/min/max/Day:"# Wert_avg.ToString(1) #"/"# Wert_min.ToString(1) #"/"# Wert_max.ToString(1) #"/"# Wert_Day.ToString(1) # "\n";

    counter = counter + 1;
}

!- *** DEBUG
WriteLine(wert1);
WriteLine("===ENDE===");
Neu:

NameSVDay muss mit den Namen der Systemvariablen gefüllt werden, die den Tageswert aufnehmen sollen. Hier: SunMorgen
Tagesflag wird mit der Nummer des auszuwertenden Tages gefüllt. 1=heute; 2=morgen, etc. Hier: 2

Beispiel der Debug-Ausgaben:
c/i/EP/w:0/1/1/1.7
c/i/EP/w:0/2/2/1.2
c/i/EP/w:0/3/3/3.4
c/i/EP/w:0/4/4/3.2
c/i/EP/w:0/5/5/2.6
*** DEBUG Werte für SV ***
--AVG--SunAVG: 2.420000
--MIN--SunMIN: 1.200000
--MAX--SunMAX: 3.400000
--DAY--SunMorgen: 1.200000
*RealFeelTemperatureShade* avg/min/max/Day:2.4/1.2/3.4/1.2
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 +++

Hominger
Beiträge: 131
Registriert: 06.12.2017, 22:14
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 29 Mal
Danksagung erhalten: 5 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Hominger » 19.11.2020, 11:50

Hallo Michael,

erstmal vielen Dank für das g...e Projekt !
Ich suche nach einer Möglichkeit an den max. Tages-Sonnenwinkel (max. Elevation) zu kommen.
Hintergrund: Mir "läuft die Sonne am Hausdach hoch" und ich würde gerne u.a. über diesen Winkel beschatten.
Hättest Du mir eine Idee aus welchem Forecast ich diesen bekommen könnte ?
Danke,
Martin
RP3b+ mit HM-MOD-RPI-PCB, HM-WDS30-OT2-SM, HmIP-SLO, HmIP-MOD-OC8, 13St. HmIP-BROLL, etc.

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 19.11.2020, 12:45

Das Problem habe ich noch nicht verstanden.
Du willst ein Fenster beschatten wenn die Sonne reinfallen könnte? Dann sieht Dir mal meinem Link in der Signatur zur Rolladen Steuerung an. Ich habe das dort zwar nur Azimut-Abhängig gemacht, aber das noch mit der Sonnenhöhe zu kombinieren ist ja kein Hexenwerk.
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 +++

Muasmolle
Beiträge: 68
Registriert: 30.03.2017, 21:34
Wohnort: Laupheim
Hat sich bedankt: 11 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von Muasmolle » 19.11.2020, 21:19

MichaelN hat geschrieben:
14.11.2020, 18:50
Und hier nun die Lösung, um Daten für einen bestimmten der nächsten 5 Tage auszulesen - ACHTUNG: diese Lösung ist aber nicht mehr 100% kompatibel mit dem ursprünglichen Skript!

Hallo Michael, das ist ja mega, vielen Dank für das Skript! Hat bei mir auf Anhieb funktioniert. Endlich kann ich mein Heizungssystem (Wärmepumpe mit PV-Eigenverbauchsoptimierung und große Betonplatte(Schwedenplatte) als Wärmespeicher) vorrausschauend steuern.
Toll dass es in diesem Forum so gute und hilfsbereite Cracks gibt!

Nur noch zwei Verständnisfragen:
Kann ich dieses Script separat zum alten AccuWeather-Skript laufen lassen ohne dass es zu Komplikationen kommt?? (Vorerst noch)
Und ist es in diesem Fall auch wieder wichtig, wann ich dieses Skript ausführe, oder ist es egal wann? Bzw. Wann wäre der beste Ausführungszeitpunkt für meine Anwendung? (Möglichst genaue Sonnenscheindauer für "Morgen". Die Information würde mir ja immer Morgens ca. 8 Uhr reichen.

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von MichaelN » 19.11.2020, 21:50

Das habe ich nicht ausprobiert, wann die 5 Tage vorhersage aktualisiert wird

In die Quere kommen sich die Skripte nicht. Ich würde die nur nicht zeitgleich aufrufen wegen der CPU Last.
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 +++

Benutzeravatar
FBK2904
Beiträge: 454
Registriert: 22.03.2016, 17:12
System: Alternative CCU (auf Basis OCCU)
Wohnort: Bei Ludwigsburg
Hat sich bedankt: 80 Mal
Danksagung erhalten: 42 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von FBK2904 » 20.11.2020, 18:03

MichaelN hat geschrieben:
19.11.2020, 21:50
Das habe ich nicht ausprobiert, wann die 5 Tage vorhersage aktualisiert wird
Ich nutze seit Jahren meine eigens für AccuWeather entworfenen Scripte für "CurrentConditions" und "5-Day".
Nach meinen Erkenntnissen/Erfahrungen wird die "5-Tage Vorschau" nur einmalig am Tag um 7:00 Uhr aktualisiert und sonst nicht mehr.
(die anderen vier APIs werden, je nach dem, öfters am Tag aktualisiert).

Grüssle,
Frank
Grüssle,
Frank
--------------------------
System: CCU3 (RM 3.73.9.20240130) mit Stabantenne (www.stall.biz)
Geräte: 56x HM (classic) / 13x HmIP / 8x CUxD /16x virtuelle Gruppen / 4x PioTek-Tracker V4 FTTB & FAM-USB-Gateway
Addons: XML-API 2.3 / CUx-Daemon 2.11 / CUxD-Highcharts 1.45 / Programme drucken 2.6
Sonstige: SDV v5.03.04 G / AIO Creator NEO v3.1.0 mit 2x Samsung Tab SM-T580 (Root & Android 10 [LineageOS 17.1 by TALUAtXDAi])

6driver
Beiträge: 13
Registriert: 20.12.2020, 14:31
System: CCU
Hat sich bedankt: 1 Mal

Re: Wettervorhersage über AccuWeather

Beitrag von 6driver » 10.01.2021, 17:13

Moin zusammen,
ich würde gerne das Script nutzen und hab mir die gute Beschreibung schon einige Male durchgelesen. Aber als totaler Nichtprogrammierer stehe ich trotzdem etwas auf dem Schlauch und bräuchte noch etwas Anschubhilfe.
Habe wie beschrieben alle Variablen angelegt, den API-Key und Orts-ID erhalten.
wetter01.png
wetter02.png
Der Link http://dataservice.accuweather.com/fore ... ey=c1l.... funktioniert mit meinen Daten auch.

Aber ich weiss jetzt nicht wie ich zu einer formatierten Ausgabe komme. Finde nicht wo die Wetterdaten nachdem Lauf des Scriptes liegen. Oder muss ich mir jetzt eine eigene HTML-Seite basteln? Dachte eigentlich das die Daten in der CCU3 gespeichert werden und ich diese dann z.B. in Mediola neo anzeigen kann.
Würde mich über einen entsprechenden Hinweis freuen.

Grüße
Andreas

Antworten

Zurück zu „Projektvorstellungen“