Hjälp Lua som får rörelsesensor att tända lampa i 3 min

Post Reply
Towanda
Medlem
Posts: 58
Joined: 28 Feb 2015, 17:29
9

Hej!

Har inte gett upp hoppet att lyckas med ett LUA script ännu. Försöker få en rörelsesensor att tända en lampa i 3 min och sedan släcka den om sensorn blivit överträdd oavsett status. (öppnar man ytterdörren ska hallampan tändas). I ett senare steg ska den givetvis inte tändas när man går ut men jag har inte sensor för det ännu, däremot kanske jag kan använda Foscam kameran jag ska ut och montera för det, vi får se hur den funkar.

Hur som helst, jag har googlat runt och till slut kommit fram till att scriptet nedan borde funka men det gör det givetvis inte :oops:

173 är rörelsesensorn
175 är en luxsensor (jag vill inte att hallampan ska tändas när det är tillräckligt ljust)

--[[
%% autostart
%% properties
173 value -- Pir ytterdörr
175 value -- ljussensor
%% globals
--]]

local sceneId = 69 --ID of this scene, used to detect number of instances run
local timerEndTime = 300 --Seconds to keep the lamp turned on after PIR detects movement
local timer = "timer" --Name of global variabel to control the timer
local Lights = 164
local startSource = fibaro:getSourceTrigger();
if (
( tonumber(fibaro:getValue(173, "value")) > 0 )
and
( tonumber(fibaro:getValue(175, "value")) < 100 )
or
startSource["type"] == "other"
)
then
fibaro:call(Lights, "turnOn")
fibaro:setGlobal(timer, timerEndTime) --Set global variabel for timer
end
while (fibaro:getGlobalValue(timer) ~= "0") do --loop until timer is 0
timerValue = tonumber(fibaro:getGlobalValue(timer)) --Get current value of global variabel timer
fibaro:setGlobal(timer, timerValue-1) --Decrease global variabel for timer with 1 second
fibaro:debug("Loop - timer = " .. fibaro:getGlobalValue(timer)) --debug
fibaro:sleep(1000) --Wait 1 second
end
fibaro:call(Lights, "turnOff") --Turn lights off
elseif fibaro:countScenes(sceneId) > 1 then --if scene is already running , reset the timer to 3 minutes
fibaro:setGlobal(timer, timerEndTime) --set global variabel for timer to 2 minutes
fibaro:debug("New instance, totalt = " .. fibaro:countScenes(sceneId)) --debug
end

när jag testar scriptet får jag
[ERROR] 21:41:00: line 32: expected near 'elseif' (raden i röd text)

Någon som har tankar/ideer eller kanske till och med kunskap :-)
Det finns säkert fler fel, skulle vara tacksam för kommentarer till ändringar så jag ngn gång kanske lyckas börja lära mig.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Jag är ingen LUA-expert, men du har två END i koden före den krånglande raden. END avslutar den första IF-satsen så då måste du lägga till en ny IF-sats eller ta bort END.
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
petke
Ny medlem
Posts: 14
Joined: 10 May 2015, 19:23
9

Annars går det göra rätt mycket med blockscheman.
Om du t.ex. skapar en variabel "timer" som du sedan låter en scen räkna upp en gång per minut. Då kan du skapa en scen som tänder lampan och sätter "timer" till noll när dörren öppnas, sedan skapar du en scen till som släcker lampan när "timer" är 3.
Detta var kanske något förenklat, men det går i alla fall göra jättemycket med blockscheman. Det enda tillfälle jag har varit tvungen att använda LUA är när jag vill sätta en variabel till samma värde som en annan variabel har. Annars har jag lyckats få min HC2 att aktivera larm, skalskydd, larma av hålla koll på om vi är hemma, sover, är bortresta osv enbart med blockscheman.... Många scener blir det :-)

/Peter
The Cat
Medlem
Posts: 48
Joined: 10 Jan 2014, 12:56
10
Location: Bästkusten

petke wrote:Annars går det göra rätt mycket med blockscheman.
Om du t.ex. skapar en variabel "timer" som du sedan låter en scen räkna upp en gång per minut. Då kan du skapa en scen som tänder lampan och sätter "timer" till noll när dörren öppnas, sedan skapar du en scen till som släcker lampan när "timer" är 3.
Detta var kanske något förenklat, men det går i alla fall göra jättemycket med blockscheman. Det enda tillfälle jag har varit tvungen att använda LUA är när jag vill sätta en variabel till samma värde som en annan variabel har. Annars har jag lyckats få min HC2 att aktivera larm, skalskydd, larma av hålla koll på om vi är hemma, sover, är bortresta osv enbart med blockscheman.... Många scener blir det :-)

/Peter
Låter spännande petke. Försöker verkligen lära mig block programmering, men tyvärr har jag för dålig kunskap. Dom flesta FAQ är ju för lua. Och det är VERKLIGEN överkurs för mig. Jaja. Får stånga huvudet blodigt.
DrPepper
Medlem
Posts: 92
Joined: 05 Jul 2014, 02:04
10

Hejsan,

