EventRunner

jang
Medlem
Posts: 169
Joined: 05 Jan 2014, 00:44
Location: Stockholm

07 Nov 2019, 11:46

RH_Dreambox wrote:
07 Nov 2019, 10:44
Tack @jang för att du leder in mig på rätt spår, och ditt första exempel passar oss utmärkt.

Code: Select all

Util.defTriggerVar('washingReady')
rule("trueFor(00:05,kok.diskmaskin:power < 3 & kok.diskmaskin:isOn) => washingReady=true")
rule("kok.diskmaskin:power > 3 | kok.diskmaskin:isOff => washingReady=false")
rule("washingReady & now => $TTS = 'Tvätten är klar.&vol=12'") -- play first time breached
rule("washingReady => wait(00:00:05); $TTS = 'Har du kollat tvätten?&vol=12'")
rule("washingReady => kok.diskmaskin:off")
Men hur skriver jag då jag har tre olika triggers? En för tvättmaskinen, en för torktumlaren och en för 3D-skrivaren?
De kommer att ha olika regler, men jag tänker på Util.defTriggerVar.
Har försökt med lite olika varianter som den här, men bara den första triggern hittas.

Code: Select all

Util.defTriggerVar('dryerReady', 'washingReady', 'printerReady')
Tyvärr tar den bara en variabel åt gången.

Code: Select all

Util.defTriggerVar('dryerReady')
Util.defTriggerVar('washingReady')
Util.defTriggerVar('printerReady')
eller

Code: Select all

for _,v in ipairs({'dryerReady', 'washingReady', 'printerReady'}) do Util.defTriggerVar(v) end
Det finns också en funktion i ER som heter Util.map som tar en funktion och en lista och anropar funktionen på alla elementen i listan

Code: Select all

Util.map(Util.defTriggerVar,{'dryerReady', 'washingReady', 'printerReady'})
RH_Dreambox
Proffsmedlem
Posts: 985
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

07 Nov 2019, 13:03

Jag visste väl att du skulle ha en lösning i "bakfickan" :D.
Men om det inte spelar någon roll vilken metod man använder så föredrar jag den här...

Code: Select all

Util.map(Util.defTriggerVar,{'dryerReady', 'washingReady', 'printerReady'})
ER är lite som Office-paketet, man skrapar bara lite på ytan av alla bra funktioner som finns inbäddade i systemet :P.
2 st HC2 4.560 - EventRunner 3
MastrUsr
Medlem
Posts: 138
Joined: 25 Apr 2017, 07:24

07 Nov 2019, 14:08

RH_Dreambox wrote:Jag visste väl att du skulle ha en lösning i "bakfickan" :D.
Men om det inte spelar någon roll vilken metod man använder så föredrar jag den här...

Code: Select all

Util.map(Util.defTriggerVar,{'dryerReady', 'washingReady', 'printerReady'})
ER är lite som Office-paketet, man skrapar bara lite på ytan av alla bra funktioner som finns inbäddade i systemet :P.
Den ska jag också använda mig av!

Bra liknelse, exakt så är det!

Skickat från min SM-N960F via Tapatalk

RH_Dreambox
Proffsmedlem
Posts: 985
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

09 Nov 2019, 15:10

@jang, är det praktiskt möjligt att lägga in en Motorvärmar-funktion i ER? För ett par år sedan hade vi en tråd om detta som du kan läsa här:
viewtopic.php?f=12&t=4290&hilit=motorvä ... g&start=20
Vitsen med värmaren är att temp-tidskurvan skall följa Energimyndighetens rekommendationer och starta vid +10°C. Formeln för kurvan är ganska enkel och ser ut så här:

Code: Select all

runTime = math.floor(60 + 100*outTemp/(outTemp - 35))
  if outTemp > 10 then runTime = 0 end
ER bör kunna hantera minst två värmare (jag och gumman har varsin).
Man använder en egen tempsensor eller Fibaros vädertemp.
Man bör kunna ställa in en valfri förseningstid (avresan kan bli försenad)

Vi använder inte värmaren regelbundet, så för oss är det lämpligast med StandBy, Auto eller Manuell.
Vid manuell styrning bestämmer Fibaro-switchen uppvärmningstiden (parameter 4 och 5).

