EventRunner

User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

20 Nov 2019, 11:45

@jang Nu hittade jag orsaken till den sega motorvärmar-VD'n, och det var mitt fel.
Jag hade aktiverat en rad som skulle fördröja start av ER i händelse av strömavbrott så att routern hann starta före ER.

Code: Select all

-- FÖRDRÖJ ER-START VID STRÖMAVBROTT ########################
if not _EMULATED then fibaro:sleep(10*1000) end
Denna rad hade jag lagt som rad 2 under header-raderna, och den orsakade 10 sek. fördröjning.
Jag vet att du tidigare har nämnt att man inte får ha någon sleep i ER, men kanske hade jag lagt raden på fel ställe :oops:

Efter att jag inaktiverat raden så blev responsen betydligt kvickare, så nu kan testerna fortsätta och gumman blir på bättre humör :D
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

20 Nov 2019, 15:46

En variant att fördröja uppstarten av scenen är att inte sätta %% autostart på ER och istället ha en vanlig scen med %% autostart som gör fibaro:sleep och sedan startar ER scenen med fibaro:startScene
/J
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

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;
2 st HC2 4.560 - EventRunner 3
sonnyboy
Proffsmedlem
Posts: 649
Joined: 26 Sep 2013, 08:05
Location: Västerås

22 Nov 2019, 14:21

Kommer denna regel fungera eller behöver jag ha 2 "lika med tecken" och "enelfnuttar" på true?

Code: Select all

rule("@22:00 & $WorkTomorrow = True => for _,id in ipairs(deviceIDs ) do post(#turnOff{id=id},os.time()+rnd(00:20)) end") 
Kan inte testa koden just nu så jag frågar här :)

Trevlig helg alla!
Fibaro HomeCenter 2
Fw 4.561 Beta
BeyondMeasure 1.10
EventRunner
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

22 Nov 2019, 22:18

sonnyboy wrote:
22 Nov 2019, 14:21
Kommer denna regel fungera eller behöver jag ha 2 "lika med tecken" och "enelfnuttar" på true?

Code: Select all

rule("@22:00 & $WorkTomorrow = True => for _,id in ipairs(deviceIDs ) do post(#turnOff{id=id},os.time()+rnd(00:20)) end") 
Kan inte testa koden just nu så jag frågar här :)

Trevlig helg alla!
Jämförelse är '=='.
Om texten i en fibaro global är True,TRUE,tre,False,FALSE,false så översätts de automatiskt till Lua's boolean värden.

Code: Select all

rule("@22:00 & $WorkTomorrow == true => for _,id in ipairs(deviceIDs ) do post(#turnOff{id=id},os.time()+rnd(00:20)) end")
eller bara

Code: Select all

rule("@22:00 & $WorkTomorrow  => for _,id in ipairs(deviceIDs ) do post(#turnOff{id=id},os.time()+rnd(00:20)) end")
Den funkar alltså inte med att jämföra med texten 'True' eftersom $WorkTomorrow kommer att returnera en boolean.
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

23 Nov 2019, 08:48

Apropå globala variabler och ER.
Fibaros globala variabler kan bara lagra strängar. Därför gör ER en del automatiska konverteringar när man hämtar och lagrar värden i fibaro globala variabler. Ex. true/false som i föregående post.

Code: Select all

rule("$myVar = true; if $myVar then log('True') end")
Det gäller även för tal. Om strängen ser ut som ett tal kommer ER att returnera ett tal. Dvs. inget tonumber() behövs.

Code: Select all

rule("$myVar = 42; log($myVar+3)")
Om det ser ut som en tid, ex. 10:00, eller 19:15:10, eller sunset så konverteras det till en tid

Code: Select all

fibaro:setGlobal('myVar','sunset')
rule("$myVar+00:10 => log('OK')")
och slutligen, tabeller konverteras automatisk med json.decode/json.encode när de lagras i globala.

Code: Select all

rule("$myVar = {a=3, b= 5}")
rule("a = $myVar; log(a.a)")
--or
rule("log($myVar.a)")
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

23 Nov 2019, 09:21

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()
Last edited by jang on 23 Nov 2019, 15:48, edited 2 times in total.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

23 Nov 2019, 14:03

@jang den nya koden vill sig inte.
Först fick jag ett felmeddelande om user någonting. När jag lade till ett semikolon i slutet på raden "user.timer = post(#On{user=user},startTime)" så startade ER-scenen.
Men "Util.defTriggerVar("outsideTemp",0)" gör ju att det alltid är 0 grader oavsett vad tempgivaren 928 visar.
Inaktiverar jag den raden så får jag ett annat felmeddelande, så det är något som inte stämmer.

