HomeMatic Register programmieren: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
(Weitere umfassende Ergänzung mit Grundlagen und Beispielen)
K (Baustellenvermerk)
Zeile 1: Zeile 1:
<!-- Bitte noch an geeigneten Stellen Links auf diese Seite einfügen -->
<!-- Bitte noch an geeigneten Stellen Links auf diese Seite einfügen -->
 
{{Baustelle}}
Ein HomeMatic-Gerät besitzt mehr oder weniger umfangreiche Registersätze, mit denen das Verhalten des Gerätes vielfältig feinkonfiguriert werden kann. Die damit erreichbare Funktionsvielfalt geht weit über die standardisierten Vorgaben einer einfachen Direktverknüpfung ([[Peering_(HomeMatic)|Peering]]) hinaus.  
Ein HomeMatic-Gerät besitzt mehr oder weniger umfangreiche Registersätze, mit denen das Verhalten des Gerätes vielfältig feinkonfiguriert werden kann. Die damit erreichbare Funktionsvielfalt geht weit über die standardisierten Vorgaben einer einfachen Direktverknüpfung ([[Peering_(HomeMatic)|Peering]]) hinaus.  



Version vom 20. Oktober 2017, 20:53 Uhr


Clock - Under Construction.svg An dieser Seite wird momentan noch gearbeitet.


Ein HomeMatic-Gerät besitzt mehr oder weniger umfangreiche Registersätze, mit denen das Verhalten des Gerätes vielfältig feinkonfiguriert werden kann. Die damit erreichbare Funktionsvielfalt geht weit über die standardisierten Vorgaben einer einfachen Direktverknüpfung (Peering) hinaus.

Grundlagen (in Auszügen)

Im folgenden werden nur exemplarisch einige Grundlagen und einfache Beispiele benannt, ohne jeden Anspruch auf Vollständigkeit.

FHEM unterstützt die Programmierung der Register mit dem Befehl regSet. <peer> entfällt bei rein gerätebezogenen Programmierungen.

set <name> regSet <register> <value> [<peer>]

Darüberhinaus gibt es vor- oder selbstdefinierte Templates (Vorlagen), die alle erforderlichen Änderungen für standardisierte Anwendungen wie Treppenhauslichtschalter beinhalten. Die Anwendung von Templates auf Geräte wird protokolliert und der Registerzustand kann überprüft werden. Für viele Anwendungen genügt jedoch auch die einmalige Anwendung einer direkten Programmierung. Das genaue Verständnis der Vorgänge und Zusammenhänge ist nicht trivial, das Erlernen wird aber mit einer enormen erreichbaren Funktionsvielfalt belohnt. Viele wissenswerte Zusammenhänge sind im Homematic-Anhang der bekannten Einsteiger-Dokumentation erläutert, deren Lektüre zu Recht immer wieder empfohlen wird. Dieser Beitrag ist auch nur als Ergänzung zu verstehen!

Die HomeMatic Aktoren (Schalter, Dimmer, ...) arbeiten so, wie es für verknüpften (peering) Sender vorgegeben ist. Sie nutzen Registersätze, die für jede Verknüpfung (peer) neu angelegt und gespeichert werden. Man kann also mit einem Taster ein- und ausschalten (toggeln), mit einem Tastenpaar gezielt ein- und ausschalten und mit einem weiteren Taster eine Zeitschaltung für 10 Sekunden starten. Dabei wird niemals der Taster oder der Schalter auf eine globale Aktion programmiert, sondern im Schalter (Aktor) die gewünschte Aktion für jeden verknüpften Taster separat gespeichert. Die auszulösende Aktion ist zudem abhängig vom aktuellen Zustand des Aktors und von der Länge des Tastendruckes (kurz oder länger - short or long).

Kleines Beispiel:

T1 schaltet S1 für 10 sec an
T2 schaltet S1 an oder aus  
T3 schaltet S1 an  
T4 schaltet S1 aus.  

Diese Tabelle ist im Schalter S1 gespeichert.

Schaltet man mit T3 den S1 an und drückt dann nach beliebiger Zeit kurz T1 geht S1 nach weiteren 10 sec aus. Schaltet man mit T1 kurz den S1 für 10 sec an, aber innerhalb dieser Zeit mit T3 nochmal an, dann bleibt S1 nach Ablauf der 10 sec an.

