Kleine LUA Scripte Teil 2: Sturmwarnung

Hiho,

dank der Hilfe und Anregungen auf siio.de wird mein Zuhause Stück für Stück immer smarter.
Kaum gelesen, habe ich mich an der Sturm Szene versucht, leider mit mäßigem Erfolg:

Der Aufruf von http://IP-HC2/api/devices ergab die ID 25:

id": ​25,
"name": "\"LGE LG-D855\"",
"roomID": ​0,
"type": "iOS_device",
"baseType": "",
"enabled": true,
"visible": true,
"isPlugin": false,
"parentId": ​0,
"remoteGatewayId": ​0,
"viewXml": false,
"configXml": false,
"interfaces": [ ],
"properties": 
{

    "DeviceToken": "****",
    "DeviceUID": "****",
    "Push": "true",
    "deviceIcon": "0",
    "saveLogs": "1"

},
"actions": 
{

    "sendDefinedPushNotification": ​1,
    "sendPush": ​1

Deshalb habe ich in Zeile 7 die ID 25 eingetragen:
local phoneID = {25} – Handy-IDs
Beim manuellen Starten der Szene kommt die entsprechende Ausgabe im Debug Fenster. Die Push auf’s Hand funktioniert jedoch nicht.
Wo könnte der Fehler sein?

Unabhängig davon, kann man das Script um eine Benachrichtigung per Email erweitern? Meine lua Kenntnisse sind leider nur knapp über nicht vorhanden. Könnte vielleicht jemand den Code bereitstellen, sofern nicht höllisch aufwendig?

Vielen Dank euch!

Hi,

ok… Hast du denn auch offene Kontakte? Ansonsten sendet er keine Push :wink:

Wenn du eine Push erhalten willst, auch wenn kein Kontakt geöffnet ist, dann muss du nach der Zeile 24 folgenden Code einfügen:

fibaro:call(25, 'sendPush', 'ACHTUNG: Sturm erkannt!')

Den Code für Mail muss ich mal raussuchen, hab ich spontan nicht gefunden.

Gruß

fibaro:call(2, "sendEmail", "Fenster Küche wurde geöffnet.");

bzw.
fibaro:call(2, "sendEmail", subject, message);

wobei 2 die ID des Users ist

Danke :slight_smile:

Hallo boomx,
ich habe das Script heute abend noch mal ausprobiert - auch dank deinem Hinweis -, aber leider bekomme ich eine Fehlermeldung:
[DEBUG] 22:48:08: line 17: attempt to compare number with nil

Bei dem Script wollte ich gerne - da Yahoo nicht geht - es über Openweathermap realisieren.

--[[
%% properties
75 ui.Label5.value
%% globals
--]]
local sturm = 62 -- km/h nach dem Sturm erkannt werden soll
local phoneID = 4 -- Handy-IDs
local maxID = 100

Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

local startSource = fibaro:getSourceTrigger();
local wind = fibaro:getValue(75, 'ui.Label5.value')

if ((tonumber(fibaro:getValue(75, 'ui.Label5.value')) > tonumber(sturm)) or startSource['type'] == 'other') then
     if (startSource['type'] == 'other') then
     Debug('white', "SZENE MANUELL GESTARTET")
    else
     Debug('green', "SZENE DURCH WIND-VORHERSAGE GESTARTET")
    end
  	Debug('red', "ACHTUNG! Sturm erkannt. Geschwindikeit: " ..wind.. " km/h")
  	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! Sturm erkannt. " ..name.. " im Raum " ..room.. " ist offen!")
        	for k=1, maxID do
                      if phoneID[k] ~= nil then
                        fibaro:call(phoneID[k], 'sendPush', 'ACHTUNG: Sturm erkannt! ' ..name.. ' im Raum ' ..room.. ' ist offen!')
                      end
            end
          	end
        end
    end
end

Hast Du noch mal einen Tip ? Ich stehe auf dem Schlauch.

Gruss
Carsten :slight_smile:

Speichert das OpenweatherVD die Werte nicht in Variablen? Nimm doch die anstatt ui.Label5.value.

Gruß

Ich vermute mal, Zeile 3 ist schon das Problem.
Zumindest habe ich das so noch nicht als Trigger gesehen.
in eine Block-Szene kann man das als Wenn-Bedingung auch nicht auswählen.

Befülle doch im VD eine globale Variable, mit dem Wind-Wert und verwende das dann hier als Trigger.

Hallo boomx & Hoggle,
da ich absoluter Newbie in Sache LUA bin, würde ich mich freuen wenn ihr mir einmal zeigen könntet wie der Code auszusehen hat.
Dann habe ich eine Grundlage um da weiter drauf aufzubauen.

Ich habe schon viel hin und her ausprobiert, aber leider hat es nicht geklappt, wahrscheinlich ist es wie so oft, ein Zeichen an der falschen Stelle :wink:

Nur so lesen mit Globale Variable und Trigger, da weis ich nicht wo ich aus dem Script die entsprechenden Werte von Openweathermap rausnehmen muss,
da dort ja auch noch mit einer primären Schleife usw. gearbeitet wird.

Also falls Ihr Zeit habt wäre ich dankbar für ein wenig Hilfe.

Gruss
Carsten

Das hatten wir hier mal diskutiert, ggf hilft Dir das schon weiter:

http://www.siio.de/board/thema/fibaro-hc2-wetterdaten/page/3/

http://www.siio.de/board/thema/fibaro-hc2-wetterdaten/page/3/

Hallo Hoggle,
ich habe es nun so versucht einzubauen, aber so richtig klappt es noch nicht.
Nun habe ich mir extra Weather Underground auch noch installiert, da darauf deine Antwort ausgelegt war.

Ich habe dann versucht die Angaben von der Seite 3 einzubauen.
Nun hatte ich folgende Fehlermeldung:
Line 25: bad argument #2 to ‘tonumber’ (base out of range)

Folgendes steht in der Zeile 25:
if ((tonumber(fibaro:getGlobal('V_Wind')) > tonumber(sturm)) or startSource['type'] == 'other') then

V_Wind ist die besagte Variable die angelegt werden sollte.

Noch gebe ich ja nicht auf. Hast Du vieleicht einen komplett Code wo man sieht wie Du es gelöst hast ?

Danke und schönen Start ins Wochenende.

Gruss
Carsten :slight_smile:

Hast Du die Variable V_Wind unter Konfiguration -> Variables Panel angelegt?

Ja habe ich.
Screenshot anbei:

Variable.jpg

in dem WU-Script befüllt er ab Zeile 297 (bei mir) wie folgt die Label von dem VD:

if (stationID ~= nil) then
          fibaro:call(WU.selfId , "setProperty", "ui.lblStation.value", locationID);
          fibaro:call(WU.selfId , "setProperty", "ui.lblCity.value", city);
          fibaro:call(WU.selfId , "setProperty", "ui.lblTemp.value", WU.translation[WU.language]["Temperature"].." "..temperature.." °C");
          fibaro:call(WU.selfId , "setProperty", "ui.lblHum.value", WU.translation[WU.language]["Humidity"].." "..humidity);
          fibaro:call(WU.selfId , "setProperty", "ui.lblBar.value", WU.translation[WU.language]["Pressure"].." "..pression.." mb");
          fibaro:call(WU.selfId , "setProperty", "ui.lblWind.value", WU.translation[WU.language]["Wind"].." "..wind.." km/h");
          fibaro:call(WU.selfId , "setProperty", "ui.lblRain.value", WU.translation[WU.language]["Rain"].." "..rain.." mm");
              if (WU.now >= "03:00" and WU.now <= "15:59") then

in der dritten Zeile von unten setzt er Wind.
in die zeile dahinter hätte ich eingefügt:
fibaro:setGlobal("V-Wind", wind)

Hallo Hoggle,
habe ich alles probiert.
Die normale VD von Openweathermap und Weather Underground funktionieren super.
Aber die Werte wollen sich einfach nicht in das Sturmwarnungs Script einbauen lassen.
Ich habe die Zeilen 1:1 kopiert, versucht Werte anzupassen, Werte zu setzen - ohne Erfolg.

Nun ja wäre schön gewesen, aber gut hilft nichts, muss man warten bis Fibaro andere Wetterdaten ausser Yahoo anzeigt
und vielleicht klappt es ja dann.

Gruss
Carsten :slight_smile:

Variable.jpg

Wie sieht der Code-Teil im WU Script jetzt aus?

Hi Hoggle,
so sieht das das LUA 2 - Sturmwarnung Script aus:

--[[
%% properties
%% globals
--]]

local sturm = 62 -- km/h nach dem Sturm erkannt werden soll
local phoneID = 4 -- Handy-IDs
local maxID = 1000

Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
 
local startSource = fibaro:getSourceTrigger();
fibaro:call(80, "setProperty", "ui.lblWind.value", wind);
fibaro:setGlobal('V_Wind', wind)

if ((tonumber(fibaro:getGlobal('V_Wind')) > tonumber(sturm)) or startSource['type'] == 'other')
    then
    if (startSource['type'] == 'other') then
     Debug('white', "SZENE MANUELL GESTARTET")
    else
     Debug('green', "SZENE DURCH WIND-VORHERSAGE GESTARTET")
    end
  	Debug('red', "ACHTUNG! Sturm erkannt. Geschwindikeit: " ..V_Wind.. " km/h")
  	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! Sturm erkannt. " ..name.. " im Raum " ..room.. " ist offen!")
        	for k=1, maxID do
                      if phoneID[k] ~= nil then
                        fibaro:call(phoneID[k], 'sendPush', 'ACHTUNG: Sturm erkannt! ' ..name.. ' im Raum ' ..room.. ' ist offen!')
                      end
            end
          	end
        end
    end
end

Bei Weather Underground habe ich nichts geändert.
Muss ich dort den Wert in die Globale Variable füllen um die woanders abzurufen ?

@Hoggle:
Ich glaube jetzt habe ich es kapiert.
Die Zeilen im vorherigen Post von mir bezogen sich also auf das Weather Underground Script.
Da wird die Variable also gefüllt, damit diese in den anderen Scripten weiter bearbeitet werden können, es ist also eine Hilfsübergabe.

Jetzt habe ich nur noch das Problem das folgende Fehlermeldung erscheint beim Start:
Line 18: Bad Argument #2 to ‘tonumber’ (base out of range)

Hi,

was steht denn in der Variablen? Sieht so aus, als ob diese nicht in eine Zahl umgewandelt werden kann. Dies wäre der Fall, wenn soetwas wie “32 km/h” in der Variablen steht.

Gruß