Jag körde också en test med den raden aktiv (0 grader = 60 min) och värmaren gick igång på utsatt tid.
Men den stängde inte av sig efter 75 min (60 + 15 min) som det var tänkt.
Kan det ha med raden Util.defTrigger att göra?

-- START CARHEATER RH/YH ######################################
local BTNS = {"Travel","Hplus","Hminus","Mplus","Mminus","Temp","Status","Auto","On","Off","Heating","Tp","Tm"}
VD1,VD2=1071,1072
Users = {[VD1]={heater=712},[VD2]={heater=710}}
User1,User2=Users[VD1],Users[VD2]
outsideTemp = 928
runTime = 0
Util.defTriggerVar("outsideTemp",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:05) % 24:00; post(#Update{user=user})")
rule("#Mminus{user='$user'} => user.travel=(user.travel-00:05) % 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); -- Update temp
cancel(user.timer); user.timer=nil; -- Cancel ev. timer
cancel(user.timer2); user.timer2=nil; -- Cancel ev. timer
local startTime = user.travel+midnight;
if startTime < ostime() then startTime += 24:00 end; -- Avresa passed, bump to next day
user.vd.setValue('Travel',osdate('%A %H:%M',startTime)); -- Update travel time
startTime -= runTime;
if startTime < ostime() then startTime=ostime() end;
if user.status == 'Auto' then -- If auto mode, start timer -- Subtract heater time
log('Startar motorvärmare %s',osdate('%c',startTime));
user.timer = post(#On{user=user},startTime);
user.timer2 = post(#Off{user=user},startTime+00:15) -- Timer for auto off
end;
user.vd.setValue('Heating',osdate('%H:%M',startTime)); -- Update heater time
]])

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 => -- Outside temp changes, update user values
local outTemp = outsideTemp;
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 ######################################
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

23 Nov 2019, 15:52

Ursäkta, var inte helt vaken imorse. Jag har ingen utetemperatur så jag simulerade outsideTemp med en variabel.
Gjorde en miss med out off, då jag räknade fel där, blev från starten av värmaren och inte från starten av avresan.
Ja, och så blev det en semicolon för lite.
Jag editerade min tidigare post och hoppas det blir bättre.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

23 Nov 2019, 17:43

Men @jang, du får se till skaffa både bil och utegivare så att du får någon nytta av all fin automatik som du levererar :D
EDIT:
Men det var en liten detalj till :-) Nu hjälpte det inte med et semikolon :roll:
Attachments
Error loading rules.jpg
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

23 Nov 2019, 19:00

RH_Dreambox wrote:
23 Nov 2019, 17:43
Men @jang, du får se till skaffa både bil och utegivare så att du får någon nytta av all fin automatik som du levererar :D
EDIT:
Men det var en liten detalj till :-) Nu hjälpte det inte med et semikolon :roll:
Bilfri sedan ett år tillbaka och det funkar finfint :D
Nåväl, den klagar på ett komma i regeln #update. Jag kan inte reproducera det. Kan du posta hela koden som du har nu?
Apropå förseningstiden, hur ska den ställas in?
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

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.
Last edited by RH_Dreambox on 24 Nov 2019, 16:30, edited 2 times in total.
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

24 Nov 2019, 14:43

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.
Det hade blivit ett .. istället för ett -- som kommentar i #Update. Nu laddar det för mig.
Byt

Code: Select all

if startTime < ostime() then startTime=ostime() end; .. If passed, set start time to now
mot

Code: Select all

if startTime < ostime() then startTime=ostime() end; -- If passed, set start time to now
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

24 Nov 2019, 16:32

@jang Tack så väldigt mycket för hjälpen!
Jag rättade koden i mitt förra inlägg utifall någon skulle kopiera den.
2 st HC2 4.560 - EventRunner 3
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

25 Nov 2019, 13:59

@jang Hur ser syntaxen ut om jag vill lägga till information i min motorvärmar-VD?
Tex. om jag vill visa temperaturen som "3.5°C"

user.vd.setValue('Temp',outsideTemp:value); -- Update temp

att skriva så här funkar ju inte...
user.vd.setValue('Temp',outsideTemp:value.."°C")

Jag har försökt med alla möjliga pareteser och citationstecken, men det blir bara antingen , eller.
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

25 Nov 2019, 20:02

RH_Dreambox wrote:
25 Nov 2019, 13:59
@jang Hur ser syntaxen ut om jag vill lägga till information i min motorvärmar-VD?
Tex. om jag vill visa temperaturen som "3.5°C"

user.vd.setValue('Temp',outsideTemp:value); -- Update temp

