HomeMatic HMinfo Templates erstellen

Aus FHEMWiki

Mit diesem kleinen HowTo soll gezeigt werden, wie ein eigenes Template für die Konfiguration von Aktoren (Type switch) mit Tastern (Type remote) erstellt werden kann.

Grundlegende Informationen finden sich auf der Seite HMinfo.

Kurzerklärung Templates

Templates erleichtern den Umgang mit Register. Wie in HMinfo erläutert muss man den möglichen Umfang eines einzelnen Templates verstehen. Ein Template beinhaltet mindestens ein Register, typisch sicher mehrere. Maximal beschränkt sich ein einzelnes Template auf

  • eine Entity (einen Kanal)
  • 0-Template: alle Register die NICHT einem Peer zugeordnet sind
  • peer-Template: Register die einem Peer zugeordnet sind
    • short/long-Template: Alle Register eines Peers für short ODER long. Beschrieben wird das short ODER long Verhalten
    • both-Template: Alle Register eines Peers - beschrieben wird short UND long Verhalten

Wie feingranular man ein Template erstellt ist Geschmackssache. Man kann einer Entity beliebig viele Templates zuweisen. Wenn sich Inhalte überschneiden kommt es zu Problemen, welche mit configCheck aufgedeckt werden.

Erstellen eines Templates

Ziel ist es die Funktion der Tasten zu ändern/tauschen. Peert man das Tastenpaar 5/6 eines HM-PB-6-WM55 mit dem Channel 1 von einem HM-LC-SW2-FM mittels

 set RC61_5 peerChan 0 SW01_Sw01 dual set both

entsteht der Ausgangszustand: Taste 5 RC61_5 schaltet SW01_Sw01 aus. Taste 6 RC61_6 schaltet SW01_Sw01 ein.

Die regTable dazu sieht so aus:

                        RC61_5                          RC61_6                          
                        lg              sh              lg              sh              
 ActionType             jmpToTarget     jmpToTarget     jmpToTarget     jmpToTarget     
 CtDlyOff               geLo            geLo            geLo            geLo            
 CtDlyOn                geLo            geLo            geLo            geLo            
 CtOff                  geLo            geLo            geLo            geLo            
 CtOn                   geLo            geLo            geLo            geLo            
 CtValHi                100             100             100             100             
 CtValLo                50              50              50              50              
 MultiExec              on              off             on              off             
 OffDly            [s]  0               0               0               0               
 OffTime                unused          unused          unused          unused          
 OffTimeMode            absolut         absolut         absolut         absolut         
 OnDly             [s]  0               0               0               0               
 OnTime                 unused          unused          unused          unused          
 OnTimeMode             absolut         absolut         absolut         absolut         
 SwJtDlyOff             off             off             on              on              
 SwJtDlyOn              off             off             on              on              
 SwJtOff                off             off             dlyOn           dlyOn           
 SwJtOn                 dlyOff          dlyOff          on              on              

Damit der gewünschte Effekt entsteht sollen die Register wie folgt geändert werden, es werden nur die Register für sh geändert!

 SwJtDlyOff             off             no              on              no              
 SwJtDlyOn              off             no              on              no              
 SwJtOff                off             on              dlyOn           no           
 SwJtOn                 dlyOff          no              on              off              

Jetzt werden zwei Templates definiert

 set hminfo templateDef tmpl_SwOnOnly 0 "Template für nur an" ActionType:jmpToTarget SwJtDlyOff:no SwJtDlyOn:no SwJtOff:on SwJtOn:no
 set hminfo templateDef tmpl_SwOffOnly 0 "Template für nur aus" ActionType:jmpToTarget SwJtDlyOff:no SwJtDlyOn:no SwJtOff:no SwJtOn:off

und entsprechend übertragen

 set hm templateSet SW01_Sw01 tmpl_SwOnOnly RC61_5:short
 set hm templateSet SW01_Sw01 tmpl_SwOffOnly RC61_6:short

Die Konfiguration kann auf unterschiedliche Art gesichert werden, z.B:

 set hm saveConfig config.txt 

schreibt alles (Die gesamte Konfiguration die HMinfo aus FHEM ermitteln kann - also nicht aus den Geräten selbst) in eine Datei /opt/fhem/config.txt.

