Jag skulle behöva hjälp med att någon gör en scen där en Fibaro motionsensor tänder en lampa mellan 22 & 07.
Och att den även släcks om inte rörelse efter 5 minuter detekterats.
Såg att Jompa gjort en för 4 år sen.
Kanske nån som har en ny?
Tack
Rörelse mellan 22 & 07
Kan inte lua....
Gjorde en blockscen att mellan den tiden ska en annan scen starta.
Men det blev kaka på kaka...scener som startas scener. Fick inte heller med en sluttid.
Det är just tiden som ställer till det.
En blockscen med att starta på rörelse, utan tider är knga problem.
Är just tiderna...
Gjorde en blockscen att mellan den tiden ska en annan scen starta.
Men det blev kaka på kaka...scener som startas scener. Fick inte heller med en sluttid.
Det är just tiden som ställer till det.
En blockscen med att starta på rörelse, utan tider är knga problem.
Är just tiderna...
Homecenter 2
Kameror, värme, larm och belysning från olika leverantörer
Kameror, värme, larm och belysning från olika leverantörer
så här ser scenen ut så långt min kunskap kan.
Men vad jag vill uppnå är att sensorn ska tända belysningen mellan 22-07,
och den ska vara tänd i 5 minuter, därefter ska det släckas.
--[[
%% autostart
%% properties
195 value
%% weather
%% events
%% globals
--]]
local startSource = fibaro:getSourceTrigger();
if (
( tonumber(fibaro:getValue(195, "value")) > 0 )
or
startSource["type"] == "other"
)
then
fibaro:call(202, "setValue", "20");
fibaro:call(93, "setValue", "20");
end
Men vad jag vill uppnå är att sensorn ska tända belysningen mellan 22-07,
och den ska vara tänd i 5 minuter, därefter ska det släckas.
--[[
%% autostart
%% properties
195 value
%% weather
%% events
%% globals
--]]
local startSource = fibaro:getSourceTrigger();
if (
( tonumber(fibaro:getValue(195, "value")) > 0 )
or
startSource["type"] == "other"
)
then
fibaro:call(202, "setValue", "20");
fibaro:call(93, "setValue", "20");
end
Homecenter 2
Kameror, värme, larm och belysning från olika leverantörer
Kameror, värme, larm och belysning från olika leverantörer
Så det första du borde försöka få till är att kolla om klockan är mellan 22-07. Testa att göra en blockscen för just den biten och omvandla till Lua så kommer du se hur man skriver den koden. Därefter kombinerar du in den biten i den här koden.MickeS wrote: ↑22 Feb 2019, 20:24 så här ser scenen ut så långt min kunskap kan.
Men vad jag vill uppnå är att sensorn ska tända belysningen mellan 22-07,
och den ska vara tänd i 5 minuter, därefter ska det släckas.
--[[
%% autostart
%% properties
195 value
%% weather
%% events
%% globals
--]]
local startSource = fibaro:getSourceTrigger();
if (
( tonumber(fibaro:getValue(195, "value")) > 0 )
or
startSource["type"] == "other"
)
then
fibaro:call(202, "setValue", "20");
fibaro:call(93, "setValue", "20");
end
Att vänta och därefter släcka efter 5 minuter är ganska enkelt att få till. Kolla på fibaro:sleep() eller ännu hellre setTimeout() för hur man gör för att vänta en viss period av tid innan koden fortsätter köra.
Några kommentarer så du kan förstå koden ovan:
"195 value" i "huvudet" innebär att scenen kommer triggas varje gång enheten med id 195 ändrar värde. Är det en PIR kommer den anropas 2 ggr vid varje aktivering. 1 gång när sensorn får värde 1 och en gång näre sensorn åter får värde 0.
Det här blocket:
"if (
( tonumber(fibaro:getValue(195, "value")) > 0 )
or
startSource["type"] == "other"
)"
är till för att du skall kunna starta scenen manuellt med startknappen också (startSource i det fallet är "other". Då kollas inte värdet på din enhet med id 195).
Med följande kan du få ut nuvarande timme som ett jämförbart tal.
Med hjälp av variabeln som håller nuvarande timme kan du kompletera din if- sats.
.. se det som pseudokod, inte säker på att alla paranteser blev rätt där.
Code: Select all
local currentDate = os.date("*t");
local currentHour = tonumber(currentDate.hour)
Code: Select all
if((( tonumber(fibaro:getValue(195, "value")) > 0) and (currentHour>=22 or currentHour<=7)) or startSource["type"] == "other") then
Code: Select all
--[[
%% properties
88 value
%% events
%% globals
--]]
local sensor = 88
local lamp = 77
local countDown = 5*60 -- turn off lamp after sensor safe for 5min
if fibaro:countScenes() > 1 then fibaro:abort() end -- only run one instance
local time = os.date("%H:%M")
-- Right time? else exit
if not (time >= "22:00" or time <= "07:00") then fibaro:abort() end
local trigger = fibaro:getSourceTrigger()
if trigger.type=='property' then -- only one trigger so it must be our sensor
if fibaro:getValue(sensor,"value") > "0" then -- if breached
fibaro:call(lamp,"turnOn") -- turn on lamp
local seconds = countDown -- initialise count down to seconds we will wait
repeat
if fibaro:getValue(sensor,"value") == "0" then -- if sensor safe, count down seconds
seconds = seconds-1
else
seconds = countDown -- else reset count down
end
fibaro:sleep(1000) -- sleep 1 second
until seconds <= 0 -- until safe for time specified
fibaro:call(lamp,"turnOff") -- ...then turn off lamp
end
end
Vad blir resultatet ?
Det är lite lurigt att jämföra strängar med > och < operatorerna eftersom de jämför alfabetisk ordning men det bör fungera i ditt fall.
Tyvärr erbjuder Fibaro inga verktyg för att stega igenom koden för att förstå var logiken går fel. Det enda medel man har egentligen är fibaro:debug(). Med den funktionen kan du skriva ut ett litet meddelande som visas i rutan under koden när den körs. På så sätt kan man se vad som händer.
Det är lite lurigt att jämföra strängar med > och < operatorerna eftersom de jämför alfabetisk ordning men det bör fungera i ditt fall.
Tyvärr erbjuder Fibaro inga verktyg för att stega igenom koden för att förstå var logiken går fel. Det enda medel man har egentligen är fibaro:debug(). Med den funktionen kan du skriva ut ett litet meddelande som visas i rutan under koden när den körs. På så sätt kan man se vad som händer.
-
- Medlem
- Posts: 28
- Joined: 05 Apr 2014, 20:57
- 10
Jag gjorde en scen som gör så att lamporna på toaletten inte lyser med full effekt mellan klockan tolv och sex på morgonen. Den andra scenen stänger av kaffebryggaren efter en viss tid. Du kanske kan använda något från dom? Tyvärr så kommer kaffebryggarscriptet att alltid stänga av efter inställd tid, det blir ju lite jobbigt om lampan ska lysa längre under andra tider? Jag är tyvärr upptagen med annat så jag kan inte göra "rätt" scen åt dig.
Code: Select all
--[[
%% properties
14 value
%% globals
--]]
--[[
A scene to check what time it is and set dimmer module (Line 3 is the ID of the module)
to max 10% between 00:00 and 06:00 and other time to max 90%
Change line 15 to what time and line 20 and 24 to the dim.value (%)
--]]
local currentDate = os.date("*t");
if (
(tonumber(currentDate.hour) > 0 or tonumber(currentDate.hour) < 6)
and
( tonumber(fibaro:getValue(14, "value")) > 10 )
)
then
fibaro:call(14, "setValue", "10");
fibaro:debug("Dimmer max 10%");
else
fibaro:call(14, "setValue", "90");
fibaro:debug("Dimmer 90%");
end
Code: Select all
--[[
%% properties
16 value
%% weather
%% events
%% globals
--]]
local startSource = fibaro:getSourceTrigger();
if(startSource["type"] == "other") then
fibaro:call(16, "turnOff");
else
if (( tonumber(fibaro:getValue(16, "value")) > 0 )) then
setTimeout(function()
local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(16, "value");
if (( tonumber(fibaro:getValue(16, "value")) > 0 ) and (os.time() - deviceLastModification0) >= 9000) then
delayedCheck0 = true;
end
local startSource = fibaro:getSourceTrigger();
if (
( delayedCheck0 == true )
or
startSource["type"] == "other"
)
then
fibaro:call(16, "turnOff");
end
end, 9000000)
end
end
OM du använde dig av GEA så skulle koden se ut så här.
Denna kod tänder lampan om det är rörelse mellan 22:00-07:00 och släcker efter 5 minuter om det inte är rörelse
Code: Select all
GEA.add({SENSORS["Wc"],{"Time", "22:00", "07:00"}}, -1, "", {"Value", Wc["Tak"], 99})
GEA.add(SENSORS["Wc"], 5*60, "", {{"Inverse"}, {"turnOff", Wc["Tak"]}})
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
Fw 4.600
BeyondMeasure 1.10
EventRunner
...och med EventRules blir det
Code: Select all
rule("wc.sensor:breached & 22:00..07:00 => wc.tak:on")
rule("for(00:05,wc.sensor:safe) => wc.tak:off")
Ja, vilka id har du?
I scene-headern måste du lägga till id på sensorn
--[[
%% properties
<id på din sensor> value
--]]
och sedan sätta variabeln för 'sensor' till samma, och variabeln för 'lamp' till lampans id.
Om du inte får det att fungera, posta hela scenen så jag kan se hur den ser ut.
--[[
2
%% properties
3
88 value
4
%% events
5
%% globals
6
--]]
7
8
local sensor = 195
9
local lamp = 62
10
local countDown = 5*60 -- turn off lamp after sensor safe for 5min
11
12
if fibaro:countScenes() > 1 then fibaro:abort() end -- only run one instance
13
14
local time = os.date("%H:%M")
15
-- Right time? else exit
16
if not (time >= "22:00" or time <= "07:00") then fibaro:abort() end
17
18
local trigger = fibaro:getSourceTrigger()
19
20
if trigger.type=='property' then -- only one trigger so it must be our sensor
21
if fibaro:getValue(sensor,"value") > "0" then -- if breached
22
fibaro:call(lamp,"turnOn") -- turn on lamp
23
local seconds = countDown -- initialise count down to seconds we will wait
24
repeat
25
if fibaro:getValue(sensor,"value") == "0" then -- if sensor safe, count down seconds
26
seconds = seconds-1
27
else
28
seconds = countDown -- else reset count down
29
end
30
fibaro:sleep(1000) -- sleep 1 second
31
until seconds <= 0 -- until safe for time specified
32
fibaro:call(lamp,"turnOff") -- ...then turn off lamp
33
end
34
end
2
%% properties
3
88 value
4
%% events
5
%% globals
6
--]]
7
8
local sensor = 195
9
local lamp = 62
10
local countDown = 5*60 -- turn off lamp after sensor safe for 5min
11
12
if fibaro:countScenes() > 1 then fibaro:abort() end -- only run one instance
13
14
local time = os.date("%H:%M")
15
-- Right time? else exit
16
if not (time >= "22:00" or time <= "07:00") then fibaro:abort() end
17
18
local trigger = fibaro:getSourceTrigger()
19
20
if trigger.type=='property' then -- only one trigger so it must be our sensor
21
if fibaro:getValue(sensor,"value") > "0" then -- if breached
22
fibaro:call(lamp,"turnOn") -- turn on lamp
23
local seconds = countDown -- initialise count down to seconds we will wait
24
repeat
25
if fibaro:getValue(sensor,"value") == "0" then -- if sensor safe, count down seconds
26
seconds = seconds-1
27
else
28
seconds = countDown -- else reset count down
29
end
30
fibaro:sleep(1000) -- sleep 1 second
31
until seconds <= 0 -- until safe for time specified
32
fibaro:call(lamp,"turnOff") -- ...then turn off lamp
33
end
34
end
Homecenter 2
Kameror, värme, larm och belysning från olika leverantörer
Kameror, värme, larm och belysning från olika leverantörer
Du behöver lägga in 195 i headern på scenen under '%% properties' som jag gjort i scenen nedan. Annars anropas inte scenen av HC2:an när sensorn ändrar värde.
Jag har också lagt in några debug rader så att det framgår vad som händer.
Jag skulle rekommendera att du testar den med att sätta "local countDown = 1*60" dvs 1 minut, och kommentera bort raden "if not (time >= "22:00" or time <= "07:00") then fibaro:abort() end " så att den körs oavsett tid. Då kan du springa förbi din sensor och se att lampan tänds, och sedan släcks en minut senare. Funkar det så gå tillbaka till originalet.
Jag har också lagt in några debug rader så att det framgår vad som händer.
Jag skulle rekommendera att du testar den med att sätta "local countDown = 1*60" dvs 1 minut, och kommentera bort raden "if not (time >= "22:00" or time <= "07:00") then fibaro:abort() end " så att den körs oavsett tid. Då kan du springa förbi din sensor och se att lampan tänds, och sedan släcks en minut senare. Funkar det så gå tillbaka till originalet.
Code: Select all
--[[
%% properties
195 value
%% events
%% globals
--]]
if dofile and not _EMULATED then _EMBEDDED={name="TTT",id=20} dofile("HC2.lua") end
local sensor = 195
local lamp = 62
local countDown = 5*60 -- turn off lamp after sensor safe for 5min
function printf(...) fibaro:debug(string.format(...)) end
if fibaro:countScenes() > 1 then fibaro:abort() end -- only run one instance
local time = os.date("%H:%M")
-- Right time? else exit
if not (time >= "22:00" or time <= "07:00") then fibaro:abort() end
local trigger = fibaro:getSourceTrigger()
if trigger.type=='property' then -- only one trigger so it must be our sensor
local flag = true
if fibaro:getValue(sensor,"value") > "0" then -- if breached
printf("Sensor %s breached, turning on lamp %s",sensor,lamp)
fibaro:call(lamp,"turnOn") -- turn on lamp
local seconds = countDown -- initialise count down to seconds we will wait
repeat
if fibaro:getValue(sensor,"value") == "0" then -- if sensor safe, count down seconds
if flag then printf("Sensor %s safe, counting down",sensor); flag = false end
seconds = seconds-1
else
printf("Sensor %s breached, resetting counter to %ss",sensor,countDown); flag = true
seconds = countDown -- else reset count down
end
fibaro:sleep(1000) -- sleep 1 second
until seconds <= 0 -- until safe for time specified
printf("Sensor safe for %ss, turning off lamp %s",sensor,lamp)
fibaro:call(lamp,"turnOff") -- ...then turn off lamp
end
end
funkar riktigt bra.
Tack som fan,
men nu e ju mina barn lite kräsna så dom vill inte ha 100% när dom yrar runt mitt i natten, så det skulle va nice & ändra värdet på ljusstyrkan.
Försökte pilla på rad 28, "TurnOn"
ändrade det till " setvalue20", men så enkelt var det inte?
Tack som fan,
men nu e ju mina barn lite kräsna så dom vill inte ha 100% när dom yrar runt mitt i natten, så det skulle va nice & ändra värdet på ljusstyrkan.
Försökte pilla på rad 28, "TurnOn"
ändrade det till " setvalue20", men så enkelt var det inte?
Homecenter 2
Kameror, värme, larm och belysning från olika leverantörer
Kameror, värme, larm och belysning från olika leverantörer