HomeMatic Register programmieren: Unterschied zwischen den Versionen
K ((Format-)Korrekturen) |
K (Link auf nicht existierende Seite entfernt) |
||
(11 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
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. | ||
== Grundlagen (in Auszügen) == | == Grundlagen (in Auszügen) == | ||
Im folgenden werden nur exemplarisch einige Grundlagen und einfache Beispiele benannt, ohne jeden Anspruch auf Vollständigkeit. | 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. | FHEM unterstützt die Programmierung der Register mit dem Befehl ''regSet''. <peer> entfällt bei rein gerätebezogenen Programmierungen. | ||
:<code>set <name> regSet <register> <value> [<peer>] </code> | :<code>set <name> regSet <register> <value> [<peer>] </code> | ||
Darüberhinaus gibt es vor- oder selbstdefinierte [[ | Darüberhinaus gibt es vor- oder selbstdefinierte [[HomeMatic HMinfo Templates erstellen|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 (HomeMatic)|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). | Die HomeMatic Aktoren (Schalter, Dimmer, ...) arbeiten so, wie es für verknüpften ([[Peering (HomeMatic)|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). | ||
Zeile 35: | Zeile 31: | ||
=== Gerätebezogene Register === | === 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). | 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 ==== | ==== ''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 | 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 (Achtung: unüblich hier '''in Minuten'''!) nach dem Versorgen mit Strom (powerUp) erreicht man den Konfigurationsmodus wie bisher, danach interpretiert der Aktor die Tastendrücke als kurz (short) oder lang (long), sofern die Firmware das unterstützt (bei den versenkbaren Schalt-, dimm- und Rollladenaktoren bspw. ist das offenbar erst ab Firmware 2.5 gegeben). Ein versehentlicher Reset sollte so aber in jedem Fall vermeidbar sein. Beispiel: | ||
:<code>set <name> regSet confBtnTime 2</code> | :<code>set <name> regSet confBtnTime 2</code> | ||
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. | 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 ==== | ==== ''intKeyVisib'' - Interne Tasten sichtbar machen ==== | ||
Zeile 52: | Zeile 46: | ||
Wer nun auf die Idee kommt, man könne durch entsprechendes zusätzliches peering bei mehrkanaligen Geräten die (mehreren) internen Tasten beliebig zuweisen und so raffinierte Zusatzschaltungen auslösen, muss hier enttäuscht werden: Zwar kann man tatsächlich mit peerBulk bei den Aktorkanälen zusätzliche interne Peers eintragen und programmieren und mit einer Fernauslösung aus FHEM die neuen Verknüpfungen erfolgreich nutzen - das Gerät selbst reicht die Tastenbetätigungen aber immer nur an den ursprünglich dafür vorgesehenen Kanal weiter. | Wer nun auf die Idee kommt, man könne durch entsprechendes zusätzliches peering bei mehrkanaligen Geräten die (mehreren) internen Tasten beliebig zuweisen und so raffinierte Zusatzschaltungen auslösen, muss hier enttäuscht werden: Zwar kann man tatsächlich mit peerBulk bei den Aktorkanälen zusätzliche interne Peers eintragen und programmieren und mit einer Fernauslösung aus FHEM die neuen Verknüpfungen erfolgreich nutzen - das Gerät selbst reicht die Tastenbetätigungen aber immer nur an den ursprünglich dafür vorgesehenen Kanal weiter. | ||
==== ''ledMode'' - Funktion der Onboard-LED bei Bausätzen ==== | ==== ''ledMode'' - Funktion der Onboard-LED bei Bausätzen ==== | ||
Zeile 62: | Zeile 55: | ||
Leider lässt sich umgekehrt die bei Wandtastern oder Fensterkontakten mitunter gewünschte Deaktivierung der LED nicht so bewerkstelligen - diese Geräte haben das entsprechende Register nicht. Da hilft nur ein Eingriff ins Gerät mit Gaffa oder schwarzem Edding... | Leider lässt sich umgekehrt die bei Wandtastern oder Fensterkontakten mitunter gewünschte Deaktivierung der LED nicht so bewerkstelligen - diese Geräte haben das entsprechende Register nicht. Da hilft nur ein Eingriff ins Gerät mit Gaffa oder schwarzem Edding... | ||
=== Kanalbezogene Register === | === 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). | 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 ==== | ==== ''powerUpAction'' - Automatischer Knopfdruck bei (wiederkehrender) Stromversorgung ==== | ||
Zeile 72: | Zeile 63: | ||
:<code>set <name> regSet powerUpAction on</code> | :<code>set <name> regSet powerUpAction on</code> | ||
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. | 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 === | === 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. | 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 ==== | ==== ''shOnTime'' und ''lgOnTime'' - das interne ''on-for-timer'' von Schaltern oder Dimmern ==== | ||
Zeile 86: | Zeile 75: | ||
In den Readings werden die Register mit dem jeweiligen verknüpften Taster angezeigt, in unserem Fall also: | In den Readings werden die Register mit dem jeweiligen verknüpften Taster angezeigt, in unserem Fall also: | ||
:<code>R-self01-shOnTime </code> | :<code>R-self01-shOnTime </code> | ||
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: | 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: | ||
:<code>set <device> regSet shOnTime 111600 self01 </code> | :<code>set <device> regSet shOnTime 111600 self01 </code> | ||
Zeile 93: | Zeile 81: | ||
Übrigens gibt es diese Register auch für die Ausschaltzeit. | Übrigens gibt es diese Register auch für die Ausschaltzeit. | ||
==== ''shCtOn'' und ''shCtOff'' - Bedingtes Schalten mit Schwellwerten ==== | ==== ''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. | 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 (Achtung: 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. | HomeMatic kennt dazu (für jeden Peer und Triggertyp (short/long) separat, festgelegt in den Registern shCtValLo, shCtValHi, lgCtValLo und lgCtValHi) 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 (Achtung: 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 (Vergleichsbefehl auf "geLo") führt daher nur der Trigger "offen" (200) zu einer Aktion. Ändert man den Vergleichsbefehl auf "ltLo", so wird lediglich "closed" ausgewertet, bei "between" ist es "tilted". Mit "outside" führt sowohl "closed" als auch "open" zu einer Aktion. | 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 (Vergleichsbefehl auf "geLo") führt daher nur der Trigger "offen" (200) zu einer Aktion. Ändert man den Vergleichsbefehl 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. | 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? ==== | ==== ''shSwJtOn'' & Co. - Was soll passieren? ==== | ||
Zeile 114: | Zeile 100: | ||
Bei einem Dimmer heißen die Register statt ''..Sw....'' nur ''..Dim....'' und es gibt ein paar mehr Bedingungen - die Funktion ist aber entsprechend gleich. | Bei einem Dimmer heißen die Register statt ''..Sw....'' nur ''..Dim....'' und es gibt ein paar mehr Bedingungen - die Funktion ist aber entsprechend gleich. | ||
==== ''shActionType'' & ''lgActionType'' - ein weiterer Aktions-Hauptschalter ==== | |||
Das Regelwerk von shSwJtxx & Co. wird zudem von den ActionType-Registern generell beeinflusst. Für einen Schalter gibt es neben der Voreinstellung ''jmpToTarget'' (was nichts anderes bedeutet als dass die Sprungtabelle aus dem vorigen Kapitel verwendet wird) und der Einstellung ''off'' (die die Sprungtabelle komplett deaktiviert und somit keine Trigger dieses Typs mehr zulässt) noch ''toggleToCnt'' und ''toggleToCntInv''. Hierbei wird die fortlaufende Triggernummer für die Entscheidungsfindung berücksichtigt und etwa eine Umschaltaktion (toggle) mit geraden oder ungeraden Triggernummern synchronisiert. Jeder ausgesendete Trigger trägt nämlich eine ein Byte große Triggernummer (0...255), in FHEM zu erkennen etwa an "Short_7". Nützlich ist das eigentlich nur bei mehreren Aktoren, die man mit einer Taste synchron umschalten möchte. Ohne ''toggleTo...'' würden die Aktoren nämlich nur einfach umschalten, was anfangs sicher problemlos funktioniert, aber schon ein verlorener Funkbefehl oder eine andere manuelle Aktorschaltung zerstört die Synchronisierung. Schaltet man alle Aktoren nun in diesem Register gleich, so werden sie beim Eintreffen eines Triggers (natürlich nur von diesem Peer!) immer synchron bleiben - jeder Aktor, den man davon abweichend mit der anderen ''toggleTo...''-Einstellung versieht, wird entsprechend immer gegenläufig schalten. | |||
Bei Dimmern gibt es zudem noch ''updim'', ''downDim'', ''toggelDim'' und die entsprechenden Synchronschalter ''toggelDimCnt'' und ''toggelDimCntInv''. Sie legen für Dimmer die Dimmrichtung fest (was durchaus auch für kurze Tastendrücke möglich ist, aber eigentlich nur für lange Tastendrücke - zusammen mit ''lgMultiExec = on'', was für eine kontinuierliche Wiederholung von Triggern sorgt, solange die Taste gedrückt bleibt - einen Sinn ergibt. ''(Anmerkung: toggelDim ist aktuell tatsächlich korrekt, aber Sicht des Autors dabei schlicht ein Schreibfehler ... toggleDim wäre richtiger)'' | |||
==== ''shOnDly'' und ''shOffDly'' - es muss nicht immer sofort sein! ==== | ==== ''shOnDly'' und ''shOffDly'' - es muss nicht immer sofort sein! ==== | ||
Zeile 119: | Zeile 109: | ||
Bei Dimmern gibt es zusätzlich auch bei Ein- und Ausschaltvorgängen durch eine neu eingerichtete Verknüpfung eine sogenannte Rampenzeit von 0,5 Sekunden, in der das Licht hoch- oder heruntergedimmt wird. Durch Programmierung von ''shRampOnTime'' und ''shRampOffTime'' kann man ein sehr augenschonendes langsames Ein- oder Ausschalten des Lichts wie im Kino erreichen. Zwar gibt es die Zeiten auch für long-Trigger, aber da machen sie im Normalfall wenig Sinn - der lange Tastendruck löst immer einen manuellen Dimmvorgang aus. | Bei Dimmern gibt es zusätzlich auch bei Ein- und Ausschaltvorgängen durch eine neu eingerichtete Verknüpfung eine sogenannte Rampenzeit von 0,5 Sekunden, in der das Licht hoch- oder heruntergedimmt wird. Durch Programmierung von ''shRampOnTime'' und ''shRampOffTime'' kann man ein sehr augenschonendes langsames Ein- oder Ausschalten des Lichts wie im Kino erreichen. Zwar gibt es die Zeiten auch für long-Trigger, aber da machen sie im Normalfall wenig Sinn - der lange Tastendruck löst immer einen manuellen Dimmvorgang aus. | ||
''(wird ergänzt)'' | ''(wird ergänzt)'' | ||
== Praktische Beispiele == | == Praktische Beispiele == | ||
Zeile 129: | Zeile 116: | ||
Ü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: | Ü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: | ||
:<code>set <device> press short self01 </code> | :<code>set <device> press short self01 </code> | ||
=== Lokal bedienbarer Zeitschalter mit HomeMatic Aktoren: Pool für eine Stunde schalten === | === Lokal bedienbarer Zeitschalter mit HomeMatic Aktoren: Pool für eine Stunde schalten === | ||
Zeile 143: | Zeile 129: | ||
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 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. | Die Zeitbegrenzung funktioniert in diesem Beispiel ohne jedes Zutun von FHEM und damit auch bei einem Ausfall des Servers. | ||
=== Es werde Licht! Automatisches Licht mit Tor oder Tür === | === Es werde Licht! Automatisches Licht mit Tor oder Tür === | ||
Zeile 160: | Zeile 145: | ||
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. | 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 | 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 | Hat man hingegen nur ein HM-SCI-3-FM zur Hand, lässt sich dieses Verhalten auch erreichen. | ||
:<code>set <Lampenaktor> regSet shCtOn outside <Sensorkontakt> </code> | :<code>set <Lampenaktor> regSet shCtOn outside <Sensorkontakt> </code> | ||
:<code>set <Lampenaktor> regSet shCtOff outside <Sensorkontakt> </code> | :<code>set <Lampenaktor> regSet shCtOff outside <Sensorkontakt> </code> | ||
Wie oben erwähnt, liegen die Trigger mit den Werten 0 und 200 ja außerhalb des Bereichs zwischen Lo und Hi (50-100) und führen daher immer zu einer Aktion. Das Verhalten entspricht somit einem toggle-Befehl. | |||
=== Gezieltes Schalten eines (unsichtbaren) Aktors mit nur einer Taste === | === Gezieltes Schalten eines (unsichtbaren) Aktors mit nur einer Taste === | ||
Zeile 191: | Zeile 176: | ||
Ü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. | Ü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. | ||
=== WARNUNG! - Selbsttätiges Blinken eines HM-Aktors === | === WARNUNG! - Selbsttätiges Blinken eines HM-Aktors === | ||
Zeile 198: | Zeile 182: | ||
Wir wissen aber, dass die Aktoren für jeden Peer nicht nur eine Ein-, sondern auch eine Ausschaltzeit speichern. Definiert man nun für einen Peer entsprechend beide Zeiten, so wird der Aktor bei einem Telegramm von diesem Peer sich entsprechend selbsttätig fortlaufend ein- und ausschalten. Jeder andere Schaltbefehl eines anderen Peers oder aus FHEM beendet die Schleife umgehend. So ließe sich das Blinken auch mit einer aktoreigenen Taste stoppen - oder starten, wenn man es entsprechend programmiert. Einen Zwischenstecker-Schalter beispielsweise kann man also (wenn man zuvor seine ''confBtnTime'' entsprechend setzt und so die langen Tastendrücke auswertbar macht) durch das Programmieren von ''lgOnTime'' und ''lgOffTime'' für den Peer "self01" wie gewohnt mit einem kurzen Tastendruck ein- und ausschalten und mit einem langen in den Blinkmodus versetzen. | Wir wissen aber, dass die Aktoren für jeden Peer nicht nur eine Ein-, sondern auch eine Ausschaltzeit speichern. Definiert man nun für einen Peer entsprechend beide Zeiten, so wird der Aktor bei einem Telegramm von diesem Peer sich entsprechend selbsttätig fortlaufend ein- und ausschalten. Jeder andere Schaltbefehl eines anderen Peers oder aus FHEM beendet die Schleife umgehend. So ließe sich das Blinken auch mit einer aktoreigenen Taste stoppen - oder starten, wenn man es entsprechend programmiert. Einen Zwischenstecker-Schalter beispielsweise kann man also (wenn man zuvor seine ''confBtnTime'' entsprechend setzt und so die langen Tastendrücke auswertbar macht) durch das Programmieren von ''lgOnTime'' und ''lgOffTime'' für den Peer "self01" wie gewohnt mit einem kurzen Tastendruck ein- und ausschalten und mit einem langen in den Blinkmodus versetzen. | ||
Einen Haken hat die Sache aber | Einen Haken hat die Sache aber: Der Aktor meldet seinen neuen Schaltzustand nach jeder Änderung mit einer gewissen Verzögerung, die man bei vielen Schaltaktoren (aber leider nicht bei allen wie etwa dem HM-Mod-Re-8) mit dem Register ''statusInfoMinDly'' tunen kann. Ändert der Aktor seinen Schaltzustand in längeren Intervallen, wird es also trotzdem wieder ein Funkfeuer geben. Ist das Delay noch nicht erreicht, erfolgt keine Zustandsübermittlung. Beim HM-Mod-Re-8 muss man also etwa unter 1 Sekunde pro Änderung bleiben. | ||
Zum Steuern aus FHEM emfiehlt es sich, virtuelle Buttons (etwa einer VCCU oder eines virtuellen HM-Dummys) zum Ein- und Ausschalten der Blinkfunktion zu verwenden. "Opfert" man dafür zwei aufeinanderfolgende Kanäle, kann man die Aktoren mit "dual set" peeren und bekommt so einen Blink- und einen Deaktivierungsbutton ohne weitere Kopfstände. Anschließend passt man die short-Laufzeiten für den Einschaltkanal an. | |||
Ein Beispiel für einen Dimmer (als virtuelle Buttons dienen vccu_Btn8 und vccuBtn9): | Ein Beispiel für einen Dimmer (als virtuelle Buttons dienen vccu_Btn8 und vccuBtn9): | ||
:<code>set <vccu_Btn8 | :<code>set <vccu_Btn8 peerChan 0 <dimmerkanal> dual set</code> | ||
Nun kann man mit "set vccu_Btn9 press short" den Dimmer ein- und mit "set vccu_Btn8 press short" ausschalten. Das Blinken im Dimmer wird eingestellt mit | Nun kann man mit "set vccu_Btn9 press short" den Dimmer ein- und mit "set vccu_Btn8 press short" ausschalten. Das Blinken im Dimmer wird eingestellt mit | ||
Zeile 210: | Zeile 194: | ||
:<code>set dimmer regSet shOnTime 1 vccu_Btn9</code> | :<code>set dimmer regSet shOnTime 1 vccu_Btn9</code> | ||
:<code>set dimmer regSet shOffTime 1 vccu_Btn9</code> | :<code>set dimmer regSet shOffTime 1 vccu_Btn9</code> | ||
jeweils für die gewünschte Ein- und Ausschaltzeit. | |||
Wird der Dimmer nun mit "set vccu_Btn9 press short" eingeschaltet, so blinkt er im 3-Sekunden-Takt: zu den jeweils 1 Sekunde Ein- und Auszeit gesellen sich noch 2x 0,5s Rampenzeit, sofern nichts anderes programmiert wurde. | Wird der Dimmer nun mit "set vccu_Btn9 press short" eingeschaltet, so blinkt er im 3-Sekunden-Takt: zu den jeweils 1 Sekunde Ein- und Auszeit gesellen sich noch 2x 0,5s Rampenzeit, sofern nichts anderes programmiert wurde. | ||
Das funktioniert auch mit Schaltern: So würde 0.1 und 0.9 (Sekunden) ein kurzes Blitzen im Sekundentakt einstellen. | |||
Natürlich kann man nun eine größere Anzahl von Aktoren mit den virtuellen Buttons peeren und so ein ganzes Feuerwerk zünden ... Eine zusätzlich zu Alarmsirenen wild blinkende Innenbeleuchtung in allen Räumen sorgt sicher für zusätzliche Aufmerksamkeit. | |||
=== Einer nach dem Anderen! - Sequentielles Schalten mehrerer Aktoren === | === Einer nach dem Anderen! - Sequentielles Schalten mehrerer Aktoren === | ||
Zeile 220: | Zeile 206: | ||
Hat man drei Aktoren "Aussenlicht1...3" mit dem Taster "Aussenlicht_Ein" gepeert, so erreicht man auf folgende Weise, dass sie beim Einschalten mit einer Verzögerung von jeweils einer Sekunde nacheinander einschalten. | Hat man drei Aktoren "Aussenlicht1...3" mit dem Taster "Aussenlicht_Ein" gepeert, so erreicht man auf folgende Weise, dass sie beim Einschalten mit einer Verzögerung von jeweils einer Sekunde nacheinander einschalten. | ||
:<code>set Aussenlicht2 regSet shOnDly 1 Aussenlicht_Ein</code> | :<code>set Aussenlicht2 regSet shOnDly 1 Aussenlicht_Ein</code> | ||
:<code>set Aussenlicht3 regSet shOnDly 2 Aussenlicht_Ein</code> | :<code>set Aussenlicht3 regSet shOnDly 2 Aussenlicht_Ein</code> | ||
[[Kategorie:HomeMatic Components|1toolsAndWork]] | |||
[[Kategorie:HomeMatic Components]] |
Aktuelle Version vom 3. Dezember 2021, 13:24 Uhr
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 (Achtung: unüblich hier in Minuten!) nach dem Versorgen mit Strom (powerUp) erreicht man den Konfigurationsmodus wie bisher, danach interpretiert der Aktor die Tastendrücke als kurz (short) oder lang (long), sofern die Firmware das unterstützt (bei den versenkbaren Schalt-, dimm- und Rollladenaktoren bspw. ist das offenbar erst ab Firmware 2.5 gegeben). Ein versehentlicher Reset sollte so aber in jedem Fall vermeidbar sein. 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 wie bei einem externen Peer umprogrammiert werden.
Wer nun auf die Idee kommt, man könne durch entsprechendes zusätzliches peering bei mehrkanaligen Geräten die (mehreren) internen Tasten beliebig zuweisen und so raffinierte Zusatzschaltungen auslösen, muss hier enttäuscht werden: Zwar kann man tatsächlich mit peerBulk bei den Aktorkanälen zusätzliche interne Peers eintragen und programmieren und mit einer Fernauslösung aus FHEM die neuen Verknüpfungen erfolgreich nutzen - das Gerät selbst reicht die Tastenbetätigungen aber immer nur an den ursprünglich dafür vorgesehenen Kanal weiter.
ledMode - Funktion der Onboard-LED bei Bausätzen
Die (batteriebetriebenen) -PCB-Aktoren und die 8-Kanal-Module haben kleine LED an Bord, die für Diagnosezwecke hilfreich sind, einem sparsamen Betrieb aber in der Regel entgegenstehen. Sie werden daher nur bei außergewöhnlichen Zuständen wie dem Anlernmodus, einem Reset, oder auch bei niedriger Batteriespannung als Hinweis an den Anwender benutzt und sind ansonsten ab Werk deaktiviert. Bei einer Dauerstromversorgung kann aber eine Schaltzustandsanzeige oder eine Quittung über eine Befehlsaussendung nicht nur zur Diagnose hilfreich sein.
Besitzt das Gerät das Register ledMode, so kann man mit
set <device> regSet ledMode on
die LED auch für die "normalen" Betriebszustände aktivieren. Sie zeigen dann bei Aktoren, ob der Aktor eingeschaltet ist (blinkend, wenn eine Einschaltzeitbegrenzung aktiv ist), und bei den Sensormodulen HM-Mod-EM8(bit) zeigt die zweifarbige LED den von Fernbedienungen bekannten Sendezustand mit gelb, dem dann ein grün oder rot folgt - je nachdem ob eine Quittung angefordert ist und ob sie erfolgreich empfangen wurde.
Leider lässt sich umgekehrt die bei Wandtastern oder Fensterkontakten mitunter gewünschte Deaktivierung der LED nicht so bewerkstelligen - diese Geräte haben das entsprechende Register nicht. Da hilft nur ein Eingriff ins Gerät mit Gaffa oder schwarzem Edding...
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
Die wohl populärsten Register begrenzen 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
Übrigens gibt es diese Register auch für die Ausschaltzeit.
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, festgelegt in den Registern shCtValLo, shCtValHi, lgCtValLo und lgCtValHi) 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 (Achtung: 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 (Vergleichsbefehl auf "geLo") führt daher nur der Trigger "offen" (200) zu einer Aktion. Ändert man den Vergleichsbefehl 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.
shActionType & lgActionType - ein weiterer Aktions-Hauptschalter
Das Regelwerk von shSwJtxx & Co. wird zudem von den ActionType-Registern generell beeinflusst. Für einen Schalter gibt es neben der Voreinstellung jmpToTarget (was nichts anderes bedeutet als dass die Sprungtabelle aus dem vorigen Kapitel verwendet wird) und der Einstellung off (die die Sprungtabelle komplett deaktiviert und somit keine Trigger dieses Typs mehr zulässt) noch toggleToCnt und toggleToCntInv. Hierbei wird die fortlaufende Triggernummer für die Entscheidungsfindung berücksichtigt und etwa eine Umschaltaktion (toggle) mit geraden oder ungeraden Triggernummern synchronisiert. Jeder ausgesendete Trigger trägt nämlich eine ein Byte große Triggernummer (0...255), in FHEM zu erkennen etwa an "Short_7". Nützlich ist das eigentlich nur bei mehreren Aktoren, die man mit einer Taste synchron umschalten möchte. Ohne toggleTo... würden die Aktoren nämlich nur einfach umschalten, was anfangs sicher problemlos funktioniert, aber schon ein verlorener Funkbefehl oder eine andere manuelle Aktorschaltung zerstört die Synchronisierung. Schaltet man alle Aktoren nun in diesem Register gleich, so werden sie beim Eintreffen eines Triggers (natürlich nur von diesem Peer!) immer synchron bleiben - jeder Aktor, den man davon abweichend mit der anderen toggleTo...-Einstellung versieht, wird entsprechend immer gegenläufig schalten.
Bei Dimmern gibt es zudem noch updim, downDim, toggelDim und die entsprechenden Synchronschalter toggelDimCnt und toggelDimCntInv. Sie legen für Dimmer die Dimmrichtung fest (was durchaus auch für kurze Tastendrücke möglich ist, aber eigentlich nur für lange Tastendrücke - zusammen mit lgMultiExec = on, was für eine kontinuierliche Wiederholung von Triggern sorgt, solange die Taste gedrückt bleibt - einen Sinn ergibt. (Anmerkung: toggelDim ist aktuell tatsächlich korrekt, aber Sicht des Autors dabei schlicht ein Schreibfehler ... toggleDim wäre richtiger)
shOnDly und shOffDly - es muss nicht immer sofort sein!
Nicht nur welcher Anstoße welche Aktion auslöst, sondern auch wann oder wie schnell die Aktion ausgeführt wird, lässt sich in gewissen Grenzen einstellen. Die beiden genannten Register etwa regeln die Ein- oder Ausschaltverzögerung nach einem gültigen Trigger. So kann man nach einem Ausschaltbefehl einen Raum noch im Hellen verlassen, wenn das Licht noch ein paar Sekunden länger leuchtet.
Bei Dimmern gibt es zusätzlich auch bei Ein- und Ausschaltvorgängen durch eine neu eingerichtete Verknüpfung eine sogenannte Rampenzeit von 0,5 Sekunden, in der das Licht hoch- oder heruntergedimmt wird. Durch Programmierung von shRampOnTime und shRampOffTime kann man ein sehr augenschonendes langsames Ein- oder Ausschalten des Lichts wie im Kino erreichen. Zwar gibt es die Zeiten auch für long-Trigger, aber da machen sie im Normalfall wenig Sinn - der lange Tastendruck löst immer einen manuellen Dimmvorgang aus.
(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.
Es werde Licht! Automatisches Licht mit Tor oder Tür
Im Kühlschrank geht das Licht ja schon praktischerweise automatisch an und aus, aber es gibt auch andere Situationen, in denen ein automatisches Licht sehr nützlich sein kann - in dunklen Abstellräumen oder Garagen. Vor allem weil man nicht vergessen kann es auszuschalten, weil es auch von allein ausgeht. Eine solche Funktion, so könnte man meinen, wird ganz einfach erreicht, indem man das Licht mit einem Aktor schalten lässt und diesen mit einem Tür- oder Fensterkontakt verknüpft. Hat man die beiden dann mit peerChan verknüpft, so wird man feststellen, dass das Licht mitnichten das Gewünschte tut: es schaltet sich beim Öffnen der Tür abwechselnd ein und aus und ignoriert das Schließen der Tür 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 Türkontaktes zu einer Aktion. Das Öffnen der Tür soll den Aktor einschalten, das klappt. Das Schließen der Tür 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 Türkontaktes ersetzen):
set <Schalter> regSet shCtOn ltLo <Türkontakt>
Nun führt auch das Schließen der Tür wunschgemäß stets zu einem Abschalten des Lichts. shCtOff muss auf "geLo" bleiben!
Kombinieren ließe sich das noch mit einer Laufzeitbegrenzung etwa für eine Stunde - sollte man die Tür versehentlich offenlassen, so brennt das Licht nicht stundenlang. Vor allem geht das Licht dann auch aus, wenn aus welchem Grund auch immer die Schließmeldung verloren geht.
set <Schalter> regSet shOnTime 3600 <Türkontakt>
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 Abstellraum-Aufgabe 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>
Wie oben erwähnt, liegen die Trigger mit den Werten 0 und 200 ja außerhalb des Bereichs zwischen Lo und Hi (50-100) und führen daher immer zu einer Aktion. Das Verhalten entspricht somit einem toggle-Befehl.
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.
WARNUNG! - Selbsttätiges Blinken eines HM-Aktors
Statt einer separaten Warnleuchte kann es durchaus sinnvoll sein, eine vorhandene Lampe zu Warnzwecken periodisch ein- und auszuschalten. Leider beherrschen die HomeMatic-Aktoren keine direkt aus FHEM erreichbare Blinkfunktion (ähnlich dem on-for-timer für eine Zeitbegrenzung), und das rhythmische Ein- und Ausschalten aus FHEM erzeugt eine recht hohe Funklast.
Wir wissen aber, dass die Aktoren für jeden Peer nicht nur eine Ein-, sondern auch eine Ausschaltzeit speichern. Definiert man nun für einen Peer entsprechend beide Zeiten, so wird der Aktor bei einem Telegramm von diesem Peer sich entsprechend selbsttätig fortlaufend ein- und ausschalten. Jeder andere Schaltbefehl eines anderen Peers oder aus FHEM beendet die Schleife umgehend. So ließe sich das Blinken auch mit einer aktoreigenen Taste stoppen - oder starten, wenn man es entsprechend programmiert. Einen Zwischenstecker-Schalter beispielsweise kann man also (wenn man zuvor seine confBtnTime entsprechend setzt und so die langen Tastendrücke auswertbar macht) durch das Programmieren von lgOnTime und lgOffTime für den Peer "self01" wie gewohnt mit einem kurzen Tastendruck ein- und ausschalten und mit einem langen in den Blinkmodus versetzen.
Einen Haken hat die Sache aber: Der Aktor meldet seinen neuen Schaltzustand nach jeder Änderung mit einer gewissen Verzögerung, die man bei vielen Schaltaktoren (aber leider nicht bei allen wie etwa dem HM-Mod-Re-8) mit dem Register statusInfoMinDly tunen kann. Ändert der Aktor seinen Schaltzustand in längeren Intervallen, wird es also trotzdem wieder ein Funkfeuer geben. Ist das Delay noch nicht erreicht, erfolgt keine Zustandsübermittlung. Beim HM-Mod-Re-8 muss man also etwa unter 1 Sekunde pro Änderung bleiben.
Zum Steuern aus FHEM emfiehlt es sich, virtuelle Buttons (etwa einer VCCU oder eines virtuellen HM-Dummys) zum Ein- und Ausschalten der Blinkfunktion zu verwenden. "Opfert" man dafür zwei aufeinanderfolgende Kanäle, kann man die Aktoren mit "dual set" peeren und bekommt so einen Blink- und einen Deaktivierungsbutton ohne weitere Kopfstände. Anschließend passt man die short-Laufzeiten für den Einschaltkanal an.
Ein Beispiel für einen Dimmer (als virtuelle Buttons dienen vccu_Btn8 und vccuBtn9):
set <vccu_Btn8 peerChan 0 <dimmerkanal> dual set
Nun kann man mit "set vccu_Btn9 press short" den Dimmer ein- und mit "set vccu_Btn8 press short" ausschalten. Das Blinken im Dimmer wird eingestellt mit
set dimmer regSet shOnTime 1 vccu_Btn9
set dimmer regSet shOffTime 1 vccu_Btn9
jeweils für die gewünschte Ein- und Ausschaltzeit.
Wird der Dimmer nun mit "set vccu_Btn9 press short" eingeschaltet, so blinkt er im 3-Sekunden-Takt: zu den jeweils 1 Sekunde Ein- und Auszeit gesellen sich noch 2x 0,5s Rampenzeit, sofern nichts anderes programmiert wurde.
Das funktioniert auch mit Schaltern: So würde 0.1 und 0.9 (Sekunden) ein kurzes Blitzen im Sekundentakt einstellen.
Natürlich kann man nun eine größere Anzahl von Aktoren mit den virtuellen Buttons peeren und so ein ganzes Feuerwerk zünden ... Eine zusätzlich zu Alarmsirenen wild blinkende Innenbeleuchtung in allen Räumen sorgt sicher für zusätzliche Aufmerksamkeit.
Einer nach dem Anderen! - Sequentielles Schalten mehrerer Aktoren
Eine großflächige Beleuchtung mit viel Leistung sollte man aus Lastgründen niemals zugleich einschalten. Auch LED-Lampen ziehen im Einschaltmoment, wennauch extrem kurz, beträchtliche Ströme, die die von gewöhnlichen Glühlampen deutlich übersteigen können. Schaltet man mehrere Aktoren gleichzeitig mit einer Taste, so hilft eine individuelle Verzögerung des Einschaltvorgangs in jedem Aktor, die Sicherung vor dem Herausfliegen zu bewahren. Oder man macht gezielt einen Effekt daraus. Der Phantasie sind wenig Grenzen gesetzt...
Hat man drei Aktoren "Aussenlicht1...3" mit dem Taster "Aussenlicht_Ein" gepeert, so erreicht man auf folgende Weise, dass sie beim Einschalten mit einer Verzögerung von jeweils einer Sekunde nacheinander einschalten.
set Aussenlicht2 regSet shOnDly 1 Aussenlicht_Ein
set Aussenlicht3 regSet shOnDly 2 Aussenlicht_Ein