Page 1 of 1

Blockscener som triggas av egen variabel

Posted: 11 Mar 2020, 16:55
by Hans_R
Hej,
Jag har försökt söka men utan framgång så här kommer min frågeställning om blockscener i Fibaro. Jag har en Fibaro HC2 och jag gjort några enkla blockscener för att styra belysning, en rörelsesensor etc och har även skapat en egen dag/natt-variabel som i all sin enkelhet styrs av fasta tider på dygnet. Detta funkar fint och nu har jag även skapat en hemma/borta-variabel som inledningsvis ska trigga en del belysningsscener. För detta så har jag köpt en ZRC-90 fjärrkontroll och en Telldus väggplugg och byggt två scener enligt nedan; en för att aktivera läge "home" och en för "away". När jag trycker på knapp 1 så aktiveras scenen för "home" och knapp 2 för "away". Det är inga problem att få fjärren att styra väggpluggen (jag ser att den sätts av respektive på) men problemet är att om jag t ex kl 1500 trycker på knapp 2 och away-scenen körs så släcks och tänds lampan i arbetsrummet trots att det inte ska ske förrän kl 2131 och 2145.

Jag tycker att jag testat med olika varianter (bytt plats på timer-blocket och home_away) etc men utan framgång. Några tips?

Scen för att aktivera "away"



Tack på förhand! //Hans

Re: Blockscener som triggas av egen variable

Posted: 13 Mar 2020, 19:50
by Hans_R
Jag verkar få det att fungera om jag har Away-scenen i läget "Automatic" men Home-scenen måste vara Manual för annars får jag felmeddelandet "to many instances" för mina scener som ska tända och släcka fönsterlampan när huset är i läge Away.

Snurrigt... antar att jag gjort något nybörjarfel någonstans...

Re: Blockscener som triggas av egen variable

Posted: 13 Mar 2020, 19:56
by Hans_R
Både home- och away-scenerna behöver nog stå i Manual så att de bara körs när jag trycker på knappen på fjärrkontrollen. Ska testa vidare med att lägga till några blockscener för home-läget också nu och se vad som händer... Hoppas vara något på spåren men det har jag trott förrut :)

Re: Blockscener som triggas av egen variable

Posted: 13 Mar 2020, 20:17
by Hans_R
Kommit fram till följande:

1. Om jag bara har away-scener aktiverade (automatic) för fönsterlampan så funkar de OM jag har kör automatic på Away-scenen OCH Manual på Home-scenen.
2. Om jag lägger till home-scener (dvs scener som ska tända och släcka fönsterlampan när Home är aktiverat) så funkar det inte med ovanstående inställningar. Om jag då istället ändrar Home-scenen till att, precis som Away-scenen, vara "automatic" så får jag felmeddelande på alla scener som ska tända och släcka fönsterlampan "too many instances".
3. Lägger jag till att scenerna kan köras >1 instance så släcks och tänds fönsterlampan så fort jag växlar mellan Home och Away.

Kan det vara någon inställning på min Telldus väggplugg? Att den saknar "template" hos Fibaro? Det jag tänker är ju att rent programmeringsmässigt så vill jag att scenerna som tänder och släcker fönsterlampan ska kontrollera om väggpluggen "IsOn" eller "IsOff"...

Re: Blockscener som triggas av egen variable

Posted: 13 Mar 2020, 20:34
by Hans_R
Testade att byta ut Telldus väggpluggen till en Fibaro med en inkopplad lampa så att jag kunde sätta en förbrukning i Watt som gräns för när Home- respektive Away-scenerna ska aktiveras. Verkar fungera exakt lika dåligt som i ovanstående exempel...

Re: Blockscener som triggas av egen variable

Posted: 13 Mar 2020, 21:27
by Hans_R
Det ska väl inte vara så att man behöver använda två väggpluggar, en för Away och en för Home? Dvs att den ena sätts PÅ när det är Away och den andra sätts PÅ när de är Home? Skulle iofs kunna ta en från en annan fönsterlampa och testa.

Re: Blockscener som triggas av egen variabel - nu med LUA-koden

