Code: Alles auswählen
! Skript zur Auswertung von Tageshöchsttemperatur und max. Windstärke aus openweathermap.org (5 day / 3 hour forecast)
! Anwendung: Skript zum Sonnenaufgang ausführen um die Systemvariablen Tageshoechsttemperatur und maximaleWindgeschwindigkeit zu setzen
! Programme anlegen:
! - Basierend auf Tageshoechsttemperatur (und Uhrzeit, Lichtmessung, uws.) die Jalousien herunterfahren, um ein Aufheizen des Hauses zu vermeiden
! - Basierend auf maximaleWindgeschwindigkeit das Absenken der Jalousien unterdrücken, um eine Beschädigung bei einem Sturm zu vermeiden
! Voraussetzungen:
! - Systemvariablen Tageshoechsttemperatur und maximaleWindgeschwindigkeit angelegt
! - Kostenlose Registrierung erfolgt: https://home.openweathermap.org/users/sign_up
! - Kostenloser API Key besorgt: https://home.openweathermap.org/api_keys
! - city-ID des Wohnorts aus city.list.json.gz extrahiert: http://bulk.openweathermap.org/sample/
string appIdString='xxxxxxxxxxxxxxxxxxx'; ! OpenWeather API key
string cityIdString='yyyyyyy'; ! OpenWeatherMap city-ID
string weatherUrl='http://api.openweathermap.org/data/2.5/forecast?id='+cityIdString+'&appid='+appIdString;
string fehlermeldungString;
string wetterprognoseString;
system.Exec("wget -q -O - '" # weatherUrl # "'", &wetterprognoseString, &fehlermeldungString);
WriteLine ('wetterprognoseString: '+wetterprognoseString); !DEBUG
if (fehlermeldungString.Length()>0) {
WriteLine ('fehlermeldungString: '+fehlermeldungString); !DEBUG
quit;
}
! Auswertung maximale Temperatur
integer i=1;
string teilString;
string vorWertString='"temp":'; !Vor der Temperaturangeabe kommt "temp":
string wertString;
string nachwertString=","; !Nach der Temperaturangeabe folgt ,
real wertReal=0;
! Wetterprognose kommt in Zeitscheiben von jeweils 3 Stunden => die ersten 8 Zeitscheiben werden ausgewertet
while (i<9)
{
teilString=wetterprognoseString.StrValueByIndex(vorWertString,i);
wertString=teilString.Substr(vorWertString.Length()-1,10).StrValueByIndex(nachwertString,0);
WriteLine ('wertString: '+wertString); !DEBUG
if (wertString.ToFloat()>wertReal) { wertReal=wertString.ToFloat(); }
i=i+1;
}
WriteLine ('wertReal: '+wertReal); !DEBUG
if (wertReal>0) { ! Bei einem fehlerhaften Abruf wird 0 ausgelesen. In diesem Fall soll die Tageshöchsttemperatur vom Vortag beibehalten werden. Der Fehler tritt eher selten auf - keine Ahnung, wie er sich vermeiden lässt.
wertReal=wertReal-273.15; ! Umrechnung Kelvin auf Celsius
dom.GetObject('Tageshoechsttemperatur').Variable(wertReal);
WriteLine('Tageshoechsttemperatur: '+dom.GetObject('Tageshoechsttemperatur').Variable()); !DEBUG
}
! Auswertung maximale Windgeschwindigkeit
integer i=1;
string teilString;
string vorWertString='"speed":'; !Vor der Windgeschwindigkeit kommt "speed":
string wertString;
string nachwertString=","; !Nach der Windgeschwindigkeit folgt ,
real wertReal=0;
! Wetterprognose kommt in Zeitscheiben von jeweils 3 Stunden => die ersten 8 Zeitscheiben werden ausgewertet
while (i<9)
{
teilString=wetterprognoseString.StrValueByIndex(vorWertString,i);
wertString=teilString.Substr(vorWertString.Length()-1,10).StrValueByIndex(nachwertString,0);
WriteLine ('wertString: '+wertString); !DEBUG
if (wertString.ToFloat()>wertReal) { wertReal=wertString.ToFloat(); }
i=i+1;
}
WriteLine ('wertReal: '+wertReal); !DEBUG
if (wertReal>0) { ! Bei einem fehlerhaften Abruf wird 0 ausgelesen. In diesem Fall soll die Windgeschwindigkeit vom Vortag beibehalten werden. Der Fehler tritt bei Tageshöchsttemperatur eher selten auf - ich weiß nicht, ob er auch bei der Windgeschwindigkeit auftritt.
wertReal=wertReal*3.6; ! Umrechnung m/s auf km/h
dom.GetObject('maximaleWindgeschwindigkeit').Variable(wertReal);
WriteLine('maximaleWindgeschwindigkeit: '+dom.GetObject('maximaleWindgeschwindigkeit').Variable()); !DEBUG
}