Kleine LUA Scripte Teil 7: Wetterbedingungen prüfen

Geschrieben von boomx

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.

Diesen Blogpost hat geschrieben ...

boomx

37 Kommentare

      • 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.

  • 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,

    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,

          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

  • 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 ?

  • 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ß

  • 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ß

Gib deinen Senf dazu!

Cookie Consent mit Real Cookie Banner