Lua-hjälp önskas för larmfunktion

Hjälp varandra att vara kreativa för att göra hemmet mer bekvämt.
Post Reply
Rosengren
Medlem
Posts: 49
Joined: 01 Jan 2014, 13:27
10
Contact:

Jag har satt upp två "osmarta" rörelsedetektorer på mitt hemmakontor. Dessa har jag kopplat till en Fibaro Universal Sensor.
Ibland händer det dock att detektorerna reagerar på något ”osynligt” och i nuläget har jag endast en scen som skickar en pushnotis till mig vid rörelse så det är inte hela världen om det blir ett falsklarm.

Men i framtiden är tanken att detta ska utvecklas till att även trigga ett relä till en siren samt tända upp taklamporna via ett annat relä. Och nu blev det lite väl svårt för mig. Att göra detta via block funkar inte för mig... :(

Mitt önskemål är att få hjälp av er experter att göra en lua-scen som gör följande:
- Larmet ska endast triggas om båda sensorerna känner av rörelse inom fem sekunder.
- Därefter triggas relä 1 och sedan relä 2.
- En pushnotis ska skickas till min telefon.

Kan detta låta sig göras så hade jag varit otroligt tacksam. :D
Fibaro HC2 V. 4.580
20 x Dimmers
8 x 2x1,5kW Switch
3 x 3kW Switch
7 x RGBW
3 x MultiSensor
2 x MotionSensor
1 x FloodSensor
3 x AEON MultiSensor
1 x Swiid InterSwitch
2 x Greenwave 6-P. Switch
5 x Danfoss termostat
1 x Düwi ZME RC2
1 x Swipe
1 x Button
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Det finns många sätt att göra det på - här är ett (ganska minimalt) sätt.
Iden är att när en sensor triggas så startas scenen. Om det är bara en instans av scenen som triggats hittills så lägger den sig i en 5s vänte-loop. Vi antar att samma sensor inte kan triggas 2 ggr inom 5s.
Om en till sensor triggas och det redan finns en scen som kör så drar vi slutsatsen att det var max 5s sedan den förra triggades (eftersom den väntar 5s) - och vi startar larmet.
Någon annan scen eller logik behövs för att slå av alarmet/reläerna.

Code: Select all

--[[
%% properties
66 value
77 value
--]]

-- 66,77 är sensorerna. Returnera värde > 0 när de är triggade.
local delay = 5 -- 5 sekunder
local alarm1, alarm2 = 88,99 -- Reläer som ska slås på. Antar att de accepterar "turnOn" kommandon.

local st = fibaro:getSourceTrigger()

if st.type == 'property' then

  if fibaro:getValue(st.deviceID,"value") > "0" then
    if fibaro:countScenes() > 1 then -- redan en triggad sensor, slå på larm
      
      fibaro:call(alarm1,"turnOn")
      fibaro:call(alarm2,"turnOn")
      
    else
      fibaro:sleep(delay*1000) -- Vänta 5s efter sensor triggats
    end
  end

end
Bör kanske sätta "max instances" till > 4
Rosengren
Medlem
Posts: 49
Joined: 01 Jan 2014, 13:27
10
Contact:

Tusen tack, jang!
Jag har skapat en scen med din kod och den funkar kanon.
Om jag får lov att be dig om ytterligare en tjänst så skulle jag vilja att scenen endast är aktiv mellan kl. 22.00 och 06.00, veckans alla dagar.

Jag förstår givetvis om du har annat att göra om dagarna så det är helt okej om du inte vill, så klart! Oavsett så är jag innerligt tacksam för den hjälp som jag redan har fått. :)

Här har jag lagt in de rätta siffrorna på de inblandade komponenterna:

Code: Select all

--[[
%% autostart
%% properties
615 value
616 value
--]]

-- 615,616 är sensorerna. Returnera värde > 0 när de är triggade.
local delay = 5 -- 5 sekunder
local alarm1, alarm2 = 554, 553 -- Reläer som ska slås på. Antar att de accepterar "turnOn" kommandon.

local st = fibaro:getSourceTrigger()