Aus der Datei können im Bedarfsfall einzelne Befehle zum Setzen der Register herausgezogen werden.

Weitere Möglichkeiten bietet das Modul mit archConfig

Templates Repository

Hier werden einige Templates angeboten, welche im System integriert werden können

Generelle Einstellungen

define hm HMinfo
attr hm autoArchive 1
attr hm autoLoadArchive 1_load
attr hm autoUpdate 0:3
attr hm configFilename regConfig.cfg

switch Templates

long-short

Templates zum Setzen der Condition-Table

set hm templateDef SwOnCond level:cond "switch: execute only if condition [geLo|ltLo] level is below limit" CtValLo:p0 CtOn:p1 CtOff:p1 CtDlyOn:p1 CtDlyOff:p1
set hm templateDef SwCondAbove condition "Switch: execute only if condition level is above limit" CtValLo:p0 CtOn:geLo CtOff:geLo CtDlyOn:geLo CtDlyOff:geLo
set hm templateDef SwCondBelow condition "Switch: execute only if condition level is below limit" CtValLo:p0 CtOn:ltLo CtOff:ltLo CtDlyOn:ltLo CtDlyOff:ltLo
set hm templateDef autoOff time "staircase - auto off after -time-, extend time with each trigger" SwJtDlyOn:no ActionType:jmpToTarget SwJtDlyOff:dlyOn OnTime:p0 OffTime:unused SwJtOn:on SwJtOff:dlyOn

Templates zur Definition einer Aktion

set hm templateDef SwIgnore 0 "ignore event" ActionType:off
set hm templateDef SwOff 0 "Switch: off if trigger" SwJtDlyOn:dlyOff ActionType:jmpToTarget SwJtDlyOff:off OnTime:unused OffTime:unused SwJtOn:dlyOff SwJtOff:no
set hm templateDef SwOn 0 "Switch: on if trigger" SwJtDlyOn:on ActionType:jmpToTarget SwJtDlyOff:dlyOn OnTime:unused OffTime:unused SwJtOn:no SwJtOff:dlyOn
set hm templateDef SwToggle 0 "Switch: toggle on trigger" SwJtDlyOn:on ActionType:jmpToTarget SwJtDlyOff:off OnTime:unused OffTime:unused SwJtOn:dlyOff SwJtOff:dlyOn

Beispiel Nutzung: nutze den Trigger "short" des Peers "MeinPeer" wenn der Level größer als 30 ist. Als Aktion ist ein 2. Template zum Einschalten aktiviert. Bei langem Trigger soll ausgeschaltet werden

set hm templateSet <MeinLicht> SwOnCond <MeinPeer:short> 30 gtLo
set hm templateSet <MeinLicht> SwOn <MeinPeer:short> 
set hm templateSet <MeinLicht> SwOff <MeinPeer:long> 

both

Both ist ein kompakterer Ansatz - man definiert das komplette Verhalten eines Peers, also short und long in einem.

set hm templateDef SwMdir onTime:minBright "switch action when peered motionDetector" shOnDly:0 shSwJtOn:no shOffDly:p0 lgActionType:off shCtDlyOff:ltHi shOffTimeMode:minimal shCtValLo:p1 lgMultiExec:off shOnTime:0 shCtValHi:255 shOffTime:unused shMultiExec:off shOnTimeMode:minimal shSwJtOff:dlyOff shSwJtDlyOff:dlyOff shCtOff:ltLo shActionType:jmpToTarget shCtOn:ltLo shSwJtDlyOn:no shCtDlyOn:ltLo
set hm templateDef SwSonLoff 0 "Switch: shortOn, long Off" lgSwJtOff:no lgOffTime:unused shOffTime:unused shSwJtOn:no lgSwJtOn:dlyOff lgActionType:jmpToTarget shSwJtOff:dlyOn shSwJtDlyOff:dlyOn shActionType:jmpToTarget lgSwJtDlyOff:off shSwJtDlyOn:on lgSwJtDlyOn:dlyOff lgOnTime:unused shOnTime:unused
set hm templateDef SwSoffLignore 0 "Switch: shortOff, long Ignore" shOffTime:unused shSwJtOn:dlyOff lgActionType:off shSwJtDlyOff:off shSwJtOff:no shActionType:jmpToTarget shSwJtDlyOn:dlyOff shOnTime:unused

