**STICKY** PIR och dörr sensor rörelse tänder lampa

Hjälp varandra att vara kreativa för att göra hemmet mer bekvämt.
Post Reply
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Scen som tänder en lampa om dörrsensor öppnas eller rörelse sker framför en PIR sensor. Om ny rörelse sker så startas timer om från xx minuter.

Denna använder jag för min källare.


** UPPDATERING **
Upptäckte att när ny rörelse sker eller dörr öppnades så triggades en till instans av samma scen vilket medförde att lampa tändes och släcktes med bägge instanserna. Så tillbaka till ritbordet och då blev det så här istället med hjälp utav robmac på fibaro's forum.
Denna kräver 2st scener för att få bukt med flera instanser av samma scen.

Scen1 (Huvud scen)

Code: Select all

--[[ 
%% properties 
130 value
98 value
%% globals
--]]

--[[
PIR/DoorSensor Timer
original by jompa68
Modified by jompa68, robmac

 
HISTORY:
1.0.0   original  					                                                        2013-11-21
1.0.1   major improvments, fixes and comments                                         2013-11-29

TO USE:
If PIR or door sensor activates by movement or open doors lights will turn of
fo XX minutes, if movement or reopen doors within clockTimer it will kill running 
scenes and start a new instance of same scene and clockTimer will start from 0
Needs to have a resetScene defined in your HC2 system (option to have cancelScene also)
--]]

local sceneId = 88 --ID på scen, används för att kolla antal instanser som körs
--local cancelSceneId = 136 --ID of the cancel scen, 
local resetSceneId = 138 --ID of the reset scen, 
local varValue = fibaro:getGlobalValue("TimeOfDay") --variabel, för att kolla om skymning
local triggerValue = fibaro:getValue(130, "value") --PIR sensor
local triggerDoor = fibaro:getValue(98, "value") -- Dörrr sensor
local lights = 134 --LampID
local clockTimer = 5 --Minuter som lampan ska vara tänd


 if (fibaro:countScenes(sceneId) > 1) then 
    if (triggerDoor == "1" or triggerValue == "1" and varValue == "Morgon") or (triggerDoor == "1" or triggerValue == "1" and varValue == "Skymning") then
      fibaro:debug("Sensor triggad igen, startar om timer")
      fibaro:startScene(resetSceneId); -- avsluta den sovande instansen
    
    -- xxxxxxxxxx NOT IN USE xxxxxxxxxxx
    
    --elseif (triggerDoor == "0" and triggerValue == "0") then
        -- not sure if you want this but trun off and cancel running scene
        --fibaro:debug("Door closed!")
        --fibaro:call(lights, "turnOff") 
        --fibaro:startScene(cancelSceneId);
    
    -- xxxxxxxxxx NOT IN USE xxxxxxxxx
  	end 
     -- 
      fibaro:abort() 
elseif varValue == "Morgon" or varValue == "Skymning" then
	if triggerDoor == "1" or triggerValue == "1" then 
  --Announce start 
	fibaro:debug(" -|- Start: "..os.date("%Y-%m-%d %H:%M:%S",os.time())) 
	fibaro:call(lights, "turnOn") 
    fibaro:debug(" -|- Sensor aktiverad:  clockTimer = " .. clockTimer.."min") 
    fibaro:sleep(60 * 1000 * clockTimer) -- Håller lampan tänd i xx minuter
  	fibaro:call(lights, "turnOff")
    fibaro:debug(" -|- Inget triggat, släcker lampor")
    fibaro:debug(" -|- End: "..os.date("%Y-%m-%d %H:%M:%S",os.time())) 
end 
end 
Scen2 (resetScen, för att starta om Scen1)

Code: Select all

--[[
%% properties

%% globals
--]]
local sceneControlID = 88 --ScenID för Scen1
while (fibaro:countScenes(sceneControlID) > 0) do 
 
    fibaro:killScenes(sceneControlID); -- Avslutar den sovande scenen!

    fibaro:debug("Kill: "..sceneControlID )
  
end; 
--restart the main scene 
fibaro:startScene(sceneControlID);
fibaro:debug("Startar om scen: "..sceneControlID)
Last edited by jompa68 on 29 Nov 2013, 12:50, edited 5 times in total.
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Hej.

Var exakt i koden ändrar jag till mina värden? ÄR det så att jag måste ha en dörrsensor OCH en PIR?

Min dörrsensor har ID 18 och min lampa som jag vill ska tändas har ID 20.
Scenen jag har skapat är ID 11.

Min direkta känsla är att ID 117 byts ut mot ID 11 sen är jag inte riktigt med längre.
Ska jag ändra värdet 100 på Door och sen värdet 176 på lights till resp ID som jag har?

Känner mig väldigt dum här :/

Code: Select all

local sceneId = 117 --ID of this scene, used to detect number of instances run 
local timerEndTime = 180 --Seconds to keep the lamp turned on after PIR detects movement 
local varValue= fibaro:getGlobal("BasementDark")
local timer = "sensorBasement" --Name of timer 
local timerValue = fibaro:getGlobalValue(timer) --Current value of global variabel for timer 
local triggerValue = fibaro:getValue(167, "value") --PIR value that activated this scene 
local triggerDoor = fibaro:getValue(100, "value") -- Door sensor
local lights = 176 --light to be controlled by this scene
Mvh // Robert
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Robert wrote:Hej.

