Sida 2 av 3
Re: Programmering i HC2 - borta från hemmet
Postat: 14 mar 2016, 10:31
av aftersun
Det hjälpte inte att vända på villkoren med tid före variabel.
Konverterar blockprogrammeringen till LUA;
Kod: Markera allt
--[[
%% properties
%% events
%% globals
Hemma_Borta
--]]
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( fibaro:getGlobalValue("Hemma_Borta") == "Borta" and ((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) == "14:13") )
)
then
fibaro:call(41, "turnOn");
end
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( fibaro:getGlobalValue("Hemma_Borta") == "Borta" and (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) )
or
startSource["type"] == "other"
)
then
fibaro:call(41, "turnOn");
end
end
Re: Programmering i HC2 - borta från hemmet
Postat: 14 mar 2016, 16:23
av supportM
Det ser lite lustigt ut i koden, specifikt if-satsen en bit ner:
Kod: Markera allt
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else
[...] -- massor av kod här
end
Det enda som triggar scenen i nuläget är när värdet på Hemma_Borta ändras, så scenen måste köras ofta för att trigga på tidpunkt. Man kan därmed skippa att ha Hemma_Borta som trigger.
Man kan t.ex. ha följande if-sats om man vill att den ska trigga varje dag mellan 18-24:
Kod: Markera allt
local currentDate = os.date("*t");
if ( currentDate.hour > 18 and currentDate.hour < 24) and Hemma_Borta == "Borta" then
fibaro:call(41, "turnOn");
end
Re: Programmering i HC2 - borta från hemmet
Postat: 14 mar 2016, 16:32
av aftersun
Med den sista koden du skrev så tar den hänsyn till både "Hemma_Borta" variabeln och tiden?
Isåfall är det helt rätt, men hur skulle koden se ut som fullständig?
Re: Programmering i HC2 - borta från hemmet
Postat: 15 mar 2016, 14:59
av supportM
Hm, enklast kanske är om du skapar en virtuell enhet (Virtual Device) och lägger koden i main-loopen för den (under Advanced). Du behöver inte göra några andra modifikationer på VDn. Main loopen körs hela tiden, därför läggar jag en delay på 60 minuter:
Kod: Markera allt
local currentDate = os.date("*t");
if ( currentDate.hour > 18 and currentDate.hour < 24) and Hemma_Borta == "Borta" then
fibaro:call(41, "turnOn");
end
delay = 3600 -- antal sekunder att vänta till nästa koll, i detta fall en timme
fibaro:sleep(delay*1000) -- väntar i antal millisekunder
Kan inte testa själv idag, men kolla om det gör vad du vill!
inuti if-satsen lägger du alla de lampor som ska slås på, vill du att de slås av/på lite då och då blir det lite annan kod.
Re: Programmering i HC2 - borta från hemmet
Postat: 15 mar 2016, 16:09
av aftersun
Jag ändrade triggern till 10 sekunder och satte tiden till 15 (se nedan) men det händer inget alls efter jag kört scenen som ställer mig i "Borta"-läge.
Re: Programmering i HC2 - borta från hemmet
Postat: 15 mar 2016, 17:06
av aftersun
Lyckades faktiskt konstatera att koden jag fick av dig inte var rätt
Nybörjare som man är så skapade jag en blockscen och omvandlade den till LUA för att ta reda på variabel-texten i LUA och då fungerade det att lägga in på virtual device.
Koden ska vara så här istället;
Kod: Markera allt
local currentDate = os.date("*t");
if ( currentDate.hour > 14 and currentDate.hour < 24 ) and
( fibaro:getGlobalValue("Hemma_Borta") == "Borta" ) then
fibaro:call(41, "turnOn");
end
delay = 10 -- antal sekunder att vänta till nästa koll, i detta fall en timme
fibaro:sleep(delay*1000) -- väntar i antal millisekunder
Re: Programmering i HC2 - borta från hemmet
Postat: 15 mar 2016, 17:50
av aftersun
Får dock inte rätt på det jag egentligen vill göra utan det var ju en testscen vi labbade med som nu funkar.
Jag vill att lampan tänds;
* mån, ons, fre och sön kl. 21:30 och stängs av efter sju timmar.
* tis, tors, lör 22:02 och stängs av efter sju timmar.
Hur skulle detta se ut? Får inte riktigt rätt på det.
Re: Programmering i HC2 - borta från hemmet
Postat: 16 mar 2016, 08:22
av aftersun
Har ev. lyckats få fram en liten lösning på det men vill höra lite vad ni tycker.
Kommit vidare i tankarna, vad tros om denna lösningen för att uppnå det jag vill?
Känns enklare på något vis.
Virtual device som ändrar borta eller hemma, och i main loop så kontrollerar den var 47:e minut om jag är;
1. borta
2. tiden är mellan 20-24
Stämmer det så kör den scen 81 med ett sätt på/stäng av schema (sju timmar). Liten fullösning kanske men funkar detta som jag tänkt? Initiala tester visar på det och visst det blir inte bestämda olika klockslag varje veckodag utan här blir det i regel lite random med tanke på att kontrollen körs var 47:e minut.
Virtual device:
Och scenen som tänder och släcker en lampa:

