Programmering i HC2 - borta från hemmet

Diskussioner runt hur den tänkta funktionaliteten nås
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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
Användarvisningsbild
supportM
Moderator
Inlägg: 1010
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping
Kontakt:

Re: Programmering i HC2 - borta från hemmet

Inlägg 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
// Officiellt supportkonto för m.nu
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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?
Användarvisningsbild
supportM
Moderator
Inlägg: 1010
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping
Kontakt:

Re: Programmering i HC2 - borta från hemmet

Inlägg 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.
// Officiellt supportkonto för m.nu
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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.
vd.png
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg av aftersun »

Lyckades faktiskt konstatera att koden jag fick av dig inte var rätt :D
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
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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.
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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:
1.png
2.png
3.png
Och scenen som tänder och släcker en lampa:
scene2.png
scene2.png (20.21 KiB) Visad 15703 gånger
Användarvisningsbild
supportM
Moderator
Inlägg: 1010
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping
Kontakt:

Re: Programmering i HC2 - borta från hemmet

Inlägg 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.
// Officiellt supportkonto för m.nu
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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?!
Användarvisningsbild
supportM
Moderator
Inlägg: 1010
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping
Kontakt:

Re: Programmering i HC2 - borta från hemmet

Inlägg 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.
// Officiellt supportkonto för m.nu
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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! :shock:
Användarvisningsbild
supportM
Moderator
Inlägg: 1010
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping
Kontakt:

Re: Programmering i HC2 - borta från hemmet

Inlägg 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

// Officiellt supportkonto för m.nu
aftersun
Wannabe
Inlägg: 23
Blev medlem: 09 mar 2016, 17:46
Ort: Malmö

Re: Programmering i HC2 - borta från hemmet

Inlägg 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"? :shock:
Annars hade det löst hela scenen.
Användarvisningsbild
supportM
Moderator
Inlägg: 1010
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping
Kontakt:

Re: Programmering i HC2 - borta från hemmet

Inlägg 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 :P
// Officiellt supportkonto för m.nu
Skriv svar