Ihr wollt bei bestimmten Wetterbedingungen passende Aktionen durchführen? Sollen bei einem aufziehenden Gewitter eure RGBW-Module das „Sturm“-Programm starten? Oder sollen die Lichter bei klarem Himmel gelb leuchten? Dann müsst Ihr euch auf jeden Fall diesen Artikel anschauen.
Jetzt könntet Ihr natürlich behaupten: "Wie, das funktioniert doch bereits!". Ja, das funktioniert auch. Aber wir haben die Möglichkeiten ein wenig erweitert. Wie auf dem nächsten Bild zu erkennen ist, nutzt Fibaro die "Weather Conditions", um die Wetterbedingungen zu vergleichen und daraufhin eine Aktion auszuführen. Die API von yahoo, bzw. yr.to liefert aber so eine Angabe gar nicht zurück. Hier kommt lediglich eine Zahl zurück, welche dann von Fibaro "übersetzt" wird.
Und genau an diesem Punkt setzen wir an und machen es wie Fibaro auch: Wir übersetzen die Zahl in eine Wetterbedingung. Allerdings etwas detallierter. Mit dem Skript habt Ihr die Möglichkeit folgende Wetterbedingungen zu prüfen:
- Regen
- klarer Himmel
- leicht bewölkter Himmel
- bewölkter Himmel
- stark bewölkter Himmel
- Nebel
- Gewitter
- Möglicherweise Schneeregen/Schnee
- Schnee
- Hagel
- Überfrierende Nässe
- Sturm
Das unten gepostete Skript ist eine kleine Erweiterung des bereits vorgestellten OpenWeatherVDs, mit dem Ihr eure eigenen Wetterdaten in der Wetteranzeige des Fibaro HomeCenter 2 nutzen könnt. Das Skript kann aber auch ohne das virtuelle Devices genutzt werden.
Die Szene wird durch die Änderung des ConditionCode ausgeführt. Solltet Ihr das VD so wie im Artikel beschrieben, eingerichtet haben, dann wird die Szene alle 10 Minuten ausgeführt. Damit aber zum Beispiel eine eingerichtete Push-Mitteilung, welche bei einem bestimmten Wetter verschickt werden soll, nicht alle 10 Minuten versendet wird, prüft das Skript, welche Wetterbedingung vor dem neuen Wert gesetzt war. Sollte sich dieser nicht verändert haben, dann passiert nichts.
Und hier nun der "fertige" Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
--[[ %% properties 3 ConditionCode %% globals --]] local weather_code = fibaro:getValue(3, 'ConditionCode') local previous_weather_code = fibaro:getValue(3, 'PreviousConditionCode') if (weather_code == previous_weather_code) then --fibaro:debug('weather_code hat sich nicht geändert.') else fibaro:debug('Wettervorhersage v0.01 gestartet.') fibaro:debug('ConditionCode: ' ..weather_code.. ' / Prüfe Wetterbedingung') if (weather_code == '6' or weather_code == '9' or weather_code == '11' or weather_code == '12' or weather_code == '40') then fibaro:debug('Wettervorhersage: Regen') elseif (weather_code == '31' or weather_code == '32' or weather_code == '33' or weather_code == '34') then fibaro:debug('Wettervorhersage: klar') elseif (weather_code == '17' or weather_code == '29' or weather_code == '30' or weather_code == '44') then fibaro:debug('Wettervorhersage: leicht bewölkt') elseif (weather_code == '26' or weather_code == '35') then fibaro:debug('Wettervorhersage: bewölkt') elseif (weather_code == '27' or weather_code == '28') then fibaro:debug('Wettervorhersage: stark bewölkt') elseif (weather_code == '19' or weather_code == '20' or weather_code == '21' or weather_code == '22') then fibaro:debug('Wettervorhersage: Nebel') elseif (weather_code == '3' or weather_code == '4' or weather_code == '37' or weather_code == '38' or weather_code == '39' or weather_code == '45' or weather_code == '46') then fibaro:debug('ACHTUNG: Gewitter') elseif (weather_code == '5' or weather_code == '7' or weather_code == '14' or weather_code == '19' or weather_code == '42' or weather_code == '46') then fibaro:debug('Wettervorhersage: Möglicherweise Schnee/Schneeregen') elseif (weather_code == '13' or weather_code == '15' or weather_code == '16' or weather_code == '41' or weather_code == '42' or weather_code == '43') then fibaro:debug('Wettervorhersage: Schnee') elseif (weather_code == '17' or weather_code == '35') then fibaro:debug('ACHTUNG: Hagel') elseif (weather_code == '8' or weather_code == '10') then fibaro:debug('Wettervorhersage: Überfrierende Nässe') elseif (weather_code == '0' or weather_code == '1' or weather_code == '2' or weather_code == '23' or weather_code == '23') then fibaro:debug('Wettervorhersage: Stürmisch') elseif (weather_code == '25') then fibaro:debug('Wettervorhersage: Kalt (Was immer das heißt...)') elseif (weather_code == '36') then fibaro:debug('Wettervorhersage: Heiß (Was immer das heißt...)') else fibaro:debug('Code 3200. Nicht bekannt.') end end |
In dem Code erkennt Ihr an den Debug-Ausgaben, welche Wetterbedingung vorherrscht. Hier könnt Ihr dann einzelne oder mehrere Aktionen hinzufügen.
Kurze Info am Ende: Leider können wir das Skript nicht mehr der Firmware 4.081 und der damit verbundenen Änderung auf den neuen Wetterdienst yr.to. Vielleicht könnte ein User dies für uns übernehmen und das Ergebnis in den Kommentaren hinterlassen. Vielen Dank für eure Hilfe und nun viel Spaß mit der kleinen Szene.
Das ist ne Super Scene, aber muss ich da nicht die ID (3) ändern? Oder für was steht diese ID?
Hi,
nein, musst du nicht. Das ist sozusagen die ID für das Wetter in der API. :) Sonst hätte ich das schon erwähnt ;)
Gruß
ok hab ich Probiert. Der vohergehende Wert ändert sich aber nicht. Damit funktioniert der abgleich nicht. und bekomm aller 10 minuten eine Meldung .Hab 4.080 Ich würde dies einfach über eine Variable Lösen.
Hast du auch das OpenWeatherVD im Einsatz? Sonst sollte es erst mit 4.082 wieder gehen...
Ja hab das VD. Funktioniert super. Hab jetzt eine Variable gemacht wo der Wert Zwischengespeichert wird. ?
Ok :)
Sollte aber eigentlich auch ohne gehen. Sofern sich die Wetterbedingung nicht verändert, wird im Skript nichts debuggt. Vielleicht liegt es daran ;)
Gruß
Die Scene finde ich sehr gut, wie alles was ihr hier macht. Allerdings habe ich die Scene 1:1 in die HC2 FW 4.080 reinkopiert und die Debug Meldungen kommen alle 10Min obwol das Wetter z.Zt. immer gleich bleibt auf Regen. Seltsam.
Hi,
Danke für das Lob :)
Es gibt für Regen (z.B. Schauer, Regen, Starkregen, usw.) mehrere ConditionCodes. Wahrscheinlich ändern die sich, wodurch dann wieder eine Meldung ausgelöst wird. Du kannst mal in der ersten if-Schleife die kommentierte Zeile auskommentieren. Dort wird dann auch etwas debuggt, wenn die ConditionCodes gleich sind.
Bisher ist mir sowas nicht aufgefallen, da ich keine Aktionen mit dem Skript verknüpft habe. Müsste mir mal den Denug anschauen und das Skript möglicherweise um eine globale Variable erweitern. Werd ich mal machen und das Skript dann updaten. :) Danke für den Hinweis.
Gruß
Super umsetztung wie immer.
Bei mir hört es leider nur nach dem letzten debug auf
: [DEBUG] 23:35:13: Wettervorhersage v0.01 gestartet.
[DEBUG] 23:35:13: ConditionCode: 3200 / Prüfe Wetterbedingung
[DEBUG] 23:35:13: Code 3200. Nicht bekannt.
was hab ich falsch gemacht???
Danke Leute
Hi,
hast nichts falsch gemacht. Das kann ab und zu mal passieren und hängt mit den übersetzten ConditionCodes von OpenWeather und yahoo (meistens in der Nacht) zusammen. Kommt bei mir auch ab und an.
Gruß
Alles klar ! Vielen Dank wie immer für hilfe und Scene!
Hi,
Danke für das super script, zu welchem ich eine Frage habe
der Wert von previous_weather_code ist bei mir immer 29, wo wird die Variable mit dem letzten gelesen Wert von weather_code befüllt ?
Danke und lg
Gerhard
Hi,
der Wert wird mit dem OpenWeatherVD gesetzt. Solltest du auf Version 4.082 sein, sollte der Wert automatisch gesetzt werden. Damit hab ich aber leider bisher keine Erfahrung gemacht.
Gruß
Hi,
ich habe die VD neu eingespielt und es ändert sich leider nichts, der Wert von previous_weather_code ist immer "29". Ich bin auf der 4.080
Danke und lg
Hi,
was gibt denn der Debug vom OpenWeatherVD aus?
Gruß
Hi,
VD:
[DEBUG] 16:47:27: Verbindung zur API wird aufgebaut...
[DEBUG] 16:47:27: Wetterdaten für Scharndorf, AT abgefragt.
[DEBUG] 16:47:27: Wetter: clear sky
[DEBUG] 16:47:27: ConditionCode: 32
[DEBUG] 16:47:27: netatmo-Integration aktiv
[DEBUG] 16:47:27: Temperatur: 25.2 °
[DEBUG] 16:47:27: netatmo-Integration aktiv
[DEBUG] 16:47:27: Luftfeuchtigkeit: 100 %
[DEBUG] 16:47:27: Luftdruck: 1018 hPa
[DEBUG] 16:47:27: Variable für Wind gesetzt
[DEBUG] 16:47:27: Windstärke: km/h
[DEBUG] 16:47:27: Windrichtung: E
[DEBUG] 16:47:27: Wetterdaten in der API aktualisiert.
Info aus Szene:
[DEBUG] 16:52:21: Wettervorhersage v0.01 gestartet.
[DEBUG] 16:52:21: ConditionCode: 32 / Prüfe Wetterbedingung
[DEBUG] 16:52:21: PreviousConditionCode: 29 / --> von mir eingefügt
[DEBUG] 16:52:21: Wettervorhersage: klar
lg
Hi,
sieht die Zeile 98 bei dir so aus:
r,s,e = VD:PUT("/api/devices", '{ "id": 3, "properties": {"Temperature": ' .. tempmin .. ', "Humidity": ' .. hum .. ', "ConditionCode": ' .. weather_ .. ', "PreviousConditionCode": ' .. fibaro:getValue(3, 'ConditionCode') .. ', "Wind": ' .. wind_speed .. '}}');
Lass die Szene mal ein paar Stunden laufen. Der ConditionCode ändert sich ja nicht alle 10 min ;)
Gruß
Hi, da ich nicht auf Deinen letzten Post antworten kann.....
Die Zeile war unterschiedlich, der "previous" Eintrag hat gefehlt. Habe ihn jetzt eingefügt, zumindest ein anderer Wert wird schon angezeigt.
Danke Dir
lg
Hi,
das erklärt natürlich einiges ;) Schön, dass es jetzt funktioniert...
Gruß
Hallo Daniel,
vielen Dank für das Skript. Wenn ich das richtig verstanden habe, funktioniert unter der FW 4.70 (HC2) die Funktion "WeatherConditionConverted" nicht mehr? Ich habe daraufhin das VD von euch konfiguriert und im Einsatz, dieses funktioniert auch ohne Probleme und fast zuverlässig.
Jetzt habe ich eine Szene im Einsatz (Wind und Regenwarnung wenn Fenster offen) welche sich der Funktion "WeatherConditionConverted“ bedient. Wie kann ich diese Szenen auf die neue oben gepostete Funktion umstellen?
LG und Danke
Hi,
du kannst eine Szene über die Szene hier starten. Kannst dafür fibaro:startScene() nutzen. Also immer wenn Regen erkannt wird, dann kann die andere Szene prüfen, ob noch Fenster offen sind zum Beispiel.
Gruß
Hallo. Reicht die Szene zur Aktualisierung der Daten aus ? Werden die Wetterbedingungen dann auch im HC2 übernommen und angezeigt oder braucht es dafür das VD ? Gruß
Hi,
es kommt drauf an, welche Version du einsetzt. Ab 4.082 sollte es eigentlich ohne VD funktionieren. (Kann ich aber leider nicht testen)
Bei allen anderen Versionen benötigst du das VD.
Gruß
Ah,Ok. Habe noch die 4.070 - und werde die auch erstmal besser behalten. Dank deines VD und Script läuft es ja super. Vielen Dank.
Hast du schon eine Idee das nicht alle 10 Minuten gepusht wird wenn sich das Wetter leicht ändert ? Also von Regen in mäßiger Regen oder so ? Bei mir wird dann jedesmal die Szene/Push ausgelöst. Gruß
Hi,
da könntest du höchstens eine globale Variable setzen, die abgefragt wird, ob bereits eine Push verschickt wurde. Eine andere Möglichkeit sehe ich da nicht.
Gruß
Ok.Schade.Mit den Variablen habe ich auch überlegt.
Was bedeutet in dem Script : if (weather_code == '6' or weather_code == '9' or weather_code == ...
Also das code " 6" or code" 9" ? Wenn ich fragen darf ?
Hi,
schau mal hier: https://gist.github.com/bzerangue/805520
Das ist die Liste der yahooweather-codes.
Gruß
Hallo Boomx,
vorab erst einmal vielen Dank für das Skript und auch die vielen anderen guten Skripte.
Ich habe eine Frage zu diesem Skript und der Verwendung von dem Skript der Regenwarnung. Ich verwende die Firmware 4.70 sowie das Wetter VD um die Wetterbedingungen an die Fibaro weitergeben zu können. Das Wetter VD wird mit meiner Netatmo gefüttert. Nun wollte ich mein Skript der Regenwarnung wieder zum Laufen bekommen mit dem Skript zur Prüfung der Wetterbedingungen. Das Skript funktioniert auch ohne Probleme, d.h. die Wetterbedingungen werden korrekt angezeigt.
Leider wird das Skript der Regenwarnung nicht getriggert sobald die Wetterbedingung „regen“ vorhersagt. Muss ich an dem Skript der Regenwarnung noch etwas anpassen? P.s. Ich habe das originalskript genommen.
Vielen Dank für die Hilfe.
Hi,
leider weiß ich grad nicht, welches Skript zur Regenwarnung du meinst. Mir ist keins bekannt, welches ich geschrieben habe ;) Bei mir war es Sturm. :)
Gruß
Hallo Daniel,
Du hattest mir das Skript Sturmwarnung mal umgestellt auf folgendes für Regenwarnung.
Problem ist, das dieses Skript aktuell nicht angestößen wird wenn die Wetterbedingung "regen" anzeigt.
Liegt das an der Prüfung von "3 WeatherConditionConverted"?
--[[
%% properties
3 WeatherConditionConverted
%% globals
--]]
local phoneID = {fibaro:getGlobal("var_mareen_handy"), fibaro:getGlobal("var_daniel_handy")} -- Handy-IDs
local maxID = 1000
Debug = function ( color, message )
fibaro:debug(string.format('%s', "span", color, message, "span"))
end
local startSource = fibaro:getSourceTrigger();
if (fibaro:getValue(3, "WeatherConditionConverted") == "rain" or startSource['type'] == 'other') then
if (startSource['type'] == 'other') then
Debug('white', "SZENE MANUELL GESTARTET")
else
Debug('green', "SZENE DURCH REGEN-VORHERSAGE GESTARTET")
end
Debug('red', "ACHTUNG! Es könnte regnen")
Debug('white', "Prüfe offene Fenster")
for id = 1, maxID do
local deviceType = fibaro:getType(id)
if (deviceType == 'com.fibaro.windowSensor' or deviceType == 'com.fibaro.doorSensor') then
if (tonumber(fibaro:getValue(id, 'value')) == 1) then
local name = fibaro:getName(id)
local room = fibaro:getRoomNameByDeviceID(id)
Debug('red', "ACHTUNG! Regen vorhergesagt. " ..name.. " im Raum " ..room.. " ist offen!")
for k=1, maxID do
if phoneID[k] ~= nil then
fibaro:call(phoneID[k], 'sendPush', 'ACHTUNG: Regen vorhergesagt! ' ..name.. ' im Raum ' ..room.. ' ist offen!')
end
end
end
end
end
end
Hi,
woher weißt du, dass die Wetterbedingung auf "rain" steht? Hast du in der API nachgeschaut? Ändert sich die weatherconditionconverted überhaupt? Bau doch die Fensterprüfung in das Skript, welches im Artikel gepostet wurde ein... Das sollte dann zuverlässig funktionieren.
Gruß
Hallo,
werden die code Nummern 1-47 in der HC2 irgendwo hinterlegt, so dass ich mit diesen Nummern weiter arbeiten kann? oder stehen die Nummern nur in diesem Script zu verfügung und ich muss die weiteren ectionen immer aus diesem Script ausführen?
Besten Dank
Gruß
Hi,
die Werte sind in der Weather-API vom HC2 hinterlegt und können über die WeatherCondition global abgefragt werden.
Gruß
Wie kann ich eine benötigte Szene z.b. Sturmwarnung triggern, mach ich das über den header?
z.b.
--[[
%% properties
3 Wind -- hier wird der WeatherCondition (1-47) hinterlegt laut API?
%% globals
--]]
oder kurz gefragt, wie bekomme ich mit den WeatherCondition das Skript http://siio.de/connected-home/kleine-lua-scripte-teil-2-sturm-check/ gestartet?
Besten Dank und LG
Hi,
das im Header ist nur der Trigger. Du kannst die Szene einfach wie diese starten. Also den Trigger einfach auf das andere Skript übertragen.
Gruß
Hallo, was ist eigentlich der Unterschied von global und lokalen Variablen innerhalb eines LUA Skriptes? und vor allem warum und in welchen Fällen entscheide ich mich für welchen Variablen-Typ?
Danke schon mal für die Antworten :-)
Hi,
lokale Variablen werden in dem Skript (local var = 1) definiert und sind nur in diesem Skript nutzbar. Deshalb auch lokale Variable.
Globale Variablen sind in dem Variablen-Panel des HCs gespeichert und so auch außerhalb des Skriptes durch andere Skripte nutzbar.
Gruß