AWEKAS Wetterdaten

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

justusbernold
Beiträge: 23
Registriert: 27.08.2017, 19:38
Danksagung erhalten: 1 Mal

AWEKAS Wetterdaten

Beitrag von justusbernold » 19.03.2019, 14:37

Nach (relativ) langer (erfolgloser) Suche nach freien Wetterdaten habe ich mich entschlossen, anstelle von wunderground die Daten von https://www.awekas.at/ für die Heimautomatisierung zu verwenden. AWEKAS stellt eine Plattform zur Verfügung zu der Besitzer von Wetterstationen ihre Daten hochladen können und die dann diese Wetterdaten in einfacher Form präsentiert.
Für AWEKAS habe ich mich entschieden, da dort a) die Daten einer lokalen Wetterstation b) eine einfache Prognose online verfügbar sind.
Meine Nachfrage direkt bei AWEKAS betreffend einer API für die Wetterdaten einer bestimmten Station wurde leider negativ beantwortet. D.h. ein entsprechender Service existiert zur Zeit nicht.
Daher habe ich nun 2 Scripts geschrieben, die mir einerseits die aktuellen Daten und andererseits die Forecast-Daten einer bestimmten Wetterstation via Webauftritt herunterladen, parsen und die Daten in Systemvariablen speichern.

Code: Alles auswählen

!---- AWEKAS forcast Daten holen ----------------------------------------------------------------------------------------------------
! Skript liest forcast Wetterdaten des AWEKAS Wetterdienstes und speichert diese in lokalen Variablen ab
! - Prognosedaten für Temperatur, Niederschlag, Wolkendecke, Windgeschwindigkeit, Windspitzen
!--------------------------------------------------------------------------------------------------------------------------
!
! variable Daten
var Station = "5826";                     ! Stationsnummer im AWEKAS

! -------------------------------------------------------------------------------------------------------------------------
! fixe Daten und Variablennamen
var address = "https://stationsweb.awekas.at/";
var CUxD_Device = "CUxD.CUX2801001:1";
var stdout;                          ! Zwischenspeicher für Rohdaten
string text1;                       
var pos_text1;
var pos_text2;
var pos_text3;
var i;
string text2;  
string text3;               
string text4;
string linie;

real Cover;                        ! Cloudcover
real Temp;
real Baro;
real Wind;
real Gust;
real Rain;

string singlecover;            ! variable to store all 6 values of cover
string singletemp;             ! variable to store all 12 values of temp
string singlebaro;
string singlewind;
string singlegust;
string singlerain;

string variable_cover ="Cover_";
string zeiten_cover ="12;24;36;48;60;72";        ! hours from now for the forecast values of cover
string variable_wind ="Wind_";
string variable_gust ="Gust_";
string variable_baro ="Baro_";
string variable_rain ="Rain_";
string variable_temp ="Temp_";
string zeiten = "6;12;18;24;30;36;42;48;54;60;66;72";   ! hours from now for the forecast data of all the rest
string singlezeit;

string url_forcast_values = address + "forecast.php?id=" + Station + "&lng=de";

!-------------------------------------------------------------------------------------------------------------------------
! hole die Rohdaten
dom.GetObject(CUxD_Device + ".CMD_SETS").State("wget -q -O - " + url_forcast_values);
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
!WriteLine(stdout);

!---- Cloudcover
text1 = "src=\"images/fc_cloudcover.png\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
text3 = stdout.Substr(pos_text1, 400);                                                                     ! finde den Abschnitt mit den Forecast Werten für cloudcover
text3 = text3.Substr( text3.Find("\n")+1,  text3.Find("/tr") - text3.Find("\n")+1 );    ! trimme auf den Bereich zwischen dem ersten Zeilenumbruch und dem "/tr"

!WriteLine(text3);
Cover = "";
foreach(linie, text3.Split("\n")) {
  text2 = linie.StrValueByIndex("data2", 1);                                              ! holt den Teilstring raus, der nach "data2" steht (ata2" 13% /td )
  Cover = Cover + ";" +  text2.Substr(6, text2.Find("/td")-8);                   ! schneidet zwischen "ata2" und vor dem "%"-Zeichen
  !WriteLine(Cover);
}

Cover = Cover.Substr(1, Cover.Length()-2);                                              ! Trennt das führende ";" und das abschliessende ";" ab
WriteLine("Cover: " + Cover);


!------------- Temperature Forecast Data
text1 = "var data";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);  
Temp = text3.Substr( text3.Find("[") + 1,  text3.Find("]") -  text3.Find("[") +1 );
WriteLine("Temp: " + Temp);

