Wettervorhersage accuweather Skript

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

Moderator: Co-Administratoren

Antworten
chrihoffi
Beiträge: 12
Registriert: 27.05.2018, 18:09

Wettervorhersage accuweather Skript

Beitrag von chrihoffi » 26.03.2019, 09:13

Hallo,

nachdem wunderground und wetter.com keine api (nur für die Vorhersage) mehr haben musste ich umstellen.
Da es verschiedene Themen für die Wettervorhersage gibt habe ich dieses neue Thema erstellt. Wenn falsch, bitte verschieben.
Ich habe mir aus den verschiedenen Quellen von:
-https://homematic.simdorn.net/wettervor ... derground/
-https://smarthome.kuklin.de/2018/06/27/ ... homematic/
und diesem Form für das Datum und anderes ein Skript zusammen geklaut/gebaut, dass nicht die Kommas zählt (bei accuweather verschieben sich diese immer mal wieder), sonder nach Suchstichworten. Auch gibt es mir für mein EasyDisplay zusammengesetzte Texte raus, damit ich nicht für jede Systemvariable eine eigene Zelle benötige.
Nicht so hübsch und bestimmt einige Zeilen überflüssig. Ich kann nur klauen, anpassen und Fehler suchen. Zum Selbst schreiben reicht es noch nicht.
Vielleicht ist da ja doch hilfreich für andere. Tipps nehme ich gerne entgegen.
Die Darstellung erfolgt dann, neben dem EasyDisplay, auch auch auf dem EPaper Display.

Code: Alles auswählen

!Accuweather Vorhersage holen
!
!Hier die WETTERSTATION-ID und API-KEY eintragen
string wetterstation_id = "2600687";
string api_key = "xxxxxxxxxxxxxxxxxxxxxxx";

url = "http://dataservice.accuweather.com/forecasts/v1/daily/1day/"#wetterstation_id#"?apikey="#api_key#"&language=de-de&details=true&metric=true";
dom.GetObject("CUxD.CUX2801001:3.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:3.CMD_QUERY_RET").State(1); 
responce = dom.GetObject("CUxD.CUX2801001:3.CMD_RETS").State();
dom.GetObject("Wetter responce").State(responce);

!umlaut ö finden, zeichen ö   
    string txtneu = "";
    string teilstr;
    foreach(teilstr, responce.Split("¶"))
    {
       if (txtneu == "")
       {
           txtneu = teilstr;
       }else{
           txtneu = txtneu # "ö" # teilstr;
       }
    }
    daten = txtneu;
 
    !umlaut ü finden, zeichen ü   
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¼"))
    {
       if (txtneu == "")
       {
          txtneu = teilstr;
       }else{
          txtneu = txtneu # "ü" # teilstr;
       }
    }
    daten = txtneu;
 
    !umlaut ä finden, zeichen ä
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("¤"))
    {
       if (txtneu == "")
       {
          txtneu = teilstr;
       }else{
          txtneu = txtneu # "ä" # teilstr;
       }
    }
    daten = txtneu;
 
    !umlaute korrigiert, zeichen à entfernen
    string txtneu = "";
    string teilstr;
    foreach(teilstr, daten.Split("Ã"))
    {
       if (txtneu == "")
      {
         txtneu = teilstr;
      }else{
         txtneu = txtneu # "" # teilstr;
      }
    }
    responce = txtneu;