Die verfügbaren Register unterscheiden sich im Gerät und in den jeweiligen Kanälen. Eine kurze Beschreibung der Register inklusive der erlaubten Werte erhält man durch:

get <name> regList

Dabei kann <name> ein Gerät oder ein separater Gerätekanal sein.

Spezielle Register (Auswahl)

Im folgenden sollen einige Register vorgestellt werden, die in vielen Geräten vorhanden sind. Ergänzungen sind ausdrücklich erwünscht!

Gerätebezogene Register

Gerätebezogene Register existieren für jedes HomeMatic-Gerät nur einmal und werden in der sogenannten List0 gespeichert (in der FHEM-Oberfläche als Hexbytefolge unter RegL_00. zu finden).

confBtnTime - Kurz oder lang und der Konfigurationsmodus

Nicht immer sind die internen Tasten eines Gerätes ohne weiteres mit Aktionen für kurzen und langen Tastendruck programmierbar. Bei allen Hutschienen-Aktoren sowie den Zwischensteckern (mit nur einem Bedienknopf) versetzt ein langer Tastendruck (4 Sekunden) den Schalter normalerweise in den Konfigurations- bzw. Anlern-Modus, bei den in Unterputzdosen versenkbaren Schalt- und Dimmaktoren (-FM ohne PBU in der Bezeichnung) ohne eigenen Konfigurations-Button gilt dies sogar für die zur normalen Funktion extern angeschlossenen Taster. Dieses Verhalten kann man mit dem Register confBtnTime beeinflussen. Bis zum Ablauf der dort einstellbaren Zeit (in Minuten) nach dem Versorgen mit Strom (powerUp) erreicht man den Konfigurationsmodus wie bisher, danach interpretiert der Aktor die Tastendrücke stets als kurz (short) oder lang (long). Beispiel:

set <name> regSet confBtnTime 2

Möchte man den Aktor später zurücksetzen oder lokal konfigurieren, so erreicht man das ursprüngliche Verhalten in diesem Beispiel für die ersten zwei Minuten, nachdem man den Aktor (ausreichend lange) stromlos gemacht hat.

intKeyVisib - Interne Tasten sichtbar machen

Die internen "Tasten" eines Aktors (z.B. die Schaltwippe bei Wandschaltern/-tastern, der Bedienknopf bei Zwischensteckern, aber auch die angeschlossenen externen Taster bei Aktoren für Unterputzdosen oder die von außen zugängliche "Notbedientaste" etwa bei Zwischendecken-Dimmern) sind logisch ebenso mit dem Aktor verknüpft wie externe Bedienelemente wie Funkfernbedienungen oder per Funk verknüpfte Wandtaster. Ihre Betätigung wird (außer mit präparierter Firmware) zwar nicht gesendet (und kann daher von FHEM nicht "gelesen" werden), die vom Hersteller vorgesehenen Funktionen lassen sich aber genauso frei programmieren. Allerdings sind diese internen Verknüpfungen zur Vermeidung versehentlicher Programmierungen zunächst verborgen und müssen daher explizit sichtbar gemacht werden.

Dies geschieht mit

set <name> regSet intKeyVisib visib  
attr <name> expert 1

Anschließend sind der oder die internen Taste(n) mit der Bezeichnung self01 (self02, ...) sichtbar und ihre Aktionen können gezielt umprogrammiert werden.


ledMode - Funktion der Onboard-LED bei Bausätzen

(wird ergänzt)


Kanalbezogene Register

Kanalbezogene Register existieren für jeden Kanal eines Gerätes einmal und werden in der sogenannten List1 gespeichert (in der FHEM-Oberfläche als Hexbytefolge unter RegL_01. zu finden).

powerUpAction - Automatischer Knopfdruck bei (wiederkehrender) Stromversorgung

Mit diesem Register (default off) kann erreicht werden, dass ein Schaltaktor nach einem Stromausfall sich bei Wiederkehr der Versorgungsspannung automatisch einschaltet. Dies ist z.B. sinnvoll für Zwischenstecker mit Messfunktion (HM-ES-PMSw1-Pl), wenn dieser als Langzeitmonitor etwa für Kühlgeräte verwendet wird - nach einem Stromausfall bliebe der Kühlschrank sonst aus und der Inhalt würde verderben.