!------------ Barometer Forecast Data
text1 = "var barodata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);  
Baro = text3.Substr( text3.Find("[") + 1,  text3.Find("]") -  text3.Find("[") +1 );
WriteLine("Baro: " + Baro);

!------------ Wind Forecast Data
text1 = "var winddata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);  
Wind = text3.Substr( text3.Find("[") + 1,  text3.Find("]") -  text3.Find("[") +1 );
WriteLine("Wind: " + Wind);

!------------ Gust Forecast Data
text1 = "var gustdata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);  
Gust = text3.Substr( text3.Find("[") + 1,  text3.Find("]") -  text3.Find("[") +1 );
WriteLine("Gust: " + Gust);

!------------ Rain Forecast Data
text1 = "var raindata";
pos_text1 = stdout.Find(text1) + text1.Length();
text3 = stdout.Substr(pos_text1, 100);  
Rain = text3.Substr( text3.Find("[") + 1,  text3.Find("]") -  text3.Find("[") +1 );
WriteLine("Rain: " + Rain);

!----------- Variablen befüllen
i=0;                                                                       !----- Variablen mit 6 Werten befüllen, Abstand 12h
foreach(singlecover, Cover.Split(";")) {
  variable_cover = "Cover_" + zeiten_cover.StrValueByIndex(";", i);
  dom.GetObject(variable_cover).Variable(singlecover.ToInteger());
  i = i+1;
}

i=0;
foreach(singlezeit, zeiten.Split(";")) {                ! ---- Variablen befüllen, die 12 Forecast Werte im Abstand von 6h haben
  variable_wind = "Wind_" + singlezeit.ToInteger();
  variable_gust ="Gust_" + singlezeit.ToInteger();
  variable_baro ="Baro_" + singlezeit.ToInteger();
  variable_rain ="Rain_" + singlezeit.ToInteger();
  variable_temp ="Temp_" + singlezeit.ToInteger();
  dom.GetObject(variable_wind).Variable(Wind.StrValueByIndex(",",i));
  dom.GetObject(variable_gust).Variable(Gust.StrValueByIndex(",",i));
  dom.GetObject(variable_baro).Variable(Baro.StrValueByIndex(",",i));
  dom.GetObject(variable_rain).Variable(Rain.StrValueByIndex(",",i));
  dom.GetObject(variable_temp).Variable(Temp.StrValueByIndex(",",i));

  i = i+1;
}
Die für die Speicherung der Daten nötigen Systemvariablen sind wie folgt aufgebaut:
Wind_6, Wind_12, Wind_18, etc. für die Vorhersagewerte in 6, 12 und 18 Stunden (das geht bis 72h)
Gust_6, Baro_6, Rain_6, Temp_6 für die verschiedenen Vorhersagekategorien
Die Variablen für CloudCover haben nur 6 Vorhersagewerte im Abstand von 12h. Daher heissen die Variablen: Cover_12, Cover_24, ....., Cover_72.
systemvariablen.PNG
systemvariablen.PNG (12.42 KiB) 4432 mal betrachtet
Das Script für die aktuellen Werte sieht wie folgt aus. Hier fehlt noch die Übergabe an die Systemvariablen.

Code: Alles auswählen

!---- AWEKAS aktuelle Daten holen ----------------------------------------------------------------------------------------------------
! Skript liest Wetterdaten des AWEKAS Wetterdienstes und speichert diese in lokalen Variablen ab
! - aktuelle Wetterdaten: Temperatur, Feuchtigkeit, Luftdruck, Windgeschwindigkeit, Windspitzen, Regenrate, Niederschlagsmenge seit Mitternacht, Sonneneinstrahlung
! - Prognosedaten für Temperatur, Niederschlag, Wolkendecke, Windgeschwindigkeit, Windspitzen
!--------------------------------------------------------------------------------------------------------------------------
!
! variable Daten
var Station = "5826";                     ! Stationsnummer im AWEKAS

! -------------------------------------------------------------------------------------------------------------------------
! fixe Daten und Variablennamen
var address = "https://stationsweb.awekas.at/";
var CUxD_Device = "CUxD.CUX2801001:1";
var stdout;                          ! Zwischenspeicher für Rohdaten
string text1;                       
var pos_text1;
string text2;                 