att skriva så här funkar ju inte...
user.vd.setValue('Temp',outsideTemp:value.."°C")

Jag har försökt med alla möjliga pareteser och citationstecken, men det blir bara antingen , eller.
Tyvärr, ER har inte '..' för strängsammansättning. Man får använda fmt() som är samma som Luas string.format()

Code: Select all

user.vd.setValue('Temp',fmt('%.1f°C',outsideTemp:value))
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

26 Nov 2019, 15:35

user.vd.setValue('Temp',fmt('%.1f°C',outsideTemp:value))
Tack @jang, jag hittade info om string.format() i LUA-manualen så nu har jag fått till både "°C" och " min" i min VD.

Men "fmt()" fungerade inte då jag ville sätta ihop flera variabler i samma sträng.
Motorvärmarna hanterar vi via en tablet i hallen med appen ImperiHome. Tyvärr finns det inte utrymme för en extra ruta för statusen där, så vi vet inte om värmaren är aktiv eller inte.
Men om jag kan få in avresetid och status i samma VD-label så skulle det fungera.

Jag har försökt på alla sätt att sätta ihop flera variabler till en sträng, men lyckas inte.
Raden nedan är hur min hjärna tänker sig kod-raden, har testat säkert 50 varianter med och utan fmt().

Code: Select all

user.vd.setValue('ImperiHome',osdate('%a %H:%M',startTime), '/', user.status); -- Update ImperiHome status
Det önskade resultatet är "Wed 08:15 / Auto" där statusen också kan vara On eller Off.

Då skulle man få full kontroll att se om värmaren är igång eller inte.
Jag vill helst inte störa dig med det här, men jag har inte lyckats hitta några exempel som rätar ut mina frågetecken.
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 193
Joined: 05 Jan 2014, 00:44
Location: Stockholm

26 Nov 2019, 21:07

RH_Dreambox wrote:
26 Nov 2019, 15:35
user.vd.setValue('Temp',fmt('%.1f°C',outsideTemp:value))
Tack @jang, jag hittade info om string.format() i LUA-manualen så nu har jag fått till både "°C" och " min" i min VD.

Men "fmt()" fungerade inte då jag ville sätta ihop flera variabler i samma sträng.
Motorvärmarna hanterar vi via en tablet i hallen med appen ImperiHome. Tyvärr finns det inte utrymme för en extra ruta för statusen där, så vi vet inte om värmaren är aktiv eller inte.
Men om jag kan få in avresetid och status i samma VD-label så skulle det fungera.

Jag har försökt på alla sätt att sätta ihop flera variabler till en sträng, men lyckas inte.
Raden nedan är hur min hjärna tänker sig kod-raden, har testat säkert 50 varianter med och utan fmt().

Code: Select all

user.vd.setValue('ImperiHome',osdate('%a %H:%M',startTime), '/', user.status); -- Update ImperiHome status
Det önskade resultatet är "Wed 08:15 / Auto" där statusen också kan vara On eller Off.

Då skulle man få full kontroll att se om värmaren är igång eller inte.
Jag vill helst inte störa dig med det här, men jag har inte lyckats hitta några exempel som rätar ut mina frågetecken.
Så string.format eller fmt sätter ihop strängen. Ex: fmt('%s / %s',arg1,arg2). arg1 är osdate och arg2 är status.
Tyvärr är osdate ett annat djur och tar bara datumformateringsinfo så vi måste använda både fmt och osdate

Code: Select all

user.vd.setValue('ImperiHome',fmt('%s / %s',osdate('%a %H:%M',startTime),user.status)); -- Update ImperiHome status
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1002
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

27 Nov 2019, 11:12

Så string.format eller fmt sätter ihop strängen. Ex: fmt('%s / %s',arg1,arg2). arg1 är osdate och arg2 är status.
Tyvärr är osdate ett annat djur och tar bara datumformateringsinfo så vi måste använda både fmt och osdate
CODE: SELECT ALL

user.vd.setValue('ImperiHome',fmt('%s / %s',osdate('%a %H:%M',startTime),user.status)); -- Update ImperiHome status
@jang Ett stort tack för hjälpen!
Jag var snubblande nära att lösa det själv, men jag förstod inte i vilken ordning det skulle skrivas, som tex att %s / %s skulle stå först :?: :!:
Jag är ju tekniker, så skall jag montera ett skruvförband så kan jag ju inte montera brickan sist :D

Nu skall jag bara försöka lösa så att man kan ångra "Auto" till läge Off. Nu måste man gå via On för att inaktivera Auto.
Men lyckas jag inte så får jag väl återkomma med den saken :oops:
2 st HC2 4.560 - EventRunner 3
Post Reply