Var exakt i koden ändrar jag till mina värden? ÄR det så att jag måste ha en dörrsensor OCH en PIR?

Min dörrsensor har ID 18 och min lampa som jag vill ska tändas har ID 20.
Scenen jag har skapat är ID 11.

Min direkta känsla är att ID 117 byts ut mot ID 11 sen är jag inte riktigt med längre.
Ska jag ändra värdet 100 på Door och sen värdet 176 på lights till resp ID som jag har?

Känner mig väldigt dum här :/

Code: Select all

local sceneId = 117 --ID of this scene, used to detect number of instances run 
local timerEndTime = 180 --Seconds to keep the lamp turned on after PIR detects movement 
local varValue= fibaro:getGlobal("BasementDark")
local timer = "sensorBasement" --Name of timer 
local timerValue = fibaro:getGlobalValue(timer) --Current value of global variabel for timer 
local triggerValue = fibaro:getValue(167, "value") --PIR value that activated this scene 
local triggerDoor = fibaro:getValue(100, "value") -- Door sensor
local lights = 176 --light to be controlled by this scene
Mvh // Robert
Gör så här:

Code: Select all

--[[ 
%% properties 
18 value
%% globals
--]] 
-- Change ID of scene + ID of sensors. 
-- Change timerEndTime to how long the lights should be ON
-- Needs variable (BasementDark)  Can be what ever you want it to be

local sceneId = 11 --ID of this scene, used to detect number of instances run 
local timerEndTime = 3 --Minutes to keep the lamp turned on after PIR detects movement 
local varValue= fibaro:getGlobal("BasementDark")
local timer = "sensorBasement" --Name of timer 
local timerValue = fibaro:getGlobalValue(timer) --Current value of global variabel for timer 
--local triggerValue = fibaro:getValue(167, "value") --PIR value that activated this scene 
local triggerDoor = figaro:getValue(18, "value") -- Door sensor
local lights = 20 --light to be controlled by this scene


--Announce start 
fibaro:debug(" -|- Start: "..os.date("%Y-%m-%d %H:%M:%S",os.time())) 

if triggerDoor == "1" and varValue == "1" then
     fibaro:debug(" -|- Sensor activated:  Timer = " .. timerValue) 
    fibaro:call(lights, "turnOn") 
    fibaro:setGlobal(timer, timerEndTime) 
    while (fibaro:getGlobalValue(timer) ~= "0") do 
      timerValue = tonumber(fibaro:getGlobalValue(timer)) 
      fibaro:setGlobal(timer, timerValue-1) 
      fibaro:debug(" -|- Timer = " .. fibaro:getGlobalValue(timer))    
      figaro:sleep(60000) 
    end 
    fibaro:call(lights, "turnOff")
   fibaro:debug(" -|- Nothing triggered, turnOff lights")
   elseif fibaro:countScenes(sceneId) > 1 then
     fibaro:debug("-|- Sensor triggered, new value!") 
    fibaro:setGlobal(timer, timerEndTime) 
     fibaro:debug(fibaro:getGlobalValue(timer))
end 
fibaro:debug(" -|- End: "..os.date("%Y-%m-%d %H:%M:%S",os.time())) 



Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Ok och tack. Men då tänker jag rätt iallafall. Dock vill det inte lira ändå. Du skriver scen? Ska den då läggas i en scen eller i en virtuell enhet?

Eller ska jag skapa en virtuell enhet och sen skapa en scen där jag länkar till den virtuella enheten?

Det finns flera inställningar för virtuella enheter. När ska man använda sig av IP-adressen som finns där man döper sin virtuella enhet.

Bifogar 2 bilder som jag känner mig osäker på.

Frågorna är många men svaren få än så länge :) Uppskattar att du tar dig tid jompa.
Attachments
Skärmavbild 2013-11-29 kl. 12.36.30.png
Skärmavbild 2013-11-29 kl. 12.36.30.png (112.66 KiB) Viewed 157506 times
Skärmavbild 2013-11-29 kl. 12.36.13.png
Skärmavbild 2013-11-29 kl. 12.36.13.png (61.47 KiB) Viewed 157506 times
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Det är scen du ska använda dig utav. "Lägg till ny scene"
Se början av inlägget, har gjort om scenen lite.
erkadevil
Ny medlem
Posts: 4
Joined: 11 Jan 2014, 13:57
10

Tjena,

