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
Blockscener som triggas av egen variabel
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...
Snurrigt... antar att jag gjort något nybörjarfel någonstans...
//Hans
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
//Hans
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"...
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"...
//Hans
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...
//Hans
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.
//Hans
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
//Hans
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
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.
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.
//Hans
Du kan sätta "Max running instances:" till 10 (fliken före 'advanced' där man skriver kod) så kanske det fungerar bättreHans_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.
Om du vill testa EventRunner så ersätt
Code: Select all
[--
...
--]]
...
function main()
---
end
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