Rörelse mellan 22 & 07

MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

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
Homecenter 2

Kameror, värme, larm och belysning från olika leverantörer
alexndr
Medlem
Posts: 420
Joined: 14 Jul 2016, 14:38
7

Gör ett försök själv och posta koden här så är vi flera som kan guida dig rätt om det inte fungerar.
MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

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...
Homecenter 2

Kameror, värme, larm och belysning från olika leverantörer
alexndr
Medlem
Posts: 420
Joined: 14 Jul 2016, 14:38
7

Gör om blockscenen till Lua och kolla koden.

Det finns flera guider på nätet för att börja med Lua och vi är som sagt flera som kan guida och förklara det du inte förstår.
MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

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
Homecenter 2

Kameror, värme, larm och belysning från olika leverantörer
alexndr
Medlem
Posts: 420
Joined: 14 Jul 2016, 14:38
7

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
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.

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).
MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

hmm, hajar inte hur jag ska få fram tiden.
Gör blockscen med alla dagar i veckan med en starttid kl 22, blir en himla lång rad.
Dock ingen sluttid....
Homecenter 2

Kameror, värme, larm och belysning från olika leverantörer
alexndr
Medlem
Posts: 420
Joined: 14 Jul 2016, 14:38
7

Med följande kan du få ut nuvarande timme som ett jämförbart tal.

Code: Select all

local currentDate = os.date("*t");
local currentHour = tonumber(currentDate.hour)
Med hjälp av variabeln som håller nuvarande timme kan du kompletera din if- sats.

Code: Select all

 if((( tonumber(fibaro:getValue(195, "value")) > 0) and (currentHour>=22 or currentHour<=7)) or startSource["type"] == "other") then  
.. se det som pseudokod, inte säker på att alla paranteser blev rätt där.
MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

Jag försöker & försöker men får inte ihop det....
Nån som pallar göra hela koden så jag kan se den & ta lärdom efter.

Tack
Homecenter 2

Kameror, värme, larm och belysning från olika leverantörer
alexndr
Medlem
Posts: 420
Joined: 14 Jul 2016, 14:38
7

Posta ditt senaste försök så kan jag ge input.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

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
alexndr
Medlem
Posts: 420
Joined: 14 Jul 2016, 14:38
7

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.
storskogen
Medlem
Posts: 28
Joined: 05 Apr 2014, 20:57
9

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

User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

OM du använde dig av GEA så skulle koden se ut så här.

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"]}})
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
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

...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")
MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

@jang.

Har provat den du postade för några dagar sedan.
Men den funkar inte.


Antar att jag bara ska byta ut ditt id mot mitt id ?
Homecenter 2

Kameror, värme, larm och belysning från olika leverantörer
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

MickeS wrote: 17 Mar 2019, 13:53 @jang.
Har provat den du postade för några dagar sedan.
Men den funkar inte.
Antar att jag bara ska byta ut ditt id mot mitt id ?
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.
MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

--[[
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

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.

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
MickeS
Medlem
Posts: 425
Joined: 12 Oct 2016, 07:53
7

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?
Homecenter 2

Kameror, värme, larm och belysning från olika leverantörer
Post Reply