RH_Dreambox wrote: ↑24 Nov 2019, 11:52
@jang Här är koden för mina värmare. I din förra version fick jag samma fel, men det åtgärdade jag med ett semikolon (se röd rad nedan).
Förseningstiden är OK som den är. Din variabel AUTO_OFF kan jag ändra vid behov, men oftast ställer man den bara en gång.
Du nämnde att du inte hade någon tempgivare, men kan du inte använda Fibaros väder-temp, som har ID 3 för dina tester EDIT: Kollade nu men det verkar inte funka.
-- START CARHEATER RH/YH ######################################
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()
-- SLUT CARHEATER RH/YH ######################################
EDIT:
Koden ovan är rättad och fungerar nu.