set <name> regSet powerUpAction on

Achtung: Das Setzen dieses Registers auf on bedeutet nicht immer einen eingeschalteten Aktor nach der Wiederkehr der Stromversorgung. Vielmehr wird nur ein short-Ereignis auf den zugehörigen internen Taster ausgelöst, was nur im Normalfall zum Einschalten des Aktors führt - nicht aber wenn die Funktion dieses kurzen Tastendruckes gezielt verändert wurde, denn dann wird eben diese Aktion ausgeführt! Das gilt zum Beispiel auch für zeitlich begrenztes Einschalten. Als Alternative für eine lokale Schaltmöglichkeit bietet sich in solchen Fällen der lange Tastendruck an, sofern er vom Aktor unterstützt wird (so lässt sich die Einschaltzeit bei langem Tastendruck mit lgOnTime begrenzen). Dessen Aktion wird bei powerUp nicht ausgeführt.


Verknüpfungsbezogene Register

Diese Register sind am umfangreichsten und werden für jeden Verknüpfungspartner einzeln separat angelegt in der List3 (RegL_03.<peer>). Die grundsätzlichen Funktionen und ihre Zusammenhänge sind ausführlich in der Einsteigerdokumentation erklärt, inklusive Skizzen für die sogenannte state machine. Hier sollen daher nur die in den folgenden Beispielen verwendeten Register erklärt werden.

shOnTime und lgOnTime - das interne on-for-timer von Schaltern oder Dimmern

Das wohl populärste Register begrenzt die Einschaltzeit eines Aktors. Um z.B. eine Steckdose für 10 sec bei Knopfdruck lokal einzuschalten kann man folgendes programmieren:

set <name> regSet shOnTime 10 self01

shOnTime ist dabei das zuständige Register für die Einschaltzeit bei kurzem (sh=short) Tastendruck, entsprechend gilt lgOnTime für einen langen Tastendruck.

In den Readings werden die Register mit dem jeweiligen verknüpften Taster angezeigt, in unserem Fall also:

R-self01-shOnTime

Der Defaultwert für shOnTime ist 111600 und bedeutet unendlich (von FHEM mit "unused" dargestellt), d.h. die maximale einstellbare Zeit ist 111599 sec (knapp 31 Stunden). So kann man die Zeit löschen:

set <device> regSet shOnTime 111600 self01

oder

set <device> regSet shOnTime unused self01

shCtOn und shCtOff - Bedingtes Schalten mit Schwellwerten

Fernbedienungen (im weitesten Sinne, remote) von HomeMatic übermitteln je nach Betätigungsdauer short- oder long-Trigger. Zustandsübermittelnde Sensoren (etwa ein Fensterkontakt oder Neigungssensor sowie Bewegungsmelder) senden ausschließlich short, gekoppelt mit einem Wert zwischen 0 und 200, entsprechend 0-100% in 0,5-%-Schritten. Ob ein solcher Trigger vom Aktor verarbeitet wird, kann vom gesendeten Wert abhängen.

HomeMatic kennt dazu (für jeden Peer und Triggertyp (short/long) separat) zwei Schaltschwellen Lo und Hi, die default bei 50 und 100 liegen. Ob ein Trigger in Relation zu diesen Schwellen verarbeitet wird, regeln u.a. die shCtxxx-Register. Wie auch bei den allgemeinen Schaltbedingungen stehen On und Off jeweils für den aktuellen Schaltzustand (nicht den, der erreicht werden soll). Ihr Wert beträgt default "geLo" (greater or equal Lo), hier 50 und höher. Trigger für Werte darunter werden bei der Einstellung "ltLo" (less than Lo) verarbeitet. Diese Schwellen gibt es entsprechend auch für den Hi-Wert, also "geHi" oder "ltHi". Besonders interessant sind aber auch die Werte "outside" und "between", bezogen auf die beiden Schwellen Lo und Hi. In letzterem Fall wird der Trigger verarbeitet, wenn der Wert zwischen 50 und 100 liegt, bei "outside" entsprechend bei 0-49 oder 101-200.