!Daten mit Suchworten aus "responce" ausfiltern:
   !Wettervorhersage Text
    string word = "ShortPhrase";
    integer word_laenge = word.Length();
    string word2 = "LongPhrase";
    integer word2_laenge = word2.Length();
    integer word_position = responce.Find(word);
    string daten = responce.Substr((word_position + word_laenge + 3), 100);
    integer word2_position = daten.Find(word2);
    daten = daten.Substr(0, (word2_position-3));
    dom.GetObject("Wetter tagsüber").State(daten);
	 
  !Wettervorhersage Temp max
    string word = "Maximum";
    integer word_laenge = word.Length();
    string word2 = "Unit";
    integer word2_laenge = word2.Length();
    integer word_position = responce.Find(word);
    string daten = responce.Substr((word_position + word_laenge + 11), 20);
    integer word2_position = daten.Find(word2);
    daten = daten.Substr(0, (word2_position-2));
    dom.GetObject("Wetter Max. Temp.").State(daten);
	 
   !Wettervorhersage Temp min
    string word = "Minimum";
    integer word_laenge = word.Length();
    string word2 = "Unit";
    integer word2_laenge = word2.Length();
    integer word_position = responce.Find(word);
    string daten = responce.Substr((word_position + word_laenge + 11), 20);
    integer word2_position = daten.Find(word2);
    string daten = daten.Substr(0, (word2_position-2));
    dom.GetObject("Wetter Min. Temp.").State(daten);
	  
    
  !Wettervorhersage Gültigkeit
     string word = "DailyForecasts";
     integer word_laenge = word.Length();
     integer word_position = responce.Find(word);
     string datum = responce.Substr((word_position + word_laenge + 12), 10);
    
    !Gültig ab Wochentag
     string y = datum.StrValueByIndex("-",0);
     string m = datum.StrValueByIndex("-",1);
     string d = datum.StrValueByIndex("-",2);;
     datum = datum.ToTime();

     integer wd1 = datum.Format("%w").ToInteger();
     string wtage = "So;Mo;Di;Mi;Do;Fr;Sa";
     string wtag1 = wtage.StrValueByIndex(";",wd1);
     string datum = wtag1#", "#d#"."#m#". 07:00 Uhr";
     dom.GetObject("Wetter gültig ab").State(datum);     

   !Wettervorhersage Regenwahrscheinlichkeit tagsüber
    string word = "RainProbability";
    integer word_laenge = word.Length();
    integer word_position = responce.Find(word);
    string daten = responce.Substr((word_position + word_laenge + 2), 2);
    dom.GetObject("Wetter Regenwahrscheinlichkeit tagsüber").State(daten);


!NACHTS 
 !Wettervorhersage für nachts filtern
    string word = "Night";
    integer word_laenge = word.Length();
    integer word_position = responce.Find(word);
    string datenN = responce.Substr((word_position), 700);

!Wettervorhersage Text Nachts
 string word = "ShortPhrase";
    integer word_laenge = word.Length();
    string word2 = "LongPhrase";
    integer word2_laenge = word2.Length();
    integer word_position = datenN.Find(word);
    string daten = datenN.Substr((word_position + word_laenge + 3), 300);
    integer word2_position = daten.Find(word2);
    daten = daten.Substr(0, (word2_position-3));
    dom.GetObject("Wetter nachts").State(daten);

 !Wettervorhersage Regenwahrscheinlichkeit nachts
    string word = "RainProbability";
    integer word_laenge = word.Length();
    string word2 = "SnowProbability";
    integer word2_laenge = word2.Length();
    integer word_position = datenN.Find(word);
    string daten = datenN.Substr((word_position + word_laenge + 2), 25);
    integer word2_position = daten.Find(word2);
    daten = daten.Substr(0, (word2_position-2));
    dom.GetObject("Wetter Regenwahrscheinlichkeit nachts").State(daten);

!Temperatur zusammenfügen
  var tmax=dom.GetObject("Wetter Max. Temp.").State();
  tmax = tmax.ToString(1) ;
  var tmin=dom.GetObject("Wetter Min. Temp.").State();
  tmin = tmin.ToString(1) ;
  dom.GetObject("Wetter Temp").State((tmax)#" °C bis "#(tmin)#" °C");

!Regenwahrscheinlichkeit zusammenfügen
  var RWtag=dom.GetObject("Wetter Regenwahrscheinlichkeit tagsüber").State();
  RWtag = RWtag.ToString(0) ;
  var RWnacht=dom.GetObject("Wetter Regenwahrscheinlichkeit nachts").State();
  RWnacht = RWnacht.ToString(0) ;
  dom.GetObject("Wetter Regenwahrscheinlichkeit").State(("Tags: ")#(RWtag)#(" %, Nachts: ")#(RWnacht)#" %");

!Wettervorhersage zusammenfügen
dom.GetObject("Wettervorhersage").State ("Gültig ab: "#dom.GetObject("Wetter gültig ab").State()#", Tags: "#dom.GetObject("Wetter tagsüber").State()#", Nachts: "#dom.GetObject("Wetter nachts").State());
Für die Fehlersuche habe ich mir die Systemvariable mit Aufruf dom.GetObject("Wetter Test").State(xxxxxx); erstellt. Die kann ich an jede Stelle einfügen und mit einer Skriptvariablen befüllen und mir so anzeigen lassen, was rauskommt.

Die Darstellung im EasyDisplay:
Screenshot_20190326-090110.png
Raspberrymatic auf Raspberry 3B+ mit externer Antenne, über 100 Geräte HM und HM IP, Homematic-Geräte Internet nur über Whitelist, kein Zugriff von Außen.

Antworten

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