Men för de som har regelbundna tider så bör en VD kunna hantera ett veckoschema.
Bifogade filer och bilder visar den lösning som min familj använder idag.
Vi har även tablet med ImperiHome (bilderna) i hallen där vi hanterar värmarna.

Är detta möjligt eller blir det för tungarbetat för ER?
Attachments
Auto.jpg
Auto.jpg (94.63 KiB) Viewed 105 times
Motorvärmare-scen-vd.zip
(2.78 KiB) Downloaded 1 time
VD Motorvärmare.jpg
VD Motorvärmare.jpg (30.6 KiB) Viewed 107 times
Diagram_Temp-Tid.jpg
StandBy.jpg
StandBy.jpg (95.67 KiB) Viewed 107 times
Manuell.jpg
Manuell.jpg (96.97 KiB) Viewed 107 times
2 st HC2 4.560 - EventRunner 3
sonnyboy
Proffsmedlem
Posts: 648
Joined: 26 Sep 2013, 08:05
Location: Västerås

09 Nov 2019, 21:38

@RH_Dreambox
Kul att du tänkte på detta du med, jag funderade på samma igår :)
Försökte gå igenom hela tråden på Fibaros forum om det fanns typ som Gea Alarm.
Tyvärr så hittade jag inget om det. Nu har jag löst det för mig och gumman genom olika rules som trycker på knapparna i den "gamla" VD:n då jag och gumman jobbar olika tider och har samma kabel.
Fibaro HomeCenter 2
Fw 4.550
BeyondMeasure 1.10
EventRunner
RH_Dreambox
Proffsmedlem
Posts: 985
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

10 Nov 2019, 10:11

@sonnyboy, GEA har jag inte använt så jag vet inte hur Alarm funkade där, men var det inte jompa som hade några Alarm-VD?
Hur som helst så har jompa något liknande till ER. Jag skulle tro att han använder sig av några VD där också.

Code: Select all

rule("@03:00 & wday('sat-sun') => $AlarmClockDays1='Weekends';$AlarmClockTime1='07:30';$AlarmClockDays2='Weekends';$AlarmClockTime2='07:30';log('Alarmklocka: %s %s', $AlarmClockTime1, $AlarmClockDays1,) ")
  rule("@03:00 & wday('mon-fri') & $BankHoliday==1 | $Holiday==1 => $AlarmClockDays1='Weekdays';$AlarmClockTime1='07:30';$AlarmClockDays2='Weekdays';$AlarmClockTime2='07:30';log('Alarmklocka: %s %s', $AlarmClockTime1, $AlarmClockDays1,) ")
  rule("@03:00 & wday('mon-fri') & $BankHoliday==0 => $AlarmClockDays1='Weekdays';$AlarmClockTime1='05:00';log('Alarmklocka: %s %s', $AlarmClockTime1, $AlarmClockDays1,) ")
  rule("@03:00 & wday('mon-fri') & $BankHoliday==0 => $AlarmClockDays2='Weekdays';$AlarmClockTime2='07:00';log('Alarmklocka: %s %s', $AlarmClockTime2, $AlarmClockDays2,) ")
2 st HC2 4.560 - EventRunner 3
MastrUsr
Medlem
Posts: 138
Joined: 25 Apr 2017, 07:24

10 Nov 2019, 14:04

Min VD ser ut så här. "På-tiden" är satt till 1,5h.. Orkade inte lägga upp det också när det äntligen funkade.. Kul att ni tog upp detta bara dagar efter att jag blev klar med min VD, hehe. Image

Skickat från min SM-N960F via Tapatalk


jang
Medlem
Posts: 169
Joined: 05 Jan 2014, 00:44
Location: Stockholm

16 Nov 2019, 11:03

Hej,
har funderat på motorvärmaren lite.
Det är inga problem att implementera det i ER - frågan är bara att göra det hyfsat elegant... Det är dessutom alltid lite krångligt med timers och alla specialfall som ofta inträder. Nåväl, här är ett försök...

Jag har inkluderat en ny version av VDn.
Alla knappar har samma kod

Code: Select all

local VDID = fibaro:getSelfId()
local scene = fibaro:getValue(VDID, "TCPPort")
local event = {type='MV_VD', id=VDID, value=_elementID_}
fibaro:startScene(scene,{urlencode(json.encode(event))})
Så, vad knappen gör (och alla knappar i VDn) är att den skickar ett event till sceneID som finns i VDns TCP port fält.
Eventet är av typ:

Code: Select all

#MV_VD{id=<VD id>, value=<knapp id>}
och vi kan därför skriva ER regler som

Code: Select all

rule("#{id=46, value=4} => log('VD 46 klickade på knapp med id 4')")
Ok, ER har en funktion som heter VDev.proxy(<VD id>) som returnerar ett objekt med metoder för att lättare jobba med en VD.
Ex.

Code: Select all

local vd = VDev.proxy(46)
vd.setValue('Travel','07:00') -- Sätter fältet ui.Travel.label i VD 46 till '07:00'
local name = vd.nameOf(2) -- returnerar 'Travel' om ui.Travel.label är fält 2 i VDn.
Så, om vi har det, kan vi skriva vår motorvärmarscen så här:

Code: Select all

    local BTNS = {"Travel","Hplus","Hminus","Mplus","Mminus","Temp","Status","Auto","On","Off","Heating"}   -- Name of fields in VD
    VD1,VD2=144,133 -- VD IDs
    Users = {[VD1]={heater=17},[VD2]={heater=19}} -- deviceID for heaters
    User1,User2=Users[VD1],Users[VD2] -- Remove VD2 if only one VD
    outsideTemp = 299 -- ID of temp device
    runTime = 0
  
    --Initialize VD at restart
    for vd,u in pairs(Users) do
      u.vd=VDev.proxy(vd) -- Create proxy to easier interact with VD
      local a = u.vd.getValue("Travel")         -- See if we have an old travel value and reuse it 
      u.vd.setValue("Travel",a and a~="" and a or "07:00") -- else default to 07:00
      u.travel = toTime(u.vd.getValue("Travel"))
      u.status = fibaro:getValue(u.heater,"value") == '0' and 'Av' or 'På' -- Status of heater currently 
      Event.post({type='Update',user=u}) -- Update fields in VD
    end

   -- Convert events from ID to easier events to handle...
    rule("#MV_VD{id='$id',value='$value'} => post({type=Users[id].vd.nameOf(value), user=Users[id],_sh=true})") 

   -- Buttons pressed in VD
    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})")

   -- Generic handler to update VD when a value changes (and set timer if needed)
    rule([[#Update{user='$user'}  =>
        user.vd.setValue('Status',user.status);                                  -- Update status
        user.vd.setValue('Travel',osdate('%H:%M',user.travel+midnight));         -- Update travel time
        user.vd.setValue('Temp',outsideTemp:value);                       -- Update temp
        user.vd.setValue('Heating',osdate('%H:%M',midnight+user.travel-runTime));  -- Update heater time
        cancel(user.timer);                                                            -- Cancel ev. timer
        user.timer=nil;
        local startTime = user.travel+midnight;
        if startTime < ostime() then startTime += 24:00 end;        -- Avresa passed, bump to next day
        startTime -= runTime;
        if startTime < ostime() then startTime=ostime() end;        -- Time passed, set 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)
        end;
        user.vd.setValue('Heating',osdate('%A %H:%M',startTime));  -- Update heater time (day in HC2 language)
        ]])

    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;
          post(#Update{user=User1});
         post(#Update{user=User2})  -- remove if only one user
    ]]).start()
Den hanterar 2 VD just nu, kan enkelt modifieras till en eller godtyckligt många.
Logiken är att när Auto är satt så kör timern. På/Av slår på/av värmaren. Om man sätter auto när tiden har passerat så sätts timern till nästa dag. Om uppvärmningstiden är för liten så startas värmaren direkt iallafall. Om man slår på/av värmaren manuellt så uppdateras VDn.
Scenen behöver inte heller kontinuerligt polla VDn för värden då den bara reagerar på knapptryck och när temperaturen ändras.
Man kan modifiera den så att man har dagar också antar jag. Tyvärr har jag varken bil eller motorvärmare ;)

Men principen, att ha en VD där alla knappar bara skickar ett event till ER scenen och all logik hanteras i ER, är ngt som jag använder i mina andra VDs.
Attachments
683_Motorvärmare_YH.vfib.json.zip
(1.5 KiB) Downloaded 2 times
Post Reply