Sogenannte Three-State-Sensoren wie Fensterkontakt- oder -griffsensoren senden 0 für "closed" (geschlossen), 100 für "tilted" (gekippt) und 200 für "open" (offen). Gleiches gilt für Schalterkontaktinterfaces, die den Zustand eines angeschlossenen Schaltkontaktes übermitteln. Im Grundzustand (Auswahlbedingung auf "geLo") führt daher nur der Trigger "offen" (200) zu einer Aktion. Ändert man die Auswahlbedingung auf "ltLo", so wird lediglich "closed" ausgewertet, bei "between" ist es "tilted". Mit "outside" führt sowohl "closed" als auch "open" zu einer Aktion.

Bei Bewegungsmeldern wird der mit übermittelte Helligkeitswert im Zusammenhang mit den (dann variabel einzustellenden) Schwellen als Kriterium für das Einschalten des Aktors mit herangezogen.

shSwJtOn & Co. - Was soll passieren?

Nachdem wir nun kennengelernt haben, wie man auswählt, welcher Anstoss von außen zu einer Aktion führt, hier ein kleiner Exkurs in die Beeinflussung, was daraufhin passieren soll. Diese Frage regelt die jump table und liefert damit das Regelwerk für die Abfolge der Aktionen, die state machine. Ein HomeMatic-Aktor geht nämlich keineswegs einfach nur an oder aus. Vielmehr hangelt er sich nacheinander an einer Reihe von Zuständen entlang - auch das ist in der Einsteigerdokumentation erschöpfend beschrieben und soll hier nicht wiederholt werden. Ein Schalter durchläuft aber mindestens die Zustände

 Aus > Einschaltverzögerung > Ein > Ausschaltverzögerung > Aus > (usw)

Hier soll reichen, dass am Ende jeder (Teil-)Kette in der Regel ein dauerstabiler Zustand bleibt, in der Regel ist das der Aus-Zustand und auch der Ein-Zustand, wenn dessen Laufzeit nicht durch shOnTime & Co. begrenzt ist. Ein- und Ausschaltverzögerung sind aber in der Regel 0 (Sekunden), so dass effektiv nur "Ein" und "Aus" übrig bleiben.

Das Register shSwJtOn regelt, wohin die Reise geht, wenn ein gültiger short-Trigger im eingeschalteten Zustand eintrifft, sinngemäß ...Off im Auszustand und lg... für die long-Trigger. Für shSwJtOn ist normalerweise als nächstes die Ausschaltverzögerung "dlyOff" vorgesehen. Da die Ausschaltverzögerung in der Regel 0 ist, folgt darauf, in shSwJtDly festgelegt, "off" usw. Die Zustände bilden so quasi einen Kreis, dessen Durchlauf von außen gelegentlich "angeschubst" wird. Mit diesen Registern kann man den Kreislauf aber auch umbiegen oder sogar unterbrechen, so dass ein eintreffender Trigger eben nicht zu einer Aktion führt. Als Ziele bieten sich, quasi selbstsprechend, "on", "dlyOff", "off" und "dlyOn" an - oder eben "no", was nichts anderes bedeutet, als dass der betreffende Trigger an dieser Stelle zu keiner Aktion führt.

Bei einem Dimmer heißen die Register statt ..Sw.... nur ..Dim.... und es gibt ein paar mehr Bedingungen - die Funktion ist aber entsprechend gleich.


(wird ergänzt)


Praktische Beispiele

Die folgenden Beispiele beschreiben nur in Kurzform die erforderlichen Aktionen. Weiterführende Informationen sind der Einsteigerdokumentation oder den o.g. Registerbeschreibungen zu entnehmen. Übrigens: ein einmal konfigurierter Vorgang für eine Verknüpfung kann aus FHEM auch bequem fernausgelöst (bzw. simuliert) werden. Der Aktor führt dabei genau die Aktion aus, die für die benannte Verknüpfung vorgesehen ist. Der kurze Knopfdruck auf den internen Knopf eines Aktors wird beispielsweise so simuliert:

set <device> press short self01

