37

Kleine LUA Scripte Teil 7: Wetterbedingungen prüfen

by boomx11. Juni 2016

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.

weatherconditions_past

Prüfbare Wetterbedingungen bisher

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.

debug_wetter

Debug-Fenster der Szene

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:

In dem Code erkennt Ihr an den Debug-Ausgaben, welche Wetterbedingung vorherrscht. Hier könnt Ihr dann einzelne oder mehrere Aktionen hinzufügen.

openweather_vd_icon_10_szene

Icon für die Szene

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.

About The Author
boomx
boomx
Moin, ich bin Daniel, Anwendungsentwickler von Beruf. Hier auf siio unterstütze ich die Kollegen bei der Programmierung mit LUA, bzw. bei der Integration von neuen Netzwerkgeräten und schreibe Tutorials rund um das HomeCenter 2 von Fibaro, welches ich auch privat im Einsatz habe.
37 Comments
  • Bastldd
    11. Juni 2016 at 15:25

    Das ist ne Super Scene, aber muss ich da nicht die ID (3) ändern? Oder für was steht diese ID?

    • boomx
      11. Juni 2016 at 15:43

      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ß

      • Bastldd
        11. Juni 2016 at 16:04

        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.

        • boomx
          11. Juni 2016 at 17:52

          Hast du auch das OpenWeatherVD im Einsatz? Sonst sollte es erst mit 4.082 wieder gehen…

          • Bastldd
            11. Juni 2016 at 19:07

            Ja hab das VD. Funktioniert super. Hab jetzt eine Variable gemacht wo der Wert Zwischengespeichert wird. ?

          • boomx
            11. Juni 2016 at 19:19

            Ok :)

            Sollte aber eigentlich auch ohne gehen. Sofern sich die Wetterbedingung nicht verändert, wird im Skript nichts debuggt. Vielleicht liegt es daran ;)

            Gruß

  • Trixxon
    12. Juni 2016 at 8:58

    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.

    • boomx
      12. Juni 2016 at 10:40

      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ß

  • Basti
    Basti
    13. Juni 2016 at 23:35

    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

    • boomx
      13. Juni 2016 at 23:38

      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ß

  • Gp2312
    16. Juni 2016 at 8:00

    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

  • boomx
    16. Juni 2016 at 9:13

    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ß

    • Gp2312
      18. Juni 2016 at 14:21

      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

      • boomx
        18. Juni 2016 at 14:29

        Hi,

        was gibt denn der Debug vom OpenWeatherVD aus?

        Gruß

        • Gp2312
          18. Juni 2016 at 16:53

          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

          • boomx
            18. Juni 2016 at 20:32

            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ß

          • Gp2312
            19. Juni 2016 at 17:11

            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

          • boomx
            19. Juni 2016 at 17:21

            Hi,

            das erklärt natürlich einiges ;) Schön, dass es jetzt funktioniert…

            Gruß

  • thebrain
    16. Juni 2016 at 19:24

    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

    • boomx
      16. Juni 2016 at 21:57

      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ß

  • campos
    17. Juni 2016 at 11:32

    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ß

    • boomx
      17. Juni 2016 at 11:55

      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ß

  • campos
    17. Juni 2016 at 13:10

    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ß

    • boomx
      17. Juni 2016 at 14:37

      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ß

  • campos
    17. Juni 2016 at 21:51

    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 ?

  • thebrain
    9. August 2016 at 20:44

    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.

    • boomx
      9. August 2016 at 21:11

      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ß

      • thebrain
        23. August 2016 at 14:39

        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

        • boomx
          24. August 2016 at 8:15

          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ß

  • thebrain
    28. September 2016 at 16:25

    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ß

  • Cannon_82
    Cannon_82
    16. Januar 2017 at 17:07

    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 :-)

    • boomx
      16. Januar 2017 at 18:46

      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ß

Leave a Response