real Temp_act;                  ! aktuelle Temperatur
real Humid_act;                ! aktuelle Feuchtigkeit
real Press_act;                  ! aktueller Luftdruck
real Wind_act;                   ! aktuelle Windgewschwindigkeit
real Gust_act;                    ! aktuelle Böengeschwindigkeit
real Rainrate_act;            ! aktuelle Regenrate
real Rain_act;                   ! Niederschlag seit Mitternacht
real Sunrad_act;              ! aktuelle Sonneneinstrahlung

string url_act_values = address + "index.php?id=" + Station;

!-------------------------------------------------------------------------------------------------------------------------
! hole die Rohdaten
dom.GetObject(CUxD_Device + ".CMD_SETS").State("wget -q -O - " + url_act_values);
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
!WriteLine(stdout);

!--- Temperatur
text1 = "id=\"temp_akt\"";                                                                             
pos_text1 = stdout.Find(text1); ! + text1.Length();                                        ! finde die Position mit der aktuellen Temperatur
Temp_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1);      ! schneide dort einen String mit der Lànge 15 raus, unterteile diesen String an den Leerstellen und nimm den ersten Teilstring davon

!--- Feuchtigkeit
text1 = "id=\"feuchte_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Humid_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); 

!--- Luftdruck
text1 = "id=\"luftdruck_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Press_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); 

!--- Windgeschwindigkeit
text1 = "id=\"wind_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Wind_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); 

!--- Windböen
text1 = "id=\"boen_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Gust_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); 

!--- Regenrate
text1 = "id=\"rate_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Rainrate_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); 

!--- Niederschlag seit Mitternacht
text1 = "id=\"regen_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Rain_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); 

!--- Sonneneinstrahlung
text1 = "id=\"solar_akt\"";
pos_text1 = stdout.Find(text1); ! + text1.Length();
Sunrad_act = stdout.Substr(pos_text1+13,15).StrValueByIndex(" ",1); 

!---Fehlerkontrolle
WriteLine("Temperatur aktuell:" + Temp_act);
WriteLine("Feuchtigkeit aktuell:" + Humid_act);
WriteLine("Luftdruck aktuell:" + Press_act);
WriteLine("Windgeschwindigkeit aktuell:" + Wind_act);
WriteLine("Böenspitzen aktuell:" + Gust_act);
WriteLine("Regenrate aktuell:" + Rainrate_act);
WriteLine("Regen seit Mitternacht:" + Rain_act);
WriteLine("Sonneneinstrahlung aktuell:" + Sunrad_act);
!-------------------------------------------------------------------------------------------------------------------------
Falls jemand noch Code-Beautifying machen kann oder Fehler sieht, bin ich natürlich um jede Rückmeldung froh.

Viele Grüsse
Justus
--------------------------------------------
253 Kanäle in 83 Geräten und 33 CUxD-Kanäle in 3 CUxD-Geräten:
1x HM-LC-Sw4-DR, 8x HM-CC-RT-DN, 13x HM-Sec-SC-2, 2x HM-Sec-SD-2, 4x HM-LC-Sw2-FM, 5x HM-LC-Bl1-FM, 1x HM-Dis-EP-WM55, 21x HM-Sec-SCo, 1x HM-PB-6-WM55, 1x HmIP-SMI55, 1x HM-Sen-MDIR-WM55, 3x HM-ES-PMSw1-Pl-DN-R5, 1x HM-WDS30-T-O, 1x HM-Sen-LI-O, 1x HM-OU-CFM-TW, 2x CUX28, 1x HM-RC-8, 2x HM-Sec-SD-2-Team, 1x HmIP-RCV-50, 1x CUX91, 1x HM-LC-Sw1-FM, 2x HM-SCI-3-FM, 1x HM-LC-Sw4-DR-2, 1x HM-Sec-MDIR-2, 1x HM-SwI-3-FM, 1x HM-Sen-RD-O, 1x HM-WDS30-OT2-SM, 1x HM-OU-LED16, 1x HM-WDS10-TH-O, 1x VIR-HUE-GTW, 1x VIR-LG-DIM, 1x HM-PB-2-WM55-2, 1x HM-ES-TX-WM, 1x HM-Sen-Wa-Od
--------------------------------------------

Spectrum1981
Beiträge: 10
Registriert: 09.06.2016, 14:18