Posted: 13 Mar 2020, 22:21
by Hans_R
Inkluderar LUA-koden för de sex scenerna nu, kanske kan ge någon idé?

Code: Select all

Away
--[[
%% autostart
%% properties
174 value
%% weather
%% events
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(174, "value")) == 0 )
or
startSource["type"] == "other"
)
then
	fibaro:setGlobal("Home_Away", "Away");
end


Home
--[[
%% autostart
%% properties
174 value
%% weather
%% events
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(174, "value")) > 0 )
or
startSource["type"] == "other"
)
then
	fibaro:setGlobal("Home_Away", "Home");
end


Tända lampa - HOME
--[[
%% autostart
%% properties
%% weather
%% events
%% globals
Home_Away
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "19:03")  and  fibaro:getGlobalValue("Home_Away") == "Home" )
)
then
	fibaro:call(114, "turnOn");
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)  and  fibaro:getGlobalValue("Home_Away") == "Home" )
or
startSource["type"] == "other"
)
then
	fibaro:call(114, "turnOn");
end

end

Släcka lampa - HOME
--[[
%% autostart
%% properties
%% weather
%% events
%% globals
Home_Away
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "19:01")  and  fibaro:getGlobalValue("Home_Away") == "Home" )
)
then
	fibaro:call(114, "turnOff");
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)  and  fibaro:getGlobalValue("Home_Away") == "Home" )
or
startSource["type"] == "other"
)
then
	fibaro:call(114, "turnOff");
end

end

Tända lampa - AWAY
--[[
%% autostart
%% properties
%% weather
%% events
%% globals
Home_Away
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "18:39")  and  fibaro:getGlobalValue("Home_Away") == "Away" )
)
then
	fibaro:call(114, "turnOn");
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)  and  fibaro:getGlobalValue("Home_Away") == "Away" )
or
startSource["type"] == "other"
)
then
	fibaro:call(114, "turnOn");
end

end


Släcka lampa - AWAY
--[[
%% autostart
%% properties
%% weather
%% events
%% globals
Home_Away
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "18:53")  and  fibaro:getGlobalValue("Home_Away") == "Away" )
)
then
	fibaro:call(114, "turnOff");
end

setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)  and  fibaro:getGlobalValue("Home_Away") == "Away" )
or
startSource["type"] == "other"
)
then
	fibaro:call(114, "turnOff");
end

end





Re: Blockscener som triggas av egen variabel

Posted: 21 Mar 2020, 01:40
by Hans_R
Inga förslag och idéer?

Re: Blockscener som triggas av egen variabel

