--[[ %% autostart %% properties %% events %% globals %%time +00:15 --]] --[[ Name der Szene: Mobile Alerts Test Version: 4.4.3 14.03.2022 Kurzbeschreibung: Versucht über Rest API Mobile Alerts Server Werte auszulesen Versionsführung: 0.4 noch komplett in der Entwicklung, Zugriffe sind noch fehlerhaft 1.0 Zugriff funktioniert 2.0 Vorbereiten für auslesen diverser Devices 3.0 grundsätzliche Änderung, Sensorübersicht wird gelesen und zerlegt 4.0 Befüllt nun VD mit den Daten 4.1 zwei VD's 1*atmosphärisch, 1* Kontakt und globale Variable für Kühlschränke 4.2 Rücksetzen des Leckage Alarms über Szene 60 4.2.2 Fehler bei Voralarm bereinigt 4.3 Überprüft ob Sensorwerte Aktuell bevor Alarm = Jahr/Monat/Tag/Stunde 4.4 Bei bestimmte Feuchte wird Ventilator im Bad gestartet 4.4.1 Ventialtor Dauer auf 14:55 gekürzt 4.4.3 Umsetllung auf %%time Start Sensor ID's = 1051C8CF127F Tür Kontakt 1033E37A11D6 Küchenfenster (inaktiv) Kontakt 10348767E730 Bad Eltern Fenster (inaktiv) Kontakt 1057126682E5 Hoftür Flur unten Kontakt 105C057CC8DE Justin Hoftür Kontakt 10540A0FB67F Bad Souterrain Fenster (inaktiv) Kontakt 020F7A0BD9F7 Wohnzimmer Temp 0278AEEA34C1 Schlafzimmer Temp 025EEDFE0ADE Arbeitszimmer Temp 044D3B15EA5E Keller Temp Luftf. Wasser 02387318F623 Kühlschrank Side-by-Side Temp 03412FD186E1 Aussenwerte Terrasse Temp Luftf. 1035A00A353E Garage inaktiv Kontakt Phone ID von Handy: nnnnnnnnnn" PID = "&phoneid=" DID = "deviceids=," alle aufzählen url= "https://measurements.mobile-alerts.eu/Home/SensorsOverview?"..DID..PID Virtuelles Device für atmosphärische Sensoren ID 223 Virtuelles Device für Kontakt Sensoren ID 286 --]] local VendorID = "vendorid=} local vdID local measure local maxKuehltemp = 9 local maxFeuchte = 70 local Alarm = false local lueften = false local LuefterID = 548 --- HC2 als fibaro definieren für k rzere Kommandos ----- HC2 = fibaro ----- Stopt zuviele Szenen ----- if (HC2:countScenes()>1) then HC2:abort(); end function Display( color, message ) -- _f:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")); local FMS=string.format('<%s style="color:%s;">%s', "span", color, message, "span"); HC2:debug(FMS); HC2:call(HC2:getGlobalValue('AdminID'), 'sendPush', message) -- api.post('/mobile/push', {["mobileDevices"]={AdminID}, ["message"]=FMS, -- ["title"]="Debug", ["category"]='RUN_CANCEL', ["data"]={["sceneId"]=8}}); end function Messwerte_auslesen(MW, Atmo, Kontakt) local m; local w; local z; local SensorNr m, z = string.find(MW, "ID") local Sensor = string.sub(MW, 1, m-3) m, w = string.find(MW, "Zeitpunkt") local ID = string.sub(MW, z+2, m-2) -- der Sensortyp ist über die ersten beiden Zahlen kodiert -- 02 Temperatursensor: Zeitpunkt & Temperatur -- 03 Temperatur & Feuchtesensor: Zeitpunkt & Temperatur & Luftfeuchte -- 04 Temperatur & Feuchte & Leckagesensor: -- Zeitpunkt & Temperatur & Luftfeuchte & Wassersensor -- 10 Kontaktsensor: Zeitpunkt & Zustand (Offen/Geschlossen) ID = string.gsub(ID, " ", "") -- Space entfernen print("-- "..(Atmo+Kontakt-1).."-"..Sensor..": "..ID.." --") local atmosphaerisch = string.sub(ID, 1, 1) == "0" local Hygrometer = string.sub(ID, 2, 2) >= "3" local Wassersensor = string.sub(ID, 1, 2) == "04" MW = string.sub(MW, (w+1), (-1)) m, w = string.find(MW, ".20") local Datum = string.sub(MW, (m-5), (w+2)) m, w = string.find(MW, ":") local Uhrzeit = string.sub(MW, (m-2), (w+5)) print(Datum.." "..Uhrzeit) local Aktuell = string.sub(Datum,9,10) == os.date("%y", os.time()) --Jahr Aktuell = Aktuell and string.sub(Datum,4,5) == os.date("%m", os.time()) -- Monat Aktuell = Aktuell and string.sub(Datum,1,2) == os.date("%d", os.time()) -- Tag Aktuell = Aktuell and string.sub(Uhrzeit,1,2) == os.date("%H", os.time()) -- Stunde sollte übereinstimmen if atmosphaerisch then vdID = 223 -- VD für atmosphärischen Sensoren ist unterschiedlich zu Kontaktsensoren SensorNr = Atmo -- übernimmt die Zählernummer für die richtige Ausgabe im VD Atmo = Atmo+1 -- Anzahl der atmosphärischen Sensoren erhöht sich um 1 m, w = string.find(MW, ",") local Temperatur = string.sub(MW, (m-2), (m+1)) Temperatur = string.gsub(Temperatur, ">", "") Temperatur = string.gsub(Temperatur, ",", ".") Alarm = string.find(Sensor, "Kuehlschrank") ~= nil and tonumber(Temperatur) > maxKuehltemp Temperatur = string.gsub(Temperatur, ">", "").."°C" HC2:debug("Temperatur: "..Temperatur) if Alarm and Aktuell then Display("cyan", Sensor..": "..ID.." überschreitet Maximaltemperatur. "..Temperatur.."/"..tostring(maxKuehltemp).."°C") HC2:setGlobal("Alarmcode", "Kuehlschrank") -- Wärmealram Kühlschrank ausgelöst end measure = Temperatur z = w+5 -- ab hier beginnt neuer Sensor if Hygrometer then -- Sensor verfügt über Feuchtewert m, w = string.find(MW, "%%") -- %% maskiert das Prozenzzeichen, da es sonst als escape Sequenz verstanden wird local Luftfeuchte = string.sub(MW, (w-2), (w-1)) print("Luftfeuchte: "..Luftfeuchte.."%") lueften = string.find(Sensor, "Bad Eltern") ~= nil and tonumber(Luftfeuchte) >= maxFeuchte local tagsueber = os.date("%H:%M", os.time()) <= "23:00" and os.date("%H:%M", os.time()) >= "07:45" if lueften and Aktuell and tagsueber then print("Lüfter Eltern Bad wird für 15 Minuten eingeschaltet") HC2:call(LuefterID, "turnOn") setTimeout(function() HC2:call(LuefterID, "turnOff"); print("Lüfter Bad Eltern aus."); end, 895*1000) -- abschalten nach 14:55 Minuten, damit neuer Durchlauf Ventilator eventuell weiter eingeschaltet lassen kann end -- if lueften measure = measure.." - "..Luftfeuchte..".0 %" z = w+2 -- ab hier beginnt neuer Sensor if Wassersensor then -- Wassersensor zusätzlich vorhanden m, w = string.find(MW, "Wassersensor") local Wassersensor = string.sub(MW, w+2, w+11) HC2:debug("Wassersensor: "..Wassersensor) measure = measure.." - "..Wassersensor Alarm = string.find(Wassersensor, "Trocken") == nil -- Wassersensor medlet feucht! if Alarm and Aktuell then Display("blue", Sensor..": "..ID.." meldet Feuchtigkeit!") HC2:setGlobal("Alarmcode", "Wasser") -- Wasseralarm ausgelöst else HC2:startScene(60) -- Leckage Überprüfung initiiernen und wieder abschalten end --Alram nass oder trocken -- local m1, m2 -- m1, m2 = string.find(Wassersensor, "trocken") -- if m1 == nil then measure = measure.." - dry" -- else measure = measure.." - wet"; end z = w+13 -- ab hier beginnt neuer Sensor end end else -- Kontatksensor m, w = string.find(MW, "Kontaktsensor") local Kontaktsensor = string.sub(MW, (w+2), (w+15)) Kontaktsensor = string.gsub(Kontaktsensor, ">", "") print("Zustand: "..Kontaktsensor) measure = Kontaktsensor Alarm = string.find(Kontaktsensor, "Geschlossen") == nil -- ein Kontakt meldet geöffnet if Alarm and Aktuell and (HC2:getGlobalValue("Alarmstatus") == "Burg" or HC2:getGlobalValue("Alarmstatus") == "Wache") then Display("orange", Sensor..": "..ID.." meldet geöffnet") HC2:setGlobal("Alarmcode", "Vorwarnung") -- Einbruchvoralarm ausgelöst HC2:startScene(71) --Einbruchbehandlung end vdID = 286 -- VD für atmosphärischen Sensoren ist unterschiedlich zu Kontaktsensoren SensorNr = Kontakt -- übernimmt die Zählernummer für die richtige Ausgabe im VD Kontakt = Kontakt+1 -- Anzahl der Kontakt Sensoren erhöht sich um 1 z = w+17 -- ab hier beginnt neuer Sensor end HC2:call(vdID, 'setProperty', "ui.sensor"..SensorNr..".value",Sensor) HC2:call(vdID, 'setProperty', "ui.time"..SensorNr..".value",Datum.." "..Uhrzeit) HC2:call(vdID, 'setProperty', "ui.measure"..SensorNr..".value",measure) if string.find(MW, "ID", z) ~= nil then Messwerte_auslesen(string.sub(MW, z, -1), Atmo, Kontakt) end -- Endlos-Schleife end -- Messwerte_auslesen function API () local url = "https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=" print(url) local selfhttp = net.HTTPClient() -- timeout entfernt selfhttp:request(url, { options={ method = 'POST', timeout = 35000, checkCertificate = false}, success = function(Response) local result = Response.data; HC2:debug(Response.status) if Response.status == 200 or Response.status == 201 then local v = 0; local z = 0 result = string.gsub(result, "\n", "") -- new line result = string.gsub(result, "\t", "") -- Horizontaler Tab v, z = string.find(result, "ID") result = string.sub(result, (z+1), (-1)) result = string.gsub(result, "%b<>", "") result = string.gsub(result, "\r", "") -- new line result = string.gsub(result, " ", " ") -- Space v, z = string.find(result, "Home") Messwerte_auslesen(string.sub(result, z+2, -1), 1, 1) else HC2:debug('Error: ' ..Response.status.. ' - Zugriff verweigert') end end, error = function(err) HC2:debug(' [ERROR] ' .. err) end }) -- setTimeout(function() API(); end, (15*60*1000)) -- startet alle 15 Minuten Aktualisierung end print(os.date("%x", os.time()).."----- Mobile Alerts -----") API()