Re: AWEKAS Wetterdaten

Beitrag von Spectrum1981 » 09.05.2019, 13:45

Hi Justus,

vielen Dank schon mal für die Arbeit. Hast du eine Abschätzung wann das Script für die aktuellen Daten fertig wird, so dass auch die Systemvariablen befüllt werden? Das könnte ich nämlich sehr gut brauchen :mrgreen:

deltaac
Beiträge: 110
Registriert: 27.08.2019, 08:43
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 88 Mal
Danksagung erhalten: 16 Mal

Re: AWEKAS Wetterdaten

Beitrag von deltaac » 30.03.2020, 14:54

Hi,

hast du nochmal an deinem Script gearbeitet oder ist es immer noch einsatzbereit?

Aquarius
Beiträge: 7
Registriert: 29.09.2018, 12:39
System: Alternative CCU (auf Basis OCCU)

Re: AWEKAS Wetterdaten

Beitrag von Aquarius » 24.09.2020, 22:14

Hallo liebe Leser,
dieser Thread ist ja schon etwas älter, aber dennoch möchte ich ein kleines Update liefern. Mittlerweile stellt Awekas für alle Wetterstationsbesitzer, die die Daten ihrer Wetterstation für Awekas zur Verfügung stellen (d.h. hochladen) auch eine leistungsfähige API bereit, die eine Abfrage der eigenen Daten und noch einiges mehr ermöglicht https://www.awekas.at/for2/index.php?t ... ung-beta/ . Diese API ermöglicht das Abrufen von Daten, die im Format "json" geliefert werden. Eine Abfrage via Homematic Script und die Übernahme in Systemvariable ist recht einfach möglich. Bei Interesse kann ich gern ein geeignetes Script hier einstellen.

subway-driver
Beiträge: 1
Registriert: 09.12.2009, 14:40
System: CCU
Wohnort: Frankfurt am Main

Re: AWEKAS Wetterdaten

Beitrag von subway-driver » 26.09.2020, 12:34

Hi Justus,

vielen Dank für Deine Infos dazu. Verfolge das schon länger - und melde doch direkt mal Interesse für Dein Script an. 8)

Viele Grüße

Aquarius
Beiträge: 7
Registriert: 29.09.2018, 12:39
System: Alternative CCU (auf Basis OCCU)

Re: AWEKAS Wetterdaten

Beitrag von Aquarius » 29.09.2020, 14:43

Hallo subway-driver,

meintest du das initiale Script von Justus oder bist du an dem Angebot von mir interessiert ?

Beste Grüße

klaugrub
Beiträge: 34
Registriert: 19.05.2016, 09:52

Re: AWEKAS Wetterdaten

Beitrag von klaugrub » 09.08.2022, 13:56

Hallo,

ich bin an deinem script interessiert, da ich gerade eine station in betrieb nahm.
Viele Grüße, Klaus

2x Raspberry Pi, 2x CCU- Historian, 8 Rolläden, 15xThermostat-Steuerungen, 10×Licht, 12x Stromaktoren, Wetterstation Davis Vintage Pro plus
https://stationsweb.awekas.at/index.php?id=24269

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

Re: AWEKAS Wetterdaten

Beitrag von MichaelN » 09.08.2022, 21:55

Falls Du keine andere Lösung findest kannst Du auch mein universelles JSON Skript testen. Siehe Signatur.
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 +++

klaugrub
Beiträge: 34
Registriert: 19.05.2016, 09:52

Re: AWEKAS Wetterdaten

Beitrag von klaugrub » 10.08.2022, 10:58

Hallo Michael,

Leider bin ich damit überfordert. Du hattest doch angeboten bei Interesse ein fertiges Script auf Basis der neuen Awekas-API einzustellen. Hast du das noch vor? Wäre eine super Idee, nicht nur für mich.

Viele Grüße , Klaus
Viele Grüße, Klaus

2x Raspberry Pi, 2x CCU- Historian, 8 Rolläden, 15xThermostat-Steuerungen, 10×Licht, 12x Stromaktoren, Wetterstation Davis Vintage Pro plus
https://stationsweb.awekas.at/index.php?id=24269

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

Re: AWEKAS Wetterdaten

Beitrag von MichaelN » 10.08.2022, 11:05

Nein, sowas hatte ich nie vor
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 +++

Antworten

Zurück zu „Projektvorstellungen“