Lokal bedienbarer Zeitschalter mit HomeMatic Aktoren: Pool für eine Stunde schalten

Ich habe einen HM-LC-SW4-DR und der channel_01 schaltet die Poolzirkulationspumpe. Dies passiert zeitgesteuert zweimal am Tag. Manchmal möchte ich im Keller diese Pumpe einfach für eine Stunde aktivieren, der Aktor ist bequem erreichbar an der Wand. Die internen Tasten vom Hauptdevice (der Aktor hat vier Kanäle (channel), die in FHEM einzeln dargestellt werden) sichtbar machen:

set LichtKeSW1 regSet intKeyVisib visib  
attr LichtKeSW1 expert 1  

Jetzt sieht man im Channel 01 - LichtKeSW1_Sw01 den internen peer self01. (Channel 02 ist self02 usw.) Also jetzt einfach die Zeit eintragen:

set LichtKeSW1 regSet shOnTime 3600 self01  

Die Toggle Funktion der Taste bleibt erhalten. Ein zweiter Tastendruck schaltet die Pumpe auch sofort wieder aus. Während die Zeit läuft, blinkt die Status LED des Kanals. Die Zeitbegrenzung funktioniert in diesem Beispiel ohne jedes Zutun von FHEM und damit auch bei einem Ausfall des Servers.

Kamine und Ventilation - nur bei offenem Fenster!

Bekanntlich ist das Verwenden von Abluftgeräten (etwa einer Dunstabzugshaube in der Küche) und Kaminen in räumlicher Nähe nur erlaubt, wenn der Betrieb nicht dazu führen kann, dass Rauchabgase in den Wohnraum gezogen werden (vereinfacht gesagt). Also sind Zusatzgeräte, die den Betrieb nur bei offenem Fenster erlauben, zwingend vorgeschrieben. Eine solche Funktion, so könnte man meinen, wird ganz einfach erreicht, indem man vor die Abzugshaube einen schaltbaren Zwischenstecker setzt und diesen mit einem Fensterkontakt verknüpft. Hat man die beiden dann mit peerChan verknüpft, so wird man feststellen, dass der Zwischenstecker mitnichten das gewünschte tut: er schaltet sich beim Öffnen des Fensters abwechselnd ein und aus und ignoriert das geschlossene Fenster komplett.

Verantwortlich für dieses "Fehlverhalten" sind die Register shCtOn und shCtOff. Beide stehen nach der Verknüpfung auf "geLo". Wie bei den Registern oben erläutert, führt in diesem Fall nur die "offen"-Meldung des Fensterkontaktes zu einer Aktion. Das Öffnen des Fenster soll den Aktor einschalten, das klappt. Das Schließen des Fensters soll den eingeschalteten Aktor aber ausschalten. Also muss die Schaltbedingung im On-Zustand geändert werden (die Bezeichnungen natürlich durch die realen Namen des Schaltaktorkanals und des Fensterkontaktes ersetzen):

set <Schalter> regSet shCtOn ltLo <Fensterkontakt>

Nun führt auch das Schließen des Fensters wunschgemäß stets zu einem Abschalten des Zwischensteckers. shCtOff muss auf "geLo" bleiben!

Lampe mit Kippschalter(n) fernschalten - eindeutig oder als Wechselschaltung

Oft besteht der Wunsch, eine Lampe mit einem herkömmlichen Schalter (statt eines Tasters) fernzuschalten. So kann man einen herkömmlichen Schalter mit einer Schließerkontaktinterface wie dem HM-SCI-3-FM ergänzen (oder einem Kanal des 8-Kanal-Sendemoduls in der Betriebsart sensor) und wiederum die Verknüpfung mit dem Lampen-Aktor setzen. Ganz ähnlich wie bei der vorgenannten Kaminaufgabe führt nun aber das Schließen des Schalters nicht zu einem Einschalten. Daher ist nun

set <Lampenaktor> regSet shCtOff ltLo <Sensorkontakt>

das Mittel der Wahl, shCtOn muss dieses Mal auf "geLo" bleiben. Jetzt folgt der Aktor dem (sichtbaren) Schaltzustand des Schaltes - zumindest solange er nicht anderweitig ein- oder ausgeschaltet wird.

