Ich habe mich daran gemacht die Virtuelle Wetterstation von Andreas auf die neuere OpenWeather One Call API 3.0 umzuschreiben, und dabei ein paar änderung vorgenommen.
- Der Ort wurde durch Längen und Breitengrad ersetzt.
- Ich habe mich auf Wetterdaten konzentriert für welche es auf dem dSS keine Vorlage gibt.
Init-Message (Details dazu hier):
{
'message': 'init',
'protocol': 'simple',
'group': 8, /* Joker */
'name': 'OpenWeatherMap.org_One_Call_API_3', /* initialer Name */
/* Definition der Wetter-Sensoren */
'sensors': [
/* S0 */ { 'sensortype': 1, 'usage': 0, 'group': 0, 'hardwarename': 'feels_like', 'resolution': 0.01, 'updateinterval': 120 },
/* S1 */ { 'sensortype': 1, 'usage': 0, 'group': 0, 'hardwarename': 'dew_point', 'resolution': 0.01, 'updateinterval': 120 },
/* S2 */ { 'sensortype': 0, 'usage': 0, 'group': 0, 'hardwarename': 'uv_index', 'resolution': 0, 'updateinterval': 120 },
/* S3 */ { 'sensortype': 0, 'usage': 0, 'group': 0, 'hardwarename': 'clouds', 'resolution': 0, 'updateinterval': 120 },
/* S4 */ { 'sensortype': 29, 'usage': 0, 'group': 0, 'hardwarename': 'visibility', 'resolution': 0, 'updateinterval': 120 },
/* S5 */ { 'sensortype': 0, 'usage': 0, 'group': 0, 'hardwarename': 'weather_id', 'resolution': 1, 'updateinterval': 120 },
/* S6 */ { 'sensortype': 0, 'usage': 0, 'group': 0, 'hardwarename': 'weather_main', 'resolution': 0.01, 'updateinterval': 120 },
/* S7 */ { 'sensortype': 0, 'usage': 0, 'group': 0, 'hardwarename': 'pop', 'resolution': 0.01, 'updateinterval': 120 },
/* S8 */ { 'sensortype': 0, 'usage': 0, 'group': 0, 'hardwarename': 'moon_phase', 'resolution': 0.01, 'updateinterval': 120 },
/* S9 */ { 'sensortype': 0, 'usage': 0, 'group': 0, 'hardwarename': 'timezone', 'resolution': 0.01, 'updateinterval': 120 }
]
}
Implementation (Details zum Inhalt der gesendeten message() hier). Damit dieses Beispiel funktioniert, müssen der richtige API-Key und der richtige Längen- und Breitengrad im Code eingefügt werden.
function updateweather()
{
try {
var t = geturl(baseurl,30)
}
catch {
return true
}
log (7, "OpenWeatherMap reply = %s", t)
var weather = json(t);
log (6, "OpenWeatherMap weather = %s", weather)
if (isvalid(weather.current.feels_like)) {
message(format("S0=%.1f",weather.current.feels_like))
}
if (isvalid(weather.current.dew_point)) {
message(format("S1=%.1f",weather.current.dew_point))
}
if (isvalid(weather.current.uvi)) {
message(format("S2=%.1f",weather.current.uvi))
}
if (isvalid(weather.current.clouds)) {
message(format("S3=%.1f",weather.current.clouds))
}
if (isvalid(weather.current.visibility)) {
message(format("S4=%.1f",weather.current.visibility))
}
if (elements(weather.current.weather) = 1) {
message(format("S5=%.1f",weather.current.weather[0].id))
}
if (elements(weather.current.weather) = 1) {
message(format("S6=%.1f",weather.current.weather[1].main))
}
if (isvalid(weather.hourly.pop)) {
message(format("S7=%.1f",weather.hourly.pop))
}
if (ifvalid(weather.daily[4].moon_phase)) {
message(format("S8=%.1f",weather.daily[4].moon_phase))
}
if (ifvalid(weather.timezone_offset)) {
message(format("S9=%.1f",weather.timezone_offset))
}
}
// hier muss der OpenWeatherMap API key, Ort und Land eingetragen werden
var openweathertoken = 'API_key'; // API key
var openweatherlatitude = '47.39'; // Breitengengrad
var openweatherlongitude = '8.47'; // Längengrad
var openweatherlanguage = 'de'; // Sprache
var openweatherunits = 'metric'; // Einheitensystem
var baseurl = string('https://api.openweathermap.org/data/3.0/onecall?&exclude=hourly,alerts' + '&lat=' + openweatherlatitude + '&lon=' + openweatherlongitude + '&lang=' + openweatherlanguage + '&units=' + openweatherunits + '&appid=' + openweathertoken)
// Alle 120 Sekunden
on (every(120)) {
// Wetter einlesen
updateweather()
}
return true // es ist ok, dass das Script hier endet
Längen und Breitengrad findet ihr beispielsweise in der URL von Google Maps direkt hinter dem @
..google.com/maps/place/plan44.ch+Lukas+Zeller/@47.3945894,8.4719816,17z/data=..
Sobald die Wetterstation funktioniert könnt ihr anfangen den ersten Sensor Evaluator zu bauen. Dafür öffnet ihr im P44 "+Evaluator" und wählt 'sensor value', 'illumination in lux' und 'outdoor'. Ausserdem vergebt ihr einen Namen. Das müsste dann in etwa so aussehen:
Wenn ihr fertig seit geht ihr mit 'Create evaluator' eines weiter. Hat soweit alles geklappt wählt ihr im nächsten Fenster einen Input und tragt die Variable für die Kalkulation ein. Noch speichern und schliessen, das wars.
Habt ihr die selben Werte verwendet wie ich liefert die Wettersation einen Wert über die aktuelle bewölkung an euren dSS. Ja okey ist als Helligkeit definiert, aber undefiniert geht's halt nicht.
Wichtig ist dass ihr nun ab diesem Zeitpunkt damit Arbeiten, und eigene Zustände dafür erstellen könnt. Vorstellbar wäre dass ein Beschattung mittels Scene Responder einfahren müsste wenn:
- UVI ist weniger als 4
- Wetter ID ist zwischen 200-799
- Bewölkung ist über 50%
Bei mir nicht funktioniert hat POP. POP ist die Stündlich berechnette Niederschlagswahrscheinlichkeit. Die Werte des Parameters sollten zwischen 0 und 1 variieren, wobei 0 gleich 0%, 1 gleich 100% ist.