Jag har försökt lite med detta. Och jag får inte riktigt loopen att funka, det verkar som att man fastnar där. För man går in med ett värde på timern som är två. Men sen händer liksom inte mer.
Och man kommer aldrig in i elseif-villkoret överhuvudtaget. (Verkar inte som att man någonsin dödar någon process heller för man får inga debugutskrifter från den scenen, men jag har testat att med den igång och utan att ha den igång och resultatet är detsamma.

mvh
Erik
andarv
Medlem
Posts: 82
Joined: 15 Feb 2014, 00:17
10

Jag har försökt att få koden att fungera med två separata PIR genom att skapa en lokal trigger value2... Mina kod kunskaper är rätt begränsade, trodde att det bara var namn som värden stoppades in i för att hämtas senare i scenen. Men så verkar inte vara fallet.
Har någon ett förslag på hur jag skall få den att fungera med flera enheter?
local triggerValue = fibaro:getValue(39, "value")
local triggerValue2 = fibaro:getValue(78, "value")
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Ge mig din nuvarande koden så fixar jag till den åt dig

Skickat från min GT-I9195 via Tapatalk
andarv
Medlem
Posts: 82
Joined: 15 Feb 2014, 00:17
10

Som du ser har jag strulat lite i koden ovanför.
Scenen funkar bra om man bortser från att den inte reagerar på PIR ID 78

Code: Select all

--[[ 
%% properties 
78 value
39 value
13 value
%% globals
--]]

--[[
PIR/DoorSensor Timer
original by jompa68
Modified by jompa68, robmac

 
HISTORY:
1.0.0   original                                                                         28-07-2013
1.0.1   major improvments, fixes and comments                                        29-07-2013

TO USE:
If PIR or door sensor activites by movement or open doors lights will turnOn
for XX minutes, if movement or doors reopen within clockTimer it will kill running 
scenes and start a new instance of same scene and clockTimer will start from 5
Needs to have a resetScene defined in your HC2 system
--]]

local sceneId = 27 --ID of this scene, used to detect number of instances run 
local resetSceneId = 33 --ID of the reset scene, 
local varValue = fibaro:getGlobalValue("ljusUte") -- check variable status. Needs to be created.
local triggerValue = fibaro:getValue(39, "value") --PIR value that activated this scene 
local triggerValue2 = fibaro:getValue(78, "value") --PIR value that activated this scene 
local triggerDoor = fibaro:getValue(13, "value") -- Door sensor
local lights = 36, 38 --light to be controlled by this scene
local clockTimer = 5 --Minutes to keep lights on


 if (fibaro:countScenes(sceneId) > 1) then 
    if (triggerDoor == "1" or triggerValue == "1" or triggerValue2 == "1" and varValue == "mörkt") then
      fibaro:debug("Triggered again, will reset timer")
      fibaro:startScene(resetSceneId); -- kill the running instance that is sleeping
         end 
     -- should not get here but if we do just quit
      fibaro:abort() 
elseif varValue == "mörkt" then
   if triggerDoor == "1" or triggerValue == "1" or triggerValue2 == "1" then 
        --Announce start 
      fibaro:debug(" -|- Start: "..os.date("%Y-%m-%d %H:%M:%S",os.time())) 
      fibaro:call(lights, "turnOn") 
       fibaro:debug(" -|- Sensor activated:  clockTimer = " .. clockTimer.."min") 
       fibaro:sleep(60 * 1000 * clockTimer) -- Wait so variable is set 
        fibaro:call(lights, "turnOff")
       fibaro:debug(" -|- Nothing triggered, turnOff lights")
       fibaro:debug(" -|- End: "..os.date("%Y-%m-%d %H:%M:%S",os.time())) 
    end
end
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Är du säker på att id 78 ger värdet 1 vid rörelse?
Prova detta i en LUA scen

Code: Select all

--[[ 
%% properties 
78 value
%% globals
--]]
fibaro:debug(fibaro:getValue(78, "value"))
sen hoppar du lite framför sensorn och ser vilket resultat det blir
User avatar
Bamsefar
Z-Wave Kung
Posts: 1230
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

jompa68: Jag har ju en liknande lösning, men jag fick lite problem om man ständigt rörde sig framför sensorn. Det slutade med att jag tände när det var rörelse, och när jag fick noll i retur (ingen rörelse) så startade jag timern (och jag använder någon annan Virtuella Device med nedräkning). Av din kod ser det ut som om att samma läge kan uppstå, dvs om man ständigt rör sig framför sensorn (säg i ett kök...) så kommer lampan att släckas...?
Testar Home Assistant på Raspberry Pi4B - nice :mrgreen:
andarv
Medlem
Posts: 82
Joined: 15 Feb 2014, 00:17
10

Jompa68: ID39 och 78 är två likadana rörelsesensorer från Aeon, men 78 har strulat en del. Tvivlade dock på om man kunde skriva value2, men jag tolkar det som att det går bra att göra?
Får hem och felsöka sensor.
Egentligen tycker jag tyvärr att kvalitén på dem är ganska dålig, litar inte speciellt mycket på dem.

Bamsefar: Sensorerna sitter utomhus så att det är konstant aktivering är nog en mindre risk. Men om det blir problem i framtiden får jag försöka med din variant av VD. ID78 får ju frispel och rapporterar konstanta rörelser ibland...
emil.lofkvist
Ny medlem
Posts: 8
Joined: 03 Aug 2014, 15:22
9
Location: Helsingborg

Du råkar inte ha en liknande luakod som man kan använda till Vera? :)
Post Reply