- scene2.png (20.21 KiB) Visad 15717 gånger
Re: Programmering i HC2 - borta från hemmet
Postat: 16 mar 2016, 14:33
av supportM
Jo så kan man göra
Om du skapar en blockscen med villkoren för dagar/tider du vill att scenen är aktiv så kan du se vad if-villkoret då blir.
Grejen är att när du vill basera på tid så måste skriptet köras ofta för att kolla om villkoret är uppfyllt. Vill du trigga på t.ex. Borta_Hemma så går det att ha den som trigger i en scen, men då körs den bara när värdet ändras.
Re: Programmering i HC2 - borta från hemmet
Postat: 16 mar 2016, 14:37
av aftersun
Jag behöver väl egentligen inte hänvisa till en annan scen här utan jag kan lägga in lampans tänd, delay, släck i VD också!?
En fråga till dock.
Eftersom den gör en kontroll var 47:e minut kommer scenen att startas flera gånger mellan intervallet 20:00 - 24:00. Kan jag undvika detta på något sätt? Det finns ju någon inställning med scener där man får välja hur många gånger dom ska köras men vet inte exakt vad den scenen innebär?!
Re: Programmering i HC2 - borta från hemmet
Postat: 16 mar 2016, 16:04
av supportM
Du kan endast påverka hur ofta scenen körs när den startas från VDns main loop. Men däremot kan du köra fibaro:abort() om något visst villkor inte är uppfyllt, så avbryts exekveringen. Exempelvis om Hemma_Borta är "hemma" eller om det är fel dag.
Re: Programmering i HC2 - borta från hemmet
Postat: 16 mar 2016, 16:13
av aftersun
Hm, kolla skriptet igen så hänger du med på vad jag menar
Om scenen triggas exempelvis 20:13 så kommer scenen triggas igen 47 minuter senare och igen 47 minuter senare o.s.v. fram tills klockan är förbi 24:00. Detta innebär ju att den sista triggade scenen före 24:00 kommer att löpa i sju timmar, inte den första som var tanken.
Har du något bra tips på hur jag kan lösa det vore det grymt!

Re: Programmering i HC2 - borta från hemmet
Postat: 17 mar 2016, 08:03
av supportM
Main loopen körs hela tiden. Sätter du ingen delay körs den flera gånger i sekunden. Det är ju lite onödigt, men t.ex. var 10:e minut är inga problem. Det Main loop gör är bara att kolla om villkoren stämmer och sen kan du baserat på det antingen göra anrop direkt därifrån eller via en separat scen, det är valfritt. Vill du att den släcker lampan när villkoret inte gäller kan du lägga till ett "else"-villkor till if-satsen men då kanske det är bättre att ha en nästlad if-sats:
Kod: Markera allt
-- kör om borta
if fibaro:getGlobalValue("Hemma_Borta") == "Borta" then
local currentDate = os.date("*t");
-- slå på mellan 14-24
if ( currentDate.hour > 14 and currentDate.hour < 24 ) then
fibaro:call(41, "turnOn");
else
-- slå av annars
fibaro:call(41, "turnOff");
end
delay = 600 -- antal sekunder att vänta till nästa koll
fibaro:sleep(delay*1000) -- väntar i antal millisekunder
end
Re: Programmering i HC2 - borta från hemmet
Postat: 17 mar 2016, 10:06
av aftersun
Bra kod, den är jag helt med på.
Men jag ville att lampan skulle vara tänd i sju timmar från första tillfället den tänds. Hur löser jag det? Det hade funkat om jag kan ändra din kod
Kod: Markera allt
if ( currentDate.hour > 20 and currentDate.hour < 24 ) then
till
Kod: Markera allt
if ( currentDate.hour > 20 and currentDate.hour < 03 ) then
Men detta funkar av någon anledning inte att ställa villkoret efter 24:00. Kanske ska vara "3" istället för "03"?
Annars hade det löst hela scenen.
Re: Programmering i HC2 - borta från hemmet
Postat: 17 mar 2016, 15:17
av supportM
Jaha!
Det går att lösa, men då får du dels lagra starttiden i en global variabel som du kollar nuvarande tiden mot, och då behöver du också kolla om lampan är tänd varje iteration. Det borde finnas någon bättre lösning, vet inte på rak arm.
Din if-sats säger i nuläget "Om klockan är mindre än tre men större än 20" vilket är en motsägelse.

Du kan byta ut "and" till "or" så kommer den reagera om klockan är mer än 20 eller mindre än tre. Nu när jag tänker efter är det ganska korkat att ha "currentDate.hour < 24" eftersom currentDate.hour aldrig är högre än 23. Men jag kan ju inte tänka rätt jämt