Naturligtvis skulle jag då vara smart och "hi-jacka" koden för att göra något likn. men hos mig smäller det två rader senare..

--[[
%% autostart
%% properties
80 och 84 value -- 2 * PIR outdoors
87 value -- light sensor, reporting value in Lux
%% globals
--]]

local sceneId = 29 --ID of this scene, used to detect number of instances run
local timerEndTime = 400 --Seconds to keep the lamp turned on after PIR detects movement
local timer = "timer" --Name of global variabel to control the timer
local Lights = 32
local startSource = fibaro:getSourceTrigger();
if (
( tonumber(fibaro:getValue(80, "value")) > 0 )
or
( tonumber(fibaro:getValue(84, "value")) > 0 )
and
( tonumber(fibaro:getValue(87, "value")) < 9 )
or
startSource["type"] == "other"
)
then
fibaro:call(Lights, "turnOn")
fibaro:setGlobal(timer, timerEndTime) --Set global variabel for timer
end
while (fibaro:getGlobalValue(timer) ~= "0") do --loop until timer is 0
timerValue = tonumber(fibaro:getGlobalValue(timer)) --Get current value of global variabel timer
fibaro:setGlobal(timer, timerValue-1) --Decrease global variabel for timer with 1 second
fibaro:debug("Loop - timer = " .. fibaro:getGlobalValue(timer)) --debug
fibaro:sleep(1000) --Wait 1 second
end
fibaro:call(Lights, "turnOff") --Turn lights off
elseif fibaro:countScenes(sceneId) > 1 then --if scene is already running , reset the timer to 3 minutes
fibaro:setGlobal(timer, timerEndTime) --set global variabel for timer to 2 minutes
fibaro:debug("New instance, totalt = " .. fibaro:countScenes(sceneId)) --debug
end

På den får jag "[ERROR] line 34: " expected near 'elseif'"

Fashinerande att det ska vara så svårt...

/DrPepper
HC2, blandade sensorer och puckar.

"Hemautomation är inte "remote access" eller "in i en app och pilla" - hemautomation är rätt sensorer och puckar på rätt plats och, utan användarinteraktion, trigga önskade aktiviteter."
Towanda
Medlem
Posts: 58
Joined: 28 Feb 2015, 17:29
9

petke wrote:Annars går det göra rätt mycket med blockscheman.
Om du t.ex. skapar en variabel "timer" som du sedan låter en scen räkna upp en gång per minut. Då kan du skapa en scen som tänder lampan och sätter "timer" till noll när dörren öppnas, sedan skapar du en scen till som släcker lampan när "timer" är 3.
Detta var kanske något förenklat, men det går i alla fall göra jättemycket med blockscheman. Det enda tillfälle jag har varit tvungen att använda LUA är när jag vill sätta en variabel till samma värde som en annan variabel har. Annars har jag lyckats få min HC2 att aktivera larm, skalskydd, larma av hålla koll på om vi är hemma, sover, är bortresta osv enbart med blockscheman.... Många scener blir det :-)

/Peter
Började försöka med att göra det i block men fick det aldrig att fungera, det kanske är något med timer som jag inte fattat. Har gjort en variabel som jag kallade för Timer, dvs skrev in det namnet på en variabel. Ska man gör något mer sedan ?
Förstår inte heller hur jag använder den i block. Finns det något bra ställe där man kan läsa mer om Blockprogrammering?
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Towanda, fixade du inte till din LUA-kod?
Som jag skrev tidigare så har din ELSEIF-sats ingen inledande IF-sats.
Din kod ser ut så här (kraftigt reducerad).

if (Här börjar din IF-sats)
or
and
or
then
end (Här slutar din IF-sats)

while *** do (Här börjar din WHILE DO)
end (Här slutar din WHILE DO)

elseif (Här kommer en ELSEIF som inte har någon inledande IF-sats eftersom den som fanns avslutats med END)
then
end (Här avslutas den ofullständiga ELSEIF-satsen)

Vad händer om du ändrar ELSEIF till IF ?
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
petke
Ny medlem
Posts: 14
Joined: 10 May 2015, 19:23
9

Towanda wrote:
petke wrote:Annars går det göra rätt mycket med blockscheman.
Om du t.ex. skapar en variabel "timer" som du sedan låter en scen räkna upp en gång per minut. Då kan du skapa en scen som tänder lampan och sätter "timer" till noll när dörren öppnas, sedan skapar du en scen till som släcker lampan när "timer" är 3.
Detta var kanske något förenklat, men det går i alla fall göra jättemycket med blockscheman. Det enda tillfälle jag har varit tvungen att använda LUA är när jag vill sätta en variabel till samma värde som en annan variabel har. Annars har jag lyckats få min HC2 att aktivera larm, skalskydd, larma av hålla koll på om vi är hemma, sover, är bortresta osv enbart med blockscheman.... Många scener blir det :-)

/Peter
Började försöka med att göra det i block men fick det aldrig att fungera, det kanske är något med timer som jag inte fattat. Har gjort en variabel som jag kallade för Timer, dvs skrev in det namnet på en variabel. Ska man gör något mer sedan ?
Förstår inte heller hur jag använder den i block. Finns det något bra ställe där man kan läsa mer om Blockprogrammering?
Ett enkelt exempel som tänder lampan i tre minuter efter att dörren öppnas.

