Timer på Global variabels ändring av värde..

Post Reply
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
7

Har kompletterat mitt Z-wave hem med sensorer på garageportarna som känner om de är öppna eller stängda samt brytare på portmotorerna så jag kan öppna och stänga via fibaro.
So far so good, funkar klockrent och jag har lite scener samt VD´s för att hantera dessa.

Men nu har jag kört fast lite grann. Sensorerna uppdaterar två globala variabler (en för varje port) med antingen "Open" eller "Closed".
Det jag vill göra är att trigga en scen som automatiskt stänger en port som vart öppen xx minuter.
Står helt still och jag kommer inte på hur jag ska få till det..

Tanken är att fibaro skickar en interaktiv push som säger "Port 1 har vart öppen XX min, vill du stänga?".

Allt är klart, bara timern som saknas. Den ska alltså börja räkna när variabeln ändras till Open. Sen nollställas/sluta räkna när den blir Closed.
Dvs om jag stänger direkt.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Det här är nog minsta koden, men du behöver 2 scener, en per port. Du får lägga till notifieringen.
... och det bygger på antagandet att du inte kan få två ”Open” efter varann från samma port...

Code: Select all

--[[
%% globals
Garageport_1
--]]
timeout = 10 -- notify after 10 minutes
if fibaro:getGlobal("Garageport_1")=="Closed" then
    fibaro:killScenes(__fibaroSceneId) -- kill ev. sleeping instance
else -- door open, wait and notify
    fibaro:sleep(timeout*60*1000)
    fibaro:debug("Stänger Port1")
    api.post('/mobile/push', {["mobileDevices"]={4}, ["message"]=[[Garageport 1 öppen, vill du stänga?]], ["title"]='Garageport 1', ["category"]='YES_NO', ["data"]={["sceneId"]=108}});
end
Last edited by jang on 29 Sep 2018, 18:08, edited 3 times in total.
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
7

Den vill inte riktigt lira.. Får error:
[DEBUG] 16:03:49: [1;31m2018-09-29 16:03:49.119377 [ fatal] Unknown exception: /opt/fibaro/scenes/111.lua:10: syntax error near 'fibaro'

Men skulle detta kunna funka?

Code: Select all

--[[
%% properties
%% weather
%% events
%% globals
Garageport_1
--]]

if ( fibaro:getGlobalValue("Garageport_1") == "Open" ) --triggar scenen när Globala variabeln Garageport_1 ändras till Open
  then
	setTimeout(function() --Väntar i detta ex 10 sek då jag vill testa.
		api.post('/mobile/push', {["mobileDevices"]={4}, ["message"]=[[Garageport 1 öppen, vill du stänga?]], ["title"]='Garageport 1', ["category"]='YES_NO', ["data"]={["sceneId"]=108}}); --Skickar sedan push till mobilen med fråga om jag vill stänga. Vid YES triggas scen 108 som bara stänger porten.
end
	elseif	( fibaro:getGlobalValue("Garageport_1") == "Closed" ) -- om porten stängs inom 10 sek i detta fall så...
    then
    	fibaro:killScenes(111) -- kill ev. sleeping instance --... dödas scenen.
end, 10000)
Men på denna får jag
[DEBUG] 16:17:55: [1;31m2018-09-29 16:17:55.243817 [ fatal] Unknown exception: /opt/fibaro/scenes/111.lua:14: ')' expected (to close '(' at line 11) near 'elseif'
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Koden blev konstig när jag klistrade in den. Har ändrat i den tidigare posten. Borde funka nu. Har också lagt till din notifiering.
setTimeout är lite onödig i ditt fall, och det ska isåfall bara vara när dörren öppnas. Nu är koden lite konstig, därav bl.a syntax felet.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Din version skulle se ut såhär - men tycker det är renare med en sleep (och jag tycker inte om sleep generellt)

Code: Select all

--[[
%% globals
Garageport_1
--]]
  if (fibaro:getGlobalValue("Garageport_1") == "Open" ) then --triggar scenen när Globala variabeln Garageport_1 ändras till Open
    setTimeout(function() --Väntar i detta ex 10 sek då jag vill testa.
        api.post('/mobile/push', {["mobileDevices"]={4}, ["message"]=[[Garageport 1 öppen, vill du stänga?]], ["title"]='Garageport 1', ["category"]='YES_NO', ["data"]={["sceneId"]=108}}); --Skickar sedan push till mobilen med fråga om jag vill stänga. Vid YES triggas scen 108 som bara stänger porten.
      end, 10*1000)
  elseif	(fibaro:getGlobalValue("Garageport_1") == "Closed") then -- om porten stängs inom 10 sek i detta fall så...
    fibaro:killScenes(__fibaroSceneId) -- kill ev. sleeping instance --... dödas scenen.
  end
__fibaroSceneId har värdet av scenens ID. Enklare om du duplicerar koden för den andra dörren.
Adde80
Medlem
Posts: 71
Joined: 18 Nov 2016, 01:06
7

Works like a charm!
Stort tack Jang!
Post Reply