RH_Dreambox wrote: ↑21 Nov 2019, 18:46
@jang Jag testar dina regler för motorvärmaren, men det är några saker som jag inte får kläm på.
1. Det första och kanske det viktigaste är att värmaren automatiskt måste stänga av sig efter utsatt avresetid (inklusive förseningstid). Mitt logiska tänkande är inte så bra när det gäller LUA, så jag begriper inte var jag lämpligast petar in en automatisk avstängning av värmaren.
2. I min gamla VD finns variabeln "turnOffDelay (satt till 15 min.)" och det är den så kallade förseningstiden. Skulle jag bli några minuter försenad så är bilen fortfarande varm en kvart efter min utsatta avresetid.
I ditt skript finns variabeln "runTime = 0", är det där jag ställer in min förseingstid?
3. Det vore guld värt om avresetiden också kunde visa vilken dag det gäller. Du visar dag och tid när värmaren startar, men det är mindre intressant. Det blir tydligare information om dag och avresetid visas. Total uppvärmningstid "runTime" är också intressant (men inte nödvändig).
Det var tänkt att värmaren skulle fungera så här:
a. Vid tryck på "Auto" skall värmaren automatiskt stänga av sig efter inställd avresetid inklusive förseningstid.
b. Vid tryck på "On" (Manuell styrning) stänger värmaren av sig efter den tid som konfigurerats i switchen (tex. 60 min.).
c. Vid tryck på "Off" (StandBy) skall värmaren stängas av (manuell avstängning).
d. Då villkoren för punkterna a eller b är uppfyllda, skall värmarens VD återställas till läget "Off" (StandBy).
Jag försöker själv att få till det här, men @jang, din programmering ligger på en betydligt högre nivå.
Vad betyder tex. "+= 24:00", är det ett villkor som måste vara positivt?
Och den här raden, multipliceras runTime med 60, eller hur skall jag tolka koden? Jag hittar inget i LUA-språket som ser ut så här.
runTime *= 60;
1. Jag har lagt till att den stänger av efter 15min om man har Auto
2. runTime är uppvärmningstiden.
3.a,c,d Fixat - 3.b Inte samma som förseningstiden? Är tiden avresetiden ?
A += 60 betyder A = A + 60. Konstruktionen finns i många programmeringsspråk, dock inte Lua.
Så startTime += 24:00 flyttar tiden till nästa dag,
runTime är i minuter så för att konvertera det till sekunder multipliceras det med 60
dvs. runTime *= 60;
Ny version
local BTNS = {"Travel","Hplus","Hminus","Mplus","Mminus","Temp","Status","Auto","On","Off","Heating","Tp","Tm"}
VD1,VD2=1071,1072 -- VD IDs
Users = {[VD1]={heater=712},[VD2]={heater=710}} -- deviceID for heaters
User1,User2=Users[VD1],Users[VD2]
AUTO_OFF = 15*60 -- Turn off 15min after auto has turned on heater
outsideTemp = 928
runTime = 0
for vd,u in pairs(Users) do -- Initialize VD at restart
u.vd=VDev.proxy(vd)
local a = u.vd.getValue("Travel"):match("(%d%d:%d%d)")
u.vd.setValue("Travel", a and a~="" and a or "07:00")
u.travel = toTime(u.vd.getValue("Travel"))
u.status = fibaro:getValue(u.heater,"value") == '0' and 'Av' or 'På'
Event.post({type='Update',user=u})
end
rule("#MV_VD{id='$id',value='$value'} => post({type=Users[id].vd.nameOf(value), user=Users[id],_sh=true})")
rule("#Hplus{user='$user'} => user.travel=(user.travel+01:00) % 24:00; post(#Update{user=user})")
rule("#Hminus{user='$user'} => user.travel=(user.travel-01:00) % 24:00; post(#Update{user=user})")
rule("#Mplus{user='$user'} => user.travel=(user.travel+00:01) % 24:00; post(#Update{user=user})")
rule("#Mminus{user='$user'} => user.travel=(user.travel-00:01) % 24:00; post(#Update{user=user})")
rule("#On{user='$user'} => user.heater:on") -- Turn on heater
rule("#Off{user='$user'} => user.heater:off") -- Turn off heater
rule("#Auto{user='$user'} & user.status == 'Av' => user.status = 'Auto'; post(#Update{user=user})")
rule([[#Update{user='$user'} =>
user.vd.setValue('Status',user.status); -- Update status
user.vd.setValue('Temp',outsideTemp:value); -- Update temp
user.timer=cancel(user.timer); -- Cancel ev. timer
user.timer2=cancel(user.timer2); -- Cancel ev. timer
local startTime = user.travel+midnight;
if startTime < ostime() then startTime += 24:00 end; -- Travel time passed, bump to next day
user.vd.setValue('Travel',osdate('%A %H:%M',startTime)); -- Update travel time in VD
local orgStart = startTime;
startTime -= runTime; -- Subtract heater time
if startTime < ostime() then startTime=ostime() end; .. If passed, set start time to now
if user.status == 'Auto' then -- If auto mode, start timer
log('Startar motorvärmare %s',osdate('%c',startTime));
user.timer = post(#On{user=user},startTime) -- Timer when heater should start
user.timer2 = post(#Off{user=user}, orgStart+AUTO_OFF) -- Timer for auto off
end;
user.vd.setValue('Heating',osdate('%H:%M',startTime)); -- Update heater time in VD
]])
rule("User1.heater:isOn => cancel(User1.timer); User1.status='På'; post(#Update{user=User1})")
rule("User1.heater:isOff => cancel(User1.timer); User1.status='Av'; post(#Update{user=User1})")
rule("User2.heater:isOn => cancel(User2.timer); User2.status='På'; post(#Update{user=User2})") -- remove if only one user
rule("User2.heater:isOff => cancel(User2.timer); User2.status='Av'; post(#Update{user=User2})") -- remove if only one user
rule([[outsideTemp:value => -- Outside temp changes, update user values
local outTemp = outsideTemp:value;
runTime = math.floor(60+100*outTemp/(outTemp-35));
if outTemp>10 then runTime=0 end;
runTime *= 60;
log('H:%s T:%s',runTime,outsideTemp);
post(#Update{user=User1});
post(#Update{user=User2}) -- remove if only one user
]]).start()