Nun kann man auch mehrere Schalter so mit der Lampe koppeln. Das ergibt aber keine Wechselschaltung im herkömmlichen Sinn - um eine Lampe ein- oder auszuschalten, muss man den Schalter möglicherweise einmal zusätzlich auf die aktuelle Schaltposition kippen, ehe die nächste Betätigung den gewünschten Effekt bringt. Für Wechselschaltungen bietet sich daher das Kontaktinterface HM-Swi-3-FM (oder das erwähnte 8-Kanal-Sendemodul in der Betriebsart switch) an. Hier führt jede Zustandsänderung zu einem Schaltvorgang.

Hat man hingegen nur ein HM-SCI-3-FM zur Hand, lässt sich dieses Verhalten auch erreichen:

set <Lampenaktor> regSet shCtOn outside <Sensorkontakt>
set <Lampenaktor> regSet shCtOff outside <Sensorkontakt>

Gezieltes Schalten eines (unsichtbaren) Aktors mit nur einer Taste

Für so etwas braucht man gewöhnlich zwei Tasten. Koppelt man einen Schalt-Aktor mit nur einer Taste ("single" beim peerChan-Kommando), so führt sowohl ein kurzer als auch ein langer Tastendruck immer nur zu einem Umschalten des Zustandes. Das ist unschön, wenn man den aktuellen Zustand nicht einsehen kann.

Üblicherweise sind die Schaltabfolgen für eine Eintasten-Verknüpfung sowohl für kurze als auch lange Betätigungen gleich (bei Dimmern wird auf langen Tastendruck hingegen abwechselnd auf- oder abgedimmt).

shSwJtOff = dlyOn	# Ist Gerät aus, wird Einschaltverzögerung gewählt (die aber normal 0 ist)
lgSwJtOff = dlyOn	# dito, für lang
shSwJtOn = dlyOff	# Ist Gerät an, wird Ausschaltverzögerung gewählt (die aber normal 0 ist)
lgSwJtOn = dlyOff	# dito, für lang

Hier kann man sich zunutze machen, dass man mit einem gezielten "no" oder "dlyOn" bzw. "dlyOff" im richtigen Register die Schaltfolge abbrechen oder umbiegen kann. Möchte man das Gerät <aktor> mit einem kurzen Tastendruck auf <button> ein- und mit einem langen Tastendruck ausschalten, so ändere man:

set <aktor> regSet shSwJtOn dlyOn <button>
set <aktor> regSet lgSwJtOff dlyOff <button>

So laufen die entsprechenden Aktionen quasi ins Leere, wenn der Aktor bereits den gewünschten Zustand hat.

Den umgekehrten Effekt (lang schaltet ein, kurz aus) erreicht man entsprechend mit

set <aktor> regSet shSwJtOff dlyOff <button>
set <aktor> regSet lgSwJtOn dlyOn <button>

Welche Bedienhaptik man nun bevorzugt, muss man selbst entscheiden. In der Regel sollte die normale (sichere) Aktion "kurz" und die gefährlichere "lang" sein - eine PC-Stromversorgung mit einem kurzen Tastendruck versehentlich einzuschalten ist bestimmt besser als auszuschalten (das dann eben nur über lang) - für ein potentiell gefährliches Arbeitsgerät wie einen Heizofen wird es sicher andersherum sein.

Sinngemäß verwendet der Autor sozusagen eine Hälfte davon als "Sicherheitsaktion" für einen HM-LC-Sw2PB-FM Schaltaktor mit Tasteraufsatz 2fach - der gewöhnliche Tastendruck auf die zugehörige Wippenseite schaltet den Aktor abwechselnd ein und aus, ein langer Tastendruck immer aus, dafür reicht:

set <aktor> regSet lgSwJtOff dlyOff <button>

Übrigens: Nichts anderes wird normalerweise auch automatisch beim Verknüpfen eines Aktors mit einem Tastenpaar an der entsprechenden Stelle gemacht - ist eine Taste nur zum Ausschalten gedacht, so wird in beiden Schaltzuständen entsprechend "dlyOff" eingetragen. Als "Sprungziel" müsste aber genauso gut auch "no" funkionieren.