if st.type == 'property' then

  if fibaro:getValue(st.deviceID,"value") > "0" then
    if fibaro:countScenes() > 1 then -- redan en triggad sensor, slå på larm
      
      fibaro:call(alarm1,"turnOn")
      fibaro:call(alarm2,"turnOn")
    else
      fibaro:sleep(delay*1000) -- Vänta 5s efter sensor triggats
    end
  end

end
Fibaro HC2 V. 4.580
20 x Dimmers
8 x 2x1,5kW Switch
3 x 3kW Switch
7 x RGBW
3 x MultiSensor
2 x MotionSensor
1 x FloodSensor
3 x AEON MultiSensor
1 x Swiid InterSwitch
2 x Greenwave 6-P. Switch
5 x Danfoss termostat
1 x Düwi ZME RC2
1 x Swipe
1 x Button
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Code: Select all

--[[
%% autostart
%% properties
615 value
616 value
--]]

-- 615,616 är sensorerna. Returnera värde > 0 när de är triggade.

local delay = 5 -- 5 sekunder
local alarm1, alarm2 = 554, 553 -- Reläer som ska slås på. Antar att de accepterar "turnOn" kommandon.

local time = os.date("%H:%M")
if not("22:00" <= time or time <= "06:00") then fibaro:abort() end -- Avbryt om inte 22:00 - 06:00

local st = fibaro:getSourceTrigger()

if st.type == 'property' then

  if fibaro:getValue(st.deviceID,"value") > "0" then
    if fibaro:countScenes() > 1 then -- redan en triggad sensor, slå på larm
      
      fibaro:call(alarm1,"turnOn")
      fibaro:call(alarm2,"turnOn")
    else
      fibaro:sleep(delay*1000) -- Vänta 5s efter sensor triggats
    end
  end

end
Lagt till tidstest.
Rosengren
Medlem
Posts: 49
Joined: 01 Jan 2014, 13:27
10
Contact:

Återigen - hjärtligt tack, jang!
Funkar perfekt.
Ska verkligen studera Lua, jag hoppas att jag är "bildbar". När man ser koden så ser den logisk ut, men ändå krånglig. :)
Ha en fin dag!
/Göran
Fibaro HC2 V. 4.580
20 x Dimmers
8 x 2x1,5kW Switch
3 x 3kW Switch
7 x RGBW
3 x MultiSensor
2 x MotionSensor
1 x FloodSensor
3 x AEON MultiSensor
1 x Swiid InterSwitch
2 x Greenwave 6-P. Switch
5 x Danfoss termostat
1 x Düwi ZME RC2
1 x Swipe
1 x Button
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Rosengren wrote: 28 Oct 2020, 09:31 Återigen - hjärtligt tack, jang!
Funkar perfekt.
Ska verkligen studera Lua, jag hoppas att jag är "bildbar". När man ser koden så ser den logisk ut, men ändå krånglig. :)
Ha en fin dag!
/Göran
Lua i sig är inte så krångligt (faktiskt en av de lättare programspråken enligt mitt eget tycke).
Problemet är lite den modell som Fibaro har valt för hur scener triggas.
Varje gång en scen triggas så skapas en ny instans av scenen (som om du startar upp flera kopior av ett program).
Vill man synkronisera något mellan de olika triggers som kommer in måste man oftast jonglera fibaro's globala variabler eftersom de kan skrivas och läsa mellan de olika instanserna.
På något sätt var deras modell enkel för enkla scener - men blev komplext för mer avancerade scener. (Jag tog fram mitt EventRunner så att man kunde ha regler som triggar på event i samma "instans" så att det var lätt att dela data/info/variabler mellan regler).

Nåväl, min lösning på ditt problem är ganska minimalt men också faktiskt lite "sofistikerat" eftersom det utnyttjar kunskapen att en sensor har triggat tidigare genom att se efter om det redan kör en instans av scenen.
Lua i all ära men man måste fundera en hel del på hur HC2:an exekverar sina scener för att komma upp med en sådan lösning - och jag har funderat många år... :D

Jag skapa EventRunner så att man lätt kan, eller åtminstone konsist, uttrycka det
Rule.eval("sensor1:breached & sensor2:breached & sensor1:last<=5 & sensor2:last<=5 & 22:00..06:00 => {alarm1,alarm2}:on")
Post Reply