Posted: 21 Mar 2020, 13:01
by jang
Hans_R wrote: 21 Mar 2020, 01:40 Inga förslag och idéer?
Det blir lätt väldigt "komplicerad" Lua kod av att konvertera blockscener till Lua. Jag skulle föreslå att du. tittar på den här scenen.
Du gör all din logik inne i 'clock' funktionen.
Jag har lagt 2 tester här som jag tror att du försökte göra (tända lampan 21:31 och släcka 21:45 om Home_Away=Away ?
Men det går att göra fler tester.
Du får tider som strängar så du kan göra tester som
if time > "07:00" and time < "09:00" then ...
eftersom man kan jämföra strängar och tider råkar sortera rätt....

Jag tror också att du skulle kunna trigga direkt på din keypad/remote istället för att gå via en switch...
Om du börjar titta på Lua så finns det många "scheduler" scener som hjälper till att göra rätt sak på rätt tid.
EventRunner3 som jag kodar är en sådan och det finns en tråd i forumet om den

Code: Select all

--[[
%% autostart
%% properties
174 value
%% weather
%% events
%% globals
Home_Away
%% autostart
--]]

sourceTrigger  = fibaro:getSourceTrigger()

if sourceTrigger.type=='property' then   -- Set global when 174 is turned on/off and then exits
  if tonumber(fibaro:getValue(174, "value")) == 0 then
    fibaro:setGlobal("Home_Away", "Away");
  else
    fibaro:setGlobal("Home_Away", "Home");
  end
  fibaro:abort()
end

dayMap={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}

-- time is the current time as a string, ex. "17:42"
-- sunset is todays sunset time as a string ex. "21:33"
-- sunrise is todays sunrise time as a string ex. "06:35"
-- day is name of day ex. "Monday"
-- weekend is true if it's weekend (Saturday,Sunday)
-- The function 'clock' is called every minute, make your tests and actions accordingly
function clock(time,sunset,sunrise,day,weekend) -- called every minute, on the minute

  if time=="21:31" and fibaro:getGlobal("Home_Away")=="Away" then
    fibaro:call(114,"turnOn")
  end

  if time=="21:45" and fibaro:getGlobal("Home_Away")=="Away" then
    fibaro:call(114,"turnOff")
  end
  
end

--------- Helper functions, don't touch----------------

do
  tonumber,oldTonumber=function(str) 
    local h,m,s=str:match("(%d%d):(%d%d):?(%d*)")
    return h and m and h*3600+m*60+(s~="" and s or 0) or oldTonumber(str)
  end,tonumber

  local nextI = 0
  function runner()
    local d = os.date("*t").wday
    clock(os.date("%H:%M"),fibaro:getValue(1,"sunriseHour"),fibaro:getValue(1,"sunsetHour"),dayMap[d],d==1 or d==7)
    nextI=nextI+60
    setTimeout(runner,1000*(nextI-os.time()))
  end
  local t = os.date("*t") t.sec=0 
  nextI = os.time(t)+60
  setTimeout(runner,1000*(nextI-os.time()))
end


Re: Blockscener som triggas av egen variabel

Posted: 21 Mar 2020, 21:57
by Hans_R
Tack för hjälpen! Testade din kod och skapade samtidigt en kopia fast för Home-läget men får felkoden ”too many instances” på de båda scenerna. Då testade jag först med att ha 1 tillåten och sedan också 2 tillåtna ”instances”.

Jag fick ditt tips om Eventrunner i en annan tråd och laddade faktiskt ner ”grundkoden” (kalla den så?) och testade att köra den. Det verkade fungera men jag kunde inte kontrollera det så jag inte förstod var jag skulle hitta att den här texten/koden skulle skriva med ett fem (?) sekunders intervall.

Re: Blockscener som triggas av egen variabel

Posted: 21 Mar 2020, 22:21
by jang
Hans_R wrote: 21 Mar 2020, 21:57 Tack för hjälpen! Testade din kod och skapade samtidigt en kopia fast för Home-läget men får felkoden ”too many instances” på de båda scenerna. Då testade jag först med att ha 1 tillåten och sedan också 2 tillåtna ”instances”.

Jag fick ditt tips om Eventrunner i en annan tråd och laddade faktiskt ner ”grundkoden” (kalla den så?) och testade att köra den. Det verkade fungera men jag kunde inte kontrollera det så jag inte förstod var jag skulle hitta att den här texten/koden skulle skriva med ett fem (?) sekunders intervall.
Du kan sätta "Max running instances:" till 10 (fliken före 'advanced' där man skriver kod) så kanske det fungerar bättre

Om du vill testa EventRunner så ersätt

Code: Select all

[--
...
--]]
...
function main() 
   --- 
end 
i början med nedan

Code: Select all

--[[
%% autostart
%% properties
174 value
%% weather
%% events
%% globals
Home_Away
--]]
local _version,_fix = "3.0","B88"  -- Feb 3, 2020  

local _sceneName   = "Hans hemmaautomatik"    -- Set to scene/script name
_debugFlags = {  triggers=true, fcall=true }

---------- Main ------------ Here goes your rules ----------------
function main()
  local rule = Rule.eval

  local HT =   {                    -- Define your devices
    lampa = 114,
    kontakt = 174
  }

  Util.defvars(HT)                -- Make HomeTable variables available in EventScript
  Util.reverseMapDef(HT)     -- Make HomeTable variable names available for logger

  rule("kontakt:isOff => $Home_Away='Away' ")
  rule("kontakt:isOn => $Home_Away='Home' ")
    
  rule("@21:31 & $Home_Away=='Away' => lampa:on")
  rule("@21:45 & $Home_Away=='Away' => lampa:off")
    
end