Ökar variabeln Time med 1 varje minut.
Image

Tänder lampan och sätter variabeln Time till 0 när dörren öppnas
Image

Släcker lampan när variabeln Time har blivit 3
Image

Dock finns brister i programmet som får fixas till efter eget önskemål. Du vill kanske att lampan bara tänds när du kommer hem om det är mörkt och kanske inte när du går hemifrån på morgonen osv.. Men det är klart att man kan fixa detta mycket snyggare med LUA...
Towanda
Medlem
Posts: 58
Joined: 28 Feb 2015, 17:29
9

Hej! Tänkte bara förklara varför jag inte gjort något eller svarat. vid senaste uppdateringen dog min hc2 så jag fick skicka tillbaka den till Fibaro support och väntar nu på en ersättningsenhet.

Ska testa o kolla när jag fått den :-)
Towanda
Medlem
Posts: 58
Joined: 28 Feb 2015, 17:29
9

Så, då har jag fått ett nytt HC2 och lagt till enheterna så det är dax att fortsätta testa. :?

Testade att byta ut elseif mot if på rad 32 (den som är rödmarkerad i min första post) och kör scriptet.

Nu kommer jag bara till rad 15 där jag får:
[ERROR] 21:51:44: line 15: attempt to compare number with nil

På rad 15 står det: ( tonumber(fibaro:getValue(6, "value")) > 0 )

Jag kör iofs ver 4.054 nu men dom kan väl inte ha ändrat på hur man skriver LUA? eller ??
Hans_R
Ny medlem
Posts: 11
Joined: 08 Mar 2020, 23:02
4

petke wrote: 22 Jun 2015, 11:55
Towanda wrote:
petke wrote:Annars går det göra rätt mycket med blockscheman.
Om du t.ex. skapar en variabel "timer" som du sedan låter en scen räkna upp en gång per minut. Då kan du skapa en scen som tänder lampan och sätter "timer" till noll när dörren öppnas, sedan skapar du en scen till som släcker lampan när "timer" är 3.
Detta var kanske något förenklat, men det går i alla fall göra jättemycket med blockscheman. Det enda tillfälle jag har varit tvungen att använda LUA är när jag vill sätta en variabel till samma värde som en annan variabel har. Annars har jag lyckats få min HC2 att aktivera larm, skalskydd, larma av hålla koll på om vi är hemma, sover, är bortresta osv enbart med blockscheman.... Många scener blir det :-)

/Peter
Började försöka med att göra det i block men fick det aldrig att fungera, det kanske är något med timer som jag inte fattat. Har gjort en variabel som jag kallade för Timer, dvs skrev in det namnet på en variabel. Ska man gör något mer sedan ?
Förstår inte heller hur jag använder den i block. Finns det något bra ställe där man kan läsa mer om Blockprogrammering?
Ett enkelt exempel som tänder lampan i tre minuter efter att dörren öppnas.

Ökar variabeln Time med 1 varje minut.
Image

Tänder lampan och sätter variabeln Time till 0 när dörren öppnas
Image

Släcker lampan när variabeln Time har blivit 3
Image

Dock finns brister i programmet som får fixas till efter eget önskemål. Du vill kanske att lampan bara tänds när du kommer hem om det är mörkt och kanske inte när du går hemifrån på morgonen osv.. Men det är klart att man kan fixa detta mycket snyggare med LUA...
Så här nästan fem år senare... Finns det möjlighet att du lägger upp skärmdumparna med ovanstående blockscener igen? :)
//Hans
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Blockscener är tyvärr väldigt begränsade, så om du vill kunna utnyttja potentialen i din HC2 så rekommenderar jag varmt att du installerar skriptet EventRunner som det skrivs mycket om här på forumet. viewtopic.php?f=38&t=6878

EventRunner underlättar enormt om du vill göra det där lilla extra med din hemautomatik, och jang som har skapat skriptet är mycket hjälpsam om du får problem.
EventRunner hittar du här...
https://github.com/jangabrielsson/Event ... unner3.lua
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
Hans_R
Ny medlem
Posts: 11
Joined: 08 Mar 2020, 23:02
4

Tack för tipset! Jag har sett det nämnas lite här och där och ser verkligen fördelen med att kunna testköra på min dator innan jag lägger över det på HC2:an. Bara jag som måste våga ta steget och börja skriva lite kod även på fritiden. ;)
//Hans
Systemfel
Medlem
Posts: 384
Joined: 14 Jan 2015, 01:02
9

--[[
%% autostart
%% properties
80 och 84 value -- 2 * PIR outdoors
87 value -- light sensor, reporting value in Lux
%% globals
--]]
------------------------------------------------------------------------------------------------------
Borde väll vara så ?
--[[
%% autostart
%% properties
80 value
84 value
87 value -- light sensor, reporting value in Lux
%% globals
--]]
kör Hc3 och det fungerar bättre och bätttre sakta men säkert :D
Post Reply