Beispiel: Konfiguration eines Aussenlichts mit Motion-Detector. Erzielt werden soll das Einschalten bei Dunkelheit (brght kleiner 70) für 30sec. Per Tastendruck soll das Licht eingeschaltet werden und endlos anbleiben (Ausschalten nicht vergessen). Alternativ einschalten für einige Stunden - das sollte auch reichen - und es geht irgendwann doch aus. Im Beispiel für Button2 4 Stunden.

set hm templateSet <MeinLicht> SwMdir <MotionPeer:both> 30 70
set hm templateSet <MeinLicht> SwSonLoff <ButtonPeer:both>  
set hm templateSet <MeinLicht> autoOff <Button2Peer:short> 14400

Dimmer Templates

long-short

set hm templateDef DimDown rampTime "ramp down to 0, ramp valiable" DimJtRampOff:off OnTime:unused DimJtOn:dlyOff OffTime:unused OffDlyStep:5 DimJtOff:rampOff OffTimeMode:absolut OffDlyBlink:on OnDlyMode:setToOff DimJtRampOn:dlyOff OffDlyOldTime:0.4 RampOnTime:p0 DimMaxLvl:100 OnTimeMode:absolut RampSstep:5 OnLvlPrio:high DimMinLvl:0 DimStep:5 DimJtDlyOff:rampOff OffLevel:0 OnMinLevel:10 ActionTypeDim:jmpToTarget OnDly:0 OffDly:0 OffDlyNewTime:0.4 RampOffTime:p0 OnLevel:100 DimJtDlyOn:dlyOff
set hm templateDef DimOff 0 "Dimmer: off if trigger" DimJtDlyOff:off DimJtRampOff:dlyOff DimJtOn:dlyOff OnTime:unused ActionTypeDim:jmpToTarget DimJtOff:no OffTime:unused DimJtRampOn:dlyOff DimJtDlyOn:dlyOff
set hm templateDef DimOn 0 "Dimmer: on if trigger" DimJtDlyOff:dlyOn DimJtRampOff:dlyOn DimJtOn:no OnTime:unused ActionTypeDim:jmpToTarget DimJtOff:dlyOn OffTime:unused DimJtRampOn:dlyOn DimJtDlyOn:on
set hm templateDef DimUp onLevel:rampTime:onTime "ramp up soft" DimJtRampOff:dlyOn OnTime:p2 DimJtOn:rampOn OffTime:unused OffDlyStep:5 DimJtOff:dlyOn OffTimeMode:absolut OffDlyBlink:on OnDlyMode:setToOff DimJtRampOn:on OffDlyOldTime:0.4 RampOnTime:p1 DimMaxLvl:p0 OnTimeMode:absolut RampSstep:5 OnLvlPrio:high DimMinLvl:0 DimStep:5 DimJtDlyOff:dlyOn OffLevel:0 OnMinLevel:10 ActionTypeDim:jmpToTarget OnDly:0 OffDly:0 OffDlyNewTime:0.4 RampOffTime:p1 OnLevel:p0 DimJtDlyOn:rampOn

both

Blind (Rollo) Templates

devicelevel

set hm templateDef BlSetDrive up:down:turn "drive times up, down and turn plus gen defaults" statusInfoRandom:0 localResDis:off refRunCounter:0 statusInfoMinDly:3 driveUp:p0 driveDown:p1 transmitTryMax:6 driveTurn:p2 intKeyVisib:visib confBtnTime:permanent sign:off
set hm templateSet Blind BlSetDrive 100 105 0.5 # Setze Fahrzeiten auf 100s, runter 105s, turn 0.5s

long-short

set hm templateDef BlStopDnLg 0 "Blind: stop drive on any key - for long drive down" BlJtOn:dlyOff BlJtDlyOff:refOff BlJtDlyOn:dlyOff ActionType:jmpToTarget BlJtOff:dlyOff BlJtRampOff:rampOff BlJtRampOn:on BlJtRefOn:on BlJtRefOff:rampOff
set hm templateDef BlStopDnSh 0 "Blind: stop drive on any key - for short drive down" BlJtOn:dlyOff BlJtDlyOff:refOff BlJtDlyOn:dlyOff ActionType:jmpToTarget BlJtOff:dlyOff BlJtRampOff:off BlJtRampOn:on BlJtRefOn:on BlJtRefOff:rampOff
set hm templateDef BlStopUpLg 0 "Blind: stop drive on any key - for long drive up" BlJtOn:dlyOn BlJtDlyOff:dlyOn BlJtDlyOn:refOn ActionType:jmpToTarget BlJtOff:dlyOn BlJtRampOff:off BlJtRampOn:rampOn BlJtRefOn:rampOn BlJtRefOff:off
set hm templateDef BlStopUpSh 0 "Blind: stop drive on" BlJtOn:dlyOn BlJtDlyOff:dlyOn BlJtDlyOn:refOn ActionType:jmpToTarget BlJtOff:dlyOn BlJtRampOff:off BlJtRampOn:on BlJtRefOn:rampOn BlJtRefOff:off
set hm templateDef BlToggle 0 "toggle mein Rollo" BlJtDlyOff:no BlJtOn:dlyOff ActionType:jmpToTarget BlJtDlyOn:no BlJtOff:dlyOn BlJtRampOff:dlyOn BlJtRampOn:dlyOff BlJtRefOn:dlyOff BlJtRefOff:dlyOn

both

set hm templateDef BlSmartStopDn 0 "from Master BlSmartStopDn > FB_09:both" shBlJtOff:dlyOff lgCtDlyOff:geLo lgDriveMode:direct lgOffLevel:0 lgActionType:jmpToTarget shBlJtDlyOn:dlyOff shOffLevel:0 lgCtValLo:50 lgCtRefOn:geLo lgBlJtOff:dlyOff shCtDlyOff:geLo shOffTimeMode:absolut lgOnLevel:100 lgBlJtDlyOn:dlyOff lgBlJtDlyOff:refOff shBlJtDlyOff:refOff lgMultiExec:on lgOffDly:0 lgBlJtRefOff:rampOff shCtValHi:100 lgMaxTimeF:0.5 shBlJtRefOn:on lgCtValHi:100 shBlJtRampOff:off shCtRefOff:geLo shCtRampOn:geLo shMaxTimeF:unused shOnTimeMode:absolut shBlJtRefOff:rampOff lgOnTime:unused lgCtRefOff:geLo lgOnTimeMode:absolut lgCtRampOff:geLo shOnDly:0 lgCtRampOn:geLo lgOffTime:unused lgBlJtRefOn:on shOffDly:0 shCtRefOn:geLo lgCtOff:geLo lgCtOn:geLo shCtValLo:50 lgBlJtOn:dlyOff lgOnDly:0 lgOffTimeMode:absolut shBlJtRampOn:on shBlJtOn:dlyOff shOnTime:unused shDriveMode:direct shOffTime:unused lgCtDlyOn:geLo shOnLevel:100 lgBlJtRampOn:on shCtRampOff:geLo shMultiExec:off shCtOff:geLo shActionType:jmpToTarget shCtOn:geLo shCtDlyOn:geLo lgBlJtRampOff:rampOff
set hm templateDef BlSmartStopUp 0 "from Master BlSmartStopUp > FB_10:both" shBlJtOff:dlyOn lgCtDlyOff:geLo lgDriveMode:direct lgOffLevel:0 lgActionType:jmpToTarget shBlJtDlyOn:refOn shOffLevel:0 lgCtValLo:50 lgCtRefOn:geLo lgBlJtOff:dlyOn shCtDlyOff:geLo lgOnLevel:100 shOffTimeMode:absolut lgBlJtDlyOff:dlyOn lgBlJtDlyOn:refOn shBlJtDlyOff:dlyOn lgMultiExec:on lgOffDly:0 lgBlJtRefOff:off shCtValHi:100 lgMaxTimeF:0.5 shBlJtRefOn:rampOn lgCtValHi:100 shCtRefOff:geLo shCtRampOn:geLo shBlJtRampOff:off shMaxTimeF:unused shBlJtRefOff:off shOnTimeMode:absolut lgCtRefOff:geLo lgOnTime:unused lgOnTimeMode:absolut lgCtRampOff:geLo lgCtRampOn:geLo shOnDly:0 lgOffTime:unused lgBlJtRefOn:rampOn shOffDly:0 shCtRefOn:geLo lgCtOff:geLo lgCtOn:geLo shCtValLo:50 lgBlJtOn:dlyOn lgOnDly:0 lgOffTimeMode:absolut shBlJtRampOn:on shBlJtOn:dlyOn shOnTime:unused shDriveMode:direct shOffTime:unused lgCtDlyOn:geLo shOnLevel:100 lgBlJtRampOn:rampOn shCtRampOff:geLo shMultiExec:off shCtOff:geLo shActionType:jmpToTarget shCtOn:geLo shCtDlyOn:geLo lgBlJtRampOff:off


Heizung RT Templates

Man muss hier die einzelnen Kanäle unterscheiden. Da sich die Register unterscheiden sind für jeden Kanal eigene Templates erstellt worden. Achtung: Die Templates sind in diesem Fall Beispiele. Evtl sind andere Einstellungen gewünscht.

RT-device

Selektierbar ist, ob Buttonlock ein oder ausgeschaltet sein soll. Mit Beispielnutzung

set hm templateDef HeatDefDev BtnLock "Default RT Device register" globalBtnLock:off modusBtnLock:off localResDis:off cyclicInfoMsg:on backOnTime:10 lowBatLimitRT:2.1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0
set hm templateSet rtDevice HeatDefDev 0 on # buttonLock ist eingeschaltet

Eine Alternative - wenn man auch den Batterielevel selektiv einstellen will. Da es bei allen meinen RTs identisch ist stelle ich es im Define ein, nicht im Set. Aber dennoch hier das Beispiel

set hm templateDef HeatDefDev BtnLock:BatLevel "Default RT Device register" globalBtnLock:off modusBtnLock:off localResDis:off cyclicInfoMsg:on backOnTime:10 lowBatLimitRT:p1 burstRx:on cyclicInfoMsgDis:0 btnLock:p0
set hm templateSet rtDevice HeatDefDev 0 2.3 on # buttonLock ist eingeschaltet, BatMinLevel ist 2.3V

RT-Clima

set hm templateDef HeatDefault boost "myDefault RT settings, enter boostTime" reguIntI:20 regAdaptive:offDeter nightTemp:17 tempOffset:0.0K dayTemp:21 reguIntPstart:5 reguExtI:20 reguIntP:25 reguExtP:25 showWeekday:off tempMin:4.5 tempMax:30.5 valveMaxPos:15 valveOffsetRt:0 modePrioManu:all daylightSaveTime:on boostPos:30 showInfo:time decalcWeekday:Sat btnNoBckLight:off decalcTime:11:00 noMinMax4Manu:off reguExtPstart:5 valveErrPos:15 modePrioParty:all boostPeriod:p0
set hm templateSet RT1_Clima HeatDefault 20 on # Clima-defaults - Boost fpr RT1 ist auf 20 min eingestellt
set hm templateSet RT2_Clima HeatDefault 5 on # Clima-defaults - Boost fpr RT1 ist auf 5 min eingestellt

RT-Remote

Um mit einem Button "gute Nacht" zu sagen und alle Lichter auszuschalten kann man den Button auch mit den RTs koppeln und auf Nachttemp zu schalten. Man muss hier - wie beim Switch - long/short und both unterscheiden. Im Beispiel ist ein long/short template genutzt.

set hm templateDef HeatRemote temp "heatRemote set temperature CtrlRc:autoAndTemp" TempRC:p0
set hm templateSet RT1_Remote HeatRemote <Button1:long> 18 # schalte bei trigger long auf 18 Grad(Nacht)
set hm templateSet RT1_Remote HeatRemote <Button1:short> 23 # schalte bei trigger short auf 23 Grad(Tag)
set hm templateSet RT1_Remote HeatRemote <Button2:long> 15 # schalte bei trigger long auf 15 Grad
set hm templateSet RT1_Remote HeatRemote <Button2:short> 28 # schalte bei trigger short auf 28 Grad


SmokeDetector SD2

Entschieden, ob der Repeater eingeschaltet werden soll oder nicht.

set hm templateDef  sd2Rep repeat "SD2 setup as repeater (1) or not (0)" devRepeatCntMax:p0

Links