Garagentorsteuerung: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Krikan (Diskussion | Beiträge) (FHEM(R)) |
||
(11 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Randnotiz|RNTyp=y|RNText=Die in dieser Anleitung enthaltenen Code-Beispiele sind für die Eingabe in der fhem.cfg formatiert und sind (z.B. bei Benutzung in der Weboberfäche) ggf. [[Konfiguration|umzuformatieren]].}} | |||
Viele (Garagen)torantriebe haben keine seperaten Schalter für "Schliessen" und "Öffnen", sondern nur einen Taster, der das Tor schliesst wenn es offen ist und öffnet, wenn es geschlossen ist. Dies hat mehrere Nachteile: | Viele (Garagen)torantriebe haben keine seperaten Schalter für "Schliessen" und "Öffnen", sondern nur einen Taster, der das Tor schliesst wenn es offen ist und öffnet, wenn es geschlossen ist. Dies hat mehrere Nachteile: | ||
* Man kann das Tor nur korrekt bedienen, wenn man es sehen kann, bzw den Zustand kennt. Aber: | * Man kann das Tor nur korrekt bedienen, wenn man es sehen kann, bzw den Zustand kennt. Aber: | ||
* | * FHEM (und damit die Weboberfläche) hat keine Möglichkeit anhand des Zustandes des Aktors zu erkennen, ob das Tor zu oder auf ist. | ||
Damit ist eine zuverlässige echte " | Damit ist eine zuverlässige echte "Fernbedienung" des Tores nicht möglich, man kann das Tor also wenn man nach Hause kommt nicht schon vorab öffnen, ebenso kann man nicht z.B. nachts prüfen, ob vergessen wurde es zu zu machen und es ggf. automatisch schliessen. Die folgende Schaltung versucht beide Probleme zu umgehen. | ||
== Aufgabe: == | == Aufgabe: == | ||
Es soll ein Garagentor geschaltet werden. Die toreigene Steuerung kennt keinen absoluten Zustand, das Betätigen eines Tasters öffnet das Tor wenn es zu ist und schliesst es, wenn es offen ist. Mit FHEM soll die Möglichkeit geschaffen werden, das Tor in einen definierten Zustand zu bringen. Der Garagentormotor ist so konstruiert, dass | Es soll ein Garagentor oder Einfahrtstor geschaltet werden. Die toreigene Steuerung kennt keinen absoluten Zustand, das Betätigen eines Tasters öffnet das Tor, wenn es zu ist und schliesst es, wenn es offen ist. Mit FHEM soll die Möglichkeit geschaffen werden, das Tor in einen definierten Zustand zu bringen. Der Garagentormotor ist so konstruiert, dass ein kurzer Druck des Tasters ausreicht um den Schliess- Öffenvorgang auszulösen, der Taster muss nicht gehalten werden bis das Tor auf oder zu ist. Das Tor soll über Schaltflächen auf der Weboberfläche von FHEM betätigt werden. | ||
== Voraussetzungen: == | == Voraussetzungen: == | ||
Ein Tür/Fensterkontakt, der prüft ob das Tor auf oder zu ist. | Ein Tür/Fensterkontakt, der prüft, ob das Tor auf oder zu ist. | ||
Im konkreten Fall sei | Im konkreten Fall sei ein [[FHT80TF]] eingesetzt. | ||
Dieser ist zu definieren: | Dieser ist zu definieren: | ||
<nowiki>define Einfahrt CUL_FHTTK 3b8823 | <nowiki>define Einfahrt CUL_FHTTK 3b8823 | ||
attr Einfahrt room Aussen</nowiki> | attr Einfahrt room Aussen</nowiki> | ||
Ausserdem muss der Schaltaktor definiert werden, der auf Funkbefehl den Taster des Garagentormotors betätigt | Ausserdem muss der Schaltaktor definiert werden, der auf Funkbefehl den Taster des Garagentormotors betätigt (im konkreten Fall wurde ein [[FS20 AS1 1-Kanal Funk Aufputzschalter|FS20 AS1]] eingesetzt, da galvanische Trennung des Schaltstromkreises notwendig ist). | ||
Die folgenden Beispiele gehen davon aus, dass der Aktor "on-for-timer" beherrscht, dies ist bei FS20 und HomeMatic Aktoren der Fall, nicht aber z. | Die folgenden Beispiele gehen davon aus, dass der Aktor "on-for-timer" beherrscht, dies ist bei FS20 und HomeMatic Aktoren der Fall, nicht aber z.B. bei InterTechno Aktoren. | ||
<nowiki>#------EinfahrtsTor--------------- | <nowiki>#------EinfahrtsTor--------------- | ||
Zeile 31: | Zeile 31: | ||
* attr tor_sw follow-on-for-timer 1 | * attr tor_sw follow-on-for-timer 1 | ||
Weiter unten werden wir für den Aktor " tor_sw FS20 11114444 23" einen Timer definieren, also dafür sorgen, | Weiter unten werden wir für den Aktor "tor_sw FS20 11114444 23" einen Timer definieren, also dafür sorgen, dass er für nur eine Sekunde auf ON geschaltet wird. Dies soll die Betätigung des Taster simulieren. Die Anzeige auf dem Webinterface zeigt immer den letzten Schaltzustand. Im Falle eines Timers wäre dieser nach Betätigung "on for timer 1", man könnte am Webinterface also nicht erkennen, ob der FS20 Schalter aktuell aus oder an ist. | ||
"follow-on-for-timer 1" sorgt nun dafür, dass die Anzeige im Webinterface nach Ende des Timers wieder korrekt auf "off" geht. Dies ist für die eigentliche Funktion unerheblich und dient nur einer besseren Visualisierung des Schaltzustandes im Webinterface. Besonders interessant kann dieses Attribut bei Schaltungen sein, die länger als nur ein paar Sekunden dauern. | |||
Zuletzt müssen Aktionen definiert werden, die als Schalter auf der Weboberfläche von FHEM dienen, bzw. mit einer Fernbedienung ausgelöst werden können. | Zuletzt müssen Aktionen definiert werden, die als Schalter auf der Weboberfläche von FHEM dienen, bzw. mit einer Fernbedienung ausgelöst werden können. | ||
Zeile 40: | Zeile 39: | ||
<nowiki>define Einfahrt_ZU FS20 11114444 de | <nowiki>define Einfahrt_ZU FS20 11114444 de | ||
attr Einfahrt_ZU dummy 1 | attr Einfahrt_ZU dummy 1 | ||
attr Einfahrt_ZU room Aussen | attr Einfahrt_ZU room Aussen | ||
define Einfahrt_AUF FS20 11114444 da | |||
attr Einfahrt_AUF dummy 1 | attr Einfahrt_AUF dummy 1 | ||
attr Einfahrt_AUF room Aussen</nowiki> | attr Einfahrt_AUF room Aussen</nowiki> | ||
==== Erläuterungen: ==== | ==== Erläuterungen: ==== | ||
* define Einfahrt_ZU FS20 11114444 de | * define Einfahrt_ZU FS20 11114444 de | ||
Der Name "Einfahrt_ZU" ist frei vergeben und könnte auch z.b. "Garagentor_Schliessen" heissen. Der Hauscode der Installation ist 11114444, die Aktion hat die Adresse | Der Name "Einfahrt_ZU" ist frei vergeben und könnte auch z.b. "Garagentor_Schliessen" heissen. Der Hauscode der Installation ist 11114444, die Aktion hat die Adresse "de". Diese Adresse ermöglicht es, die Aktion mittels einer auf diese Adresse programmierten Fernbedienung auszulösen. "de" ist der hexadezimale Wert, der der ELV-Notation 4243 entspricht. | ||
* attr Einfahrt_AUF room Aussen | * attr Einfahrt_AUF room Aussen | ||
Zeile 53: | Zeile 53: | ||
Ordnet die Schalter auf der Weboberfläche dem Raum "Aussen" zu, dieser könnte auch beliebig anders heissen, er dient nur der Übersichtlichkeit. | Ordnet die Schalter auf der Weboberfläche dem Raum "Aussen" zu, dieser könnte auch beliebig anders heissen, er dient nur der Übersichtlichkeit. | ||
* dummy bewirkt, | * dummy bewirkt, dass beim Betätigen des Schalters auf der Weboberfläche kein Funksignal gesendet wird. Dies ist nicht erwünscht, da "Einfahrt_ZU" erst im folgenden die eigentlichen Aktionen auslöst. | ||
== Script == | == Script == | ||
Es gibt zwei | Es gibt zwei verschiedene Aktionen. Ziel ist es, dass das Einschalten von "Einfahrt_AUF" den Taster des Tores nur betätigt, wenn es zu ist, aber nichts tut, wenn das Tor schon offen ist (respektive "Einfahrt_ZU" entsprechend umgekehrt). | ||
Dazu dienen die folgenden Teile der Konfiguration, die die Aktionen unter bestimmten Bedingungen mit dem definierten Aktor "tor_sw FS20 11114444 23" verbinden: | Dazu dienen die folgenden Teile der Konfiguration, die die Aktionen unter bestimmten Bedingungen mit dem definierten Aktor "tor_sw FS20 11114444 23" verbinden: | ||
Zeile 62: | Zeile 62: | ||
<pre> | <pre> | ||
#------Einfahrtstor ZU, wenn es noch auf ist-------- | #------Einfahrtstor ZU, wenn es noch auf ist-------- | ||
define act_on_Einfahrt_ZU notify Einfahrt_ZU { if (Value("Einfahrt") eq "Open" && " | define act_on_Einfahrt_ZU notify Einfahrt_ZU { if (Value("Einfahrt") eq "Open" && "$EVENT" ne "off") { fhem("set tor_sw off ;; set tor_sw on-for-timer 1 ;; setstate Einfahrt_AUF off") } } | ||
</pre> | </pre> | ||
<pre> | <pre> | ||
#------Einfahrtor auf, wenn es noch zu ist-------- | #------Einfahrtor auf, wenn es noch zu ist-------- | ||
define act_on_Einfahrt_AUF notify Einfahrt_AUF { if (Value("Einfahrt") eq "Closed" && " | define act_on_Einfahrt_AUF notify Einfahrt_AUF { if (Value("Einfahrt") eq "Closed" && "$EVENT" ne "off") { fhem("set tor_sw off ;; set tor_sw on-for-timer 1 ;; setstate Einfahrt_ZU off") } } | ||
</pre> | </pre> | ||
==== Erläuterungen (exemplarisch Einfahrt_ZU, Einfahrt_AUF funktioniert analog): ==== | ==== Erläuterungen (exemplarisch Einfahrt_ZU, Einfahrt_AUF funktioniert analog): ==== | ||
* act_on_Einfahrt_ZU | * act_on_Einfahrt_ZU | ||
Ist nur der Name der anschliessend definierten Aktion. Er könnte auch "MyName77" oder "Blubber" heissen. Es ist aber sicher sinnvoll einen selbsterklärenden Namen zu wählen. | Ist nur der Name der anschliessend definierten Aktion. Er könnte auch "MyName77" oder "Blubber" heissen. Es ist aber sicher sinnvoll, einen selbsterklärenden Namen zu wählen. | ||
* notify Einfahrt_ZU | * notify Einfahrt_ZU | ||
Es passiert erst etwas, wenn "Einfahrt_ZU" betätigt wird, also auf Weboberfläche oder Fernbedienung mit passender Adresse eine Taste gedrückt wird | Es passiert erst etwas, wenn "Einfahrt_ZU" betätigt wird, also auf Weboberfläche oder Fernbedienung mit passender Adresse eine Taste gedrückt wird (zur Beachtung: Auch ein Drücken der OFF Taste von "Einfahrt_ZU" auf der Weboberfläche oder entsprechend der linken Taste des Tastenpaares einer Fernbedienung ist eine Betätigung!). | ||
* { | * { | ||
Zeile 86: | Zeile 83: | ||
Alles was jetzt folgt ist eine PERL Expression (PERL Expressions werden in geschweifte Klammern eingefasst.) | Alles was jetzt folgt ist eine PERL Expression (PERL Expressions werden in geschweifte Klammern eingefasst.) | ||
* if (Value("Einfahrt") eq "Open" && " | * if (Value("Einfahrt") eq "Open" && "$EVENT" ne "off") | ||
Falls der Wert von "Einfahrt" (mithin der Zustand des am Anfang definierten Türkontakts FHT80TF) gleich ("eg" = equal) "Open" ist (der FHT80TF kennt die beiden Werte Open und Closed) und zugleich die gedrückte Taste von "Einfahrt_ZU" nicht gleich ("ne" = Not equal) "off" (also "on") ist, dann mache folgendes... | Falls der Wert von "Einfahrt" (mithin der Zustand des am Anfang definierten Türkontakts FHT80TF) gleich ("eg" = equal) "Open" ist (der FHT80TF kennt die beiden Werte Open und Closed) und zugleich die gedrückte Taste von "Einfahrt_ZU" nicht gleich ("ne" = Not equal) "off" (also "on") ist, dann mache folgendes... | ||
Zeile 93: | Zeile 90: | ||
1. Ist das Tor überhaupt offen? Durch Abfrage des durch den Türkontakt gemeldeten Zustandes wird dies festgestellt. | 1. Ist das Tor überhaupt offen? Durch Abfrage des durch den Türkontakt gemeldeten Zustandes wird dies festgestellt. | ||
2. Wurde die "on" Taste auf dem Webinterface (entsprechend der rechten Taste auf der zugeordneten Fernbedienung) betätigt? Dies wurde durch Abfragen der Variablen " | 2. Wurde die "on" Taste auf dem Webinterface (entsprechend der rechten Taste auf der zugeordneten Fernbedienung) betätigt? Dies wurde durch Abfragen der Variablen "$EVENT" erledigt. Diese enthält den Wert der zuletzt betätigten Taste der definierten Aktion. Diese Bedingung ist für die Funktion nicht zwingend. Sie soll nur verhindern, dass die Aktion auch dann gestartet wird, wenn die OFF Taste gedrückt wurde, was vielleicht nicht den Erwartungen des Benutzers entspricht. | ||
Die Form "not equal off" klingt zunächst wie ein etwas komplizierter Weg von "equal on". Diese beiden Abfragen sind aber nicht identisch, da FS20 Dim-Befehle kennt. | Die Form "not equal off" klingt zunächst wie ein etwas komplizierter Weg von "equal on". Diese beiden Abfragen sind aber nicht identisch, da FS20 Dim-Befehle kennt. | ||
Wenn man die Taste einer Fernbedienung versehentlich länger als 0,4 Sekunden betätigt, wir | Wenn man die Taste einer Fernbedienung versehentlich länger als 0,4 Sekunden betätigt, wir statt eines ON Befehls ein Dim-Befehl gesendet. Wird nun auf Tastendruck "on" geprüft, wird in diesem Falle die Aktion nicht ausgeführt, obwohl der Nutzer die richtige Taste drückte. Der Dim-Befehl hat für eine Garagentorsteuerung keine Bedeutung, wenn er gesendet wird kann das eigentlich nur heissen, dass der Nutzer versehentlich zu lange gedrückt hat. Dass die Aktion nicht ausgeführt wird, weil der Nutzer die richtige Taste (nur) zu lange gedrückt gehalten hat, entspricht aber nicht den Erwartungen des normalen Nutzers. Es ist daher besser, darauf zu testen, dass der Nutzer nicht die falsche Taste gedrückt hat. | ||
Nur wenn beide Bedingungen zutreffen, also das Garagentor offen ist | Nur wenn beide Bedingungen zutreffen, also das Garagentor offen ist und die richtige Taste (in beliebieger Länge) gedrückt wurde, werden die nachfolgenden Aktionen ausgeführt: | ||
* { fhem("set tor_sw off ;; set tor_sw on-for-timer 1 ;; setstate Einfahrt_AUF off") } } | * { fhem("set tor_sw off ;; set tor_sw on-for-timer 1 ;; setstate Einfahrt_AUF off") } } | ||
Zeile 106: | Zeile 103: | ||
* set tor_sw off | * set tor_sw off | ||
tor_sw auschalten. Dies ist streng genommen nicht erforderlich, da tor_sw nach Ende der Aktion immer auf OFF stehen sollte. Sollte allerdings aus irgendeinem | tor_sw auschalten. Dies ist streng genommen nicht erforderlich, da tor_sw nach Ende der Aktion immer auf OFF stehen sollte. Sollte allerdings aus irgendeinem Grund tor_sw doch auf ON stehen, hat das nachfolgende kurze Einschalten zur Simulation eines Tastendrucks am Garagentor keine Wirkung. Das vorherige Ausschalten erhöht also die Zuverlässigkeit der Aktion und fängt fehlerhafte oder unklare Zustände und Störungen ab. | ||
* set tor_sw on-for-timer 1 | * set tor_sw on-for-timer 1 | ||
der Aktor tor_sw soll | der Aktor tor_sw soll für eine Sekunde einschalten und dann wieder auschalten. Dies simuliert einen kurzen Tastendruck. | ||
* setstate Einfahrt_AUF off | * setstate Einfahrt_AUF off | ||
Im ganzen "Einfahrt_ZU" Skript wird "Einfahrt_ZU" zwar unter bestimten Bedingungen eingeschaltet (und damit die oben | Im ganzen "Einfahrt_ZU" Skript wird "Einfahrt_ZU" zwar unter bestimten Bedingungen eingeschaltet (und damit die oben beschriebene Aktionen ausgeführt) aber nie AUSgeschaltet. Das Script steht also im Webinterface auch nach Ausführung der Aktionen auf ON. Dies hat den Sinn, dass man am Webinterface am Schaltzustand des Scriptes den Zustand des Garagentors erkennen kann. Die Zustandsanzeige von "Einfahrt_ZU" (dargestellt durch eine kleine Glühbirne) leuchtet, wenn das Skript abgelaufen und das Tor somit zu ist. Analog leuchtet die Anzeige des Scripts "Einfahrt_AUF" wenn das Tor zuletzt geöffnet wurde. Damit nicht nach jeweils einer Betätigung beide Scripte im Webinterface beide Glühbirnen leuchten, schalten die Scripte sich gegenseitig aus. "setstate Einfahrt_AUF off" dient also dazu, nachdem das Tor geschlossen wurde, die Anzeige von "Einfahrt_AUF" auszuschalten. Dies ist eine rein optische Massnahme: Der Schaltzustand von "Einfahrt_AUF" und "Einfahrt_ZU" gibt nur die letzte Betätigung wieder, nicht den tatsächlichen Zustand des Tores. In der Praxis stimmt dies aber überein. Wenn jedoch z.B. jemand das Tor manuell öffnet, stimmt die Anzeige nicht mehr. Um eine tatsächliche Ausführung der Scripte zu vermeiden, wird das Kommando "setstate" verwendet, das nur den Status ändert, aber nicht ein tatsächliches "set" auslöst. | ||
== Vorteile der besprochenen Konfiguration | == Vorteile der besprochenen Konfiguration == | ||
* das Tor kann mit Weboberfläche und Fernbedienung eindeutig auf oder zu gemacht werden, obwohl der Torantrieb selber nur toggelt. | * das Tor kann mit Weboberfläche und Fernbedienung eindeutig auf oder zu gemacht werden, obwohl der Torantrieb selber nur toggelt. | ||
* der Zustand des Tores muss nicht bekannt sein. Wenn man das Tor öffnen will, genügt es, auf Einfahrt_AUF zu drücken. Wenn das Tor schon auf ist passiert nichts, ansonsten wird es geöffnet. | * der Zustand des Tores muss nicht bekannt sein. Wenn man das Tor öffnen will, genügt es, auf Einfahrt_AUF zu drücken. Wenn das Tor schon auf ist, passiert nichts, ansonsten wird es geöffnet. | ||
* Manuelle Eingriffe am Garagentor selbst behindern die Schaltung nicht. | * Manuelle Eingriffe am Garagentor selbst behindern die Schaltung nicht. | ||
* der Zustand des Tores lässt sich in der Regel am Schaltzustand der Aktionen im Webinterface feststellen. Dadurch ist es nicht zwingend, den Türkontakt dem selben Raum zuzuordnen (obwohl es in diesem Beispiel so gemacht wurde) | * der Zustand des Tores lässt sich in der Regel am Schaltzustand der Aktionen im Webinterface feststellen. Dadurch ist es nicht zwingend erforderlich, den Türkontakt dem selben Raum zuzuordnen (obwohl es in diesem Beispiel so gemacht wurde) | ||
* Fehlbedienungen an der Fernbedienung (falsche Taste, zu lange gedrückt) werden abgefangen (dies ist insbesondere ein Vorteil gegenüber der Lösung, mit einer Fernbedienung den FS20 Aktor direkt anzusprechen, in dem ein Timer programmiert wurde. Das Auslösen des Dim-Befehles deaktiviert nämlich FS20 Timer. | * Fehlbedienungen an der Fernbedienung (falsche Taste, zu lange gedrückt) werden abgefangen (dies ist insbesondere ein Vorteil gegenüber der Lösung, mit einer Fernbedienung den FS20 Aktor direkt anzusprechen, in dem ein Timer programmiert wurde. Das Auslösen des Dim-Befehles deaktiviert nämlich FS20 Timer). | ||
== Nachteile der besprochenen Konfiguration | |||
* der Einsatz des [[FHT80TF]]. | == Nachteile der besprochenen Konfiguration == | ||
* belegt zwei Adressen und damit zwei Tastenpaare auf einer Fernbedienung. Ein Umschreiben auf ein Tastenpaar wäre aber möglich. | * der Einsatz des [[FHT80TF]], der den Zustand nur mit einer gewissen Verzögerung meldet. | ||
* funktioniert wegen der Verwendung von "on-for-timer" nur bei Aktoren, die dies auch unterstützen, | * belegt zwei Adressen und damit zwei Tastenpaare auf einer Fernbedienung. Ein Umschreiben auf ein Tastenpaar wäre aber möglich. Die Nutzung von zwei Schaltern auf der Weboberfläche hat sich bei der Bedienung mit (kleinem) Smartphonedisplay als vorteilhafter herausgestellt. | ||
* funktioniert wegen der Verwendung von "on-for-timer" nur bei Aktoren, die dies auch unterstützen, dies ist bei FS20 und HomeMatic der Fall, sonst umschreiben notwendig. | |||
== Anmerkungen: == | |||
* Es wird hier nicht das FHEM-IF benutzt sondern das ältere Perl if. An der eigentlichen Logik ändert dies nichts. | |||
* Die Lebensdauer der Batterie des FHT80TF stellt kein Problem dar. Standzeiten von bis zu 7 Jahren sind trotz Ausseneinsatz keine Seltenheit, das Gerät muss z.B. durch einschweissen in Plastikfolie gut gegen Wasser geschützt sein. | |||
* die Zuverlässigkeit der Webanzeige kann noch erhöht werden, wenn in regelmässigen Intervallen der Zustand des Tors geprüft wird und die Schalter im Webinterface mit setstate angepasst werden (der gezeigte Befehl muss ohne Zeilenumbruch so in die [[Konfiguration|fhem.cfg]] eingetragen werden): | |||
:<code>define Torchecker at +*00:30:00 { if (Value("Einfahrt") eq "Closed") { fhem("setstate Einfahrt_AUF off ;; setstate Einfahrt_ZU on")} else { fhem ("setstate Einfahrt_ZU off ;; setstate Einfahrt_AUF on") } }</code> | |||
:Das garantiert, dass die Schalter am Webinterface den Zustand auch dann korrekt wiedergeben, wenn das Tor anders als über FHEM betätigt wurde. | |||
[[Kategorie:Code Snippets]] | [[Kategorie:Code Snippets]] |
Aktuelle Version vom 26. Januar 2017, 23:35 Uhr
Viele (Garagen)torantriebe haben keine seperaten Schalter für "Schliessen" und "Öffnen", sondern nur einen Taster, der das Tor schliesst wenn es offen ist und öffnet, wenn es geschlossen ist. Dies hat mehrere Nachteile:
- Man kann das Tor nur korrekt bedienen, wenn man es sehen kann, bzw den Zustand kennt. Aber:
- FHEM (und damit die Weboberfläche) hat keine Möglichkeit anhand des Zustandes des Aktors zu erkennen, ob das Tor zu oder auf ist.
Damit ist eine zuverlässige echte "Fernbedienung" des Tores nicht möglich, man kann das Tor also wenn man nach Hause kommt nicht schon vorab öffnen, ebenso kann man nicht z.B. nachts prüfen, ob vergessen wurde es zu zu machen und es ggf. automatisch schliessen. Die folgende Schaltung versucht beide Probleme zu umgehen.
Aufgabe:
Es soll ein Garagentor oder Einfahrtstor geschaltet werden. Die toreigene Steuerung kennt keinen absoluten Zustand, das Betätigen eines Tasters öffnet das Tor, wenn es zu ist und schliesst es, wenn es offen ist. Mit FHEM soll die Möglichkeit geschaffen werden, das Tor in einen definierten Zustand zu bringen. Der Garagentormotor ist so konstruiert, dass ein kurzer Druck des Tasters ausreicht um den Schliess- Öffenvorgang auszulösen, der Taster muss nicht gehalten werden bis das Tor auf oder zu ist. Das Tor soll über Schaltflächen auf der Weboberfläche von FHEM betätigt werden.
Voraussetzungen:
Ein Tür/Fensterkontakt, der prüft, ob das Tor auf oder zu ist.
Im konkreten Fall sei ein FHT80TF eingesetzt.
Dieser ist zu definieren:
define Einfahrt CUL_FHTTK 3b8823 attr Einfahrt room Aussen
Ausserdem muss der Schaltaktor definiert werden, der auf Funkbefehl den Taster des Garagentormotors betätigt (im konkreten Fall wurde ein FS20 AS1 eingesetzt, da galvanische Trennung des Schaltstromkreises notwendig ist).
Die folgenden Beispiele gehen davon aus, dass der Aktor "on-for-timer" beherrscht, dies ist bei FS20 und HomeMatic Aktoren der Fall, nicht aber z.B. bei InterTechno Aktoren.
#------EinfahrtsTor--------------- define tor_sw FS20 11114444 23 attr tor_sw follow-on-for-timer 1
Erläuterungen:
- define tor_sw FS20 11114444 23
Der Name "tor_sw" ist frei vergeben und könnte auch z.b. "Garagentor_Schalter" heissen. Der Hauscode der Installation ist 11114444, der Schaltaktor hat die Adresse 23. Dies ist der hexadezimale Wert, der der ELV-Notation 1314 entspricht.
- attr tor_sw follow-on-for-timer 1
Weiter unten werden wir für den Aktor "tor_sw FS20 11114444 23" einen Timer definieren, also dafür sorgen, dass er für nur eine Sekunde auf ON geschaltet wird. Dies soll die Betätigung des Taster simulieren. Die Anzeige auf dem Webinterface zeigt immer den letzten Schaltzustand. Im Falle eines Timers wäre dieser nach Betätigung "on for timer 1", man könnte am Webinterface also nicht erkennen, ob der FS20 Schalter aktuell aus oder an ist.
"follow-on-for-timer 1" sorgt nun dafür, dass die Anzeige im Webinterface nach Ende des Timers wieder korrekt auf "off" geht. Dies ist für die eigentliche Funktion unerheblich und dient nur einer besseren Visualisierung des Schaltzustandes im Webinterface. Besonders interessant kann dieses Attribut bei Schaltungen sein, die länger als nur ein paar Sekunden dauern.
Zuletzt müssen Aktionen definiert werden, die als Schalter auf der Weboberfläche von FHEM dienen, bzw. mit einer Fernbedienung ausgelöst werden können.
define Einfahrt_ZU FS20 11114444 de attr Einfahrt_ZU dummy 1 attr Einfahrt_ZU room Aussen define Einfahrt_AUF FS20 11114444 da attr Einfahrt_AUF dummy 1 attr Einfahrt_AUF room Aussen
Erläuterungen:
- define Einfahrt_ZU FS20 11114444 de
Der Name "Einfahrt_ZU" ist frei vergeben und könnte auch z.b. "Garagentor_Schliessen" heissen. Der Hauscode der Installation ist 11114444, die Aktion hat die Adresse "de". Diese Adresse ermöglicht es, die Aktion mittels einer auf diese Adresse programmierten Fernbedienung auszulösen. "de" ist der hexadezimale Wert, der der ELV-Notation 4243 entspricht.
- attr Einfahrt_AUF room Aussen
Ordnet die Schalter auf der Weboberfläche dem Raum "Aussen" zu, dieser könnte auch beliebig anders heissen, er dient nur der Übersichtlichkeit.
- dummy bewirkt, dass beim Betätigen des Schalters auf der Weboberfläche kein Funksignal gesendet wird. Dies ist nicht erwünscht, da "Einfahrt_ZU" erst im folgenden die eigentlichen Aktionen auslöst.
Script
Es gibt zwei verschiedene Aktionen. Ziel ist es, dass das Einschalten von "Einfahrt_AUF" den Taster des Tores nur betätigt, wenn es zu ist, aber nichts tut, wenn das Tor schon offen ist (respektive "Einfahrt_ZU" entsprechend umgekehrt).
Dazu dienen die folgenden Teile der Konfiguration, die die Aktionen unter bestimmten Bedingungen mit dem definierten Aktor "tor_sw FS20 11114444 23" verbinden:
#------Einfahrtstor ZU, wenn es noch auf ist-------- define act_on_Einfahrt_ZU notify Einfahrt_ZU { if (Value("Einfahrt") eq "Open" && "$EVENT" ne "off") { fhem("set tor_sw off ;; set tor_sw on-for-timer 1 ;; setstate Einfahrt_AUF off") } }
#------Einfahrtor auf, wenn es noch zu ist-------- define act_on_Einfahrt_AUF notify Einfahrt_AUF { if (Value("Einfahrt") eq "Closed" && "$EVENT" ne "off") { fhem("set tor_sw off ;; set tor_sw on-for-timer 1 ;; setstate Einfahrt_ZU off") } }
Erläuterungen (exemplarisch Einfahrt_ZU, Einfahrt_AUF funktioniert analog):
- act_on_Einfahrt_ZU
Ist nur der Name der anschliessend definierten Aktion. Er könnte auch "MyName77" oder "Blubber" heissen. Es ist aber sicher sinnvoll, einen selbsterklärenden Namen zu wählen.
- notify Einfahrt_ZU
Es passiert erst etwas, wenn "Einfahrt_ZU" betätigt wird, also auf Weboberfläche oder Fernbedienung mit passender Adresse eine Taste gedrückt wird (zur Beachtung: Auch ein Drücken der OFF Taste von "Einfahrt_ZU" auf der Weboberfläche oder entsprechend der linken Taste des Tastenpaares einer Fernbedienung ist eine Betätigung!).
- {
Alles was jetzt folgt ist eine PERL Expression (PERL Expressions werden in geschweifte Klammern eingefasst.)
- if (Value("Einfahrt") eq "Open" && "$EVENT" ne "off")
Falls der Wert von "Einfahrt" (mithin der Zustand des am Anfang definierten Türkontakts FHT80TF) gleich ("eg" = equal) "Open" ist (der FHT80TF kennt die beiden Werte Open und Closed) und zugleich die gedrückte Taste von "Einfahrt_ZU" nicht gleich ("ne" = Not equal) "off" (also "on") ist, dann mache folgendes... Dieser Teil dient dazu, zwei Dinge abzufragen:
1. Ist das Tor überhaupt offen? Durch Abfrage des durch den Türkontakt gemeldeten Zustandes wird dies festgestellt.
2. Wurde die "on" Taste auf dem Webinterface (entsprechend der rechten Taste auf der zugeordneten Fernbedienung) betätigt? Dies wurde durch Abfragen der Variablen "$EVENT" erledigt. Diese enthält den Wert der zuletzt betätigten Taste der definierten Aktion. Diese Bedingung ist für die Funktion nicht zwingend. Sie soll nur verhindern, dass die Aktion auch dann gestartet wird, wenn die OFF Taste gedrückt wurde, was vielleicht nicht den Erwartungen des Benutzers entspricht.
Die Form "not equal off" klingt zunächst wie ein etwas komplizierter Weg von "equal on". Diese beiden Abfragen sind aber nicht identisch, da FS20 Dim-Befehle kennt. Wenn man die Taste einer Fernbedienung versehentlich länger als 0,4 Sekunden betätigt, wir statt eines ON Befehls ein Dim-Befehl gesendet. Wird nun auf Tastendruck "on" geprüft, wird in diesem Falle die Aktion nicht ausgeführt, obwohl der Nutzer die richtige Taste drückte. Der Dim-Befehl hat für eine Garagentorsteuerung keine Bedeutung, wenn er gesendet wird kann das eigentlich nur heissen, dass der Nutzer versehentlich zu lange gedrückt hat. Dass die Aktion nicht ausgeführt wird, weil der Nutzer die richtige Taste (nur) zu lange gedrückt gehalten hat, entspricht aber nicht den Erwartungen des normalen Nutzers. Es ist daher besser, darauf zu testen, dass der Nutzer nicht die falsche Taste gedrückt hat.
Nur wenn beide Bedingungen zutreffen, also das Garagentor offen ist und die richtige Taste (in beliebieger Länge) gedrückt wurde, werden die nachfolgenden Aktionen ausgeführt:
- { fhem("set tor_sw off ;; set tor_sw on-for-timer 1 ;; setstate Einfahrt_AUF off") } }
FHEM soll nacheinander ausführen:
- set tor_sw off
tor_sw auschalten. Dies ist streng genommen nicht erforderlich, da tor_sw nach Ende der Aktion immer auf OFF stehen sollte. Sollte allerdings aus irgendeinem Grund tor_sw doch auf ON stehen, hat das nachfolgende kurze Einschalten zur Simulation eines Tastendrucks am Garagentor keine Wirkung. Das vorherige Ausschalten erhöht also die Zuverlässigkeit der Aktion und fängt fehlerhafte oder unklare Zustände und Störungen ab.
- set tor_sw on-for-timer 1
der Aktor tor_sw soll für eine Sekunde einschalten und dann wieder auschalten. Dies simuliert einen kurzen Tastendruck.
- setstate Einfahrt_AUF off
Im ganzen "Einfahrt_ZU" Skript wird "Einfahrt_ZU" zwar unter bestimten Bedingungen eingeschaltet (und damit die oben beschriebene Aktionen ausgeführt) aber nie AUSgeschaltet. Das Script steht also im Webinterface auch nach Ausführung der Aktionen auf ON. Dies hat den Sinn, dass man am Webinterface am Schaltzustand des Scriptes den Zustand des Garagentors erkennen kann. Die Zustandsanzeige von "Einfahrt_ZU" (dargestellt durch eine kleine Glühbirne) leuchtet, wenn das Skript abgelaufen und das Tor somit zu ist. Analog leuchtet die Anzeige des Scripts "Einfahrt_AUF" wenn das Tor zuletzt geöffnet wurde. Damit nicht nach jeweils einer Betätigung beide Scripte im Webinterface beide Glühbirnen leuchten, schalten die Scripte sich gegenseitig aus. "setstate Einfahrt_AUF off" dient also dazu, nachdem das Tor geschlossen wurde, die Anzeige von "Einfahrt_AUF" auszuschalten. Dies ist eine rein optische Massnahme: Der Schaltzustand von "Einfahrt_AUF" und "Einfahrt_ZU" gibt nur die letzte Betätigung wieder, nicht den tatsächlichen Zustand des Tores. In der Praxis stimmt dies aber überein. Wenn jedoch z.B. jemand das Tor manuell öffnet, stimmt die Anzeige nicht mehr. Um eine tatsächliche Ausführung der Scripte zu vermeiden, wird das Kommando "setstate" verwendet, das nur den Status ändert, aber nicht ein tatsächliches "set" auslöst.
Vorteile der besprochenen Konfiguration
- das Tor kann mit Weboberfläche und Fernbedienung eindeutig auf oder zu gemacht werden, obwohl der Torantrieb selber nur toggelt.
- der Zustand des Tores muss nicht bekannt sein. Wenn man das Tor öffnen will, genügt es, auf Einfahrt_AUF zu drücken. Wenn das Tor schon auf ist, passiert nichts, ansonsten wird es geöffnet.
- Manuelle Eingriffe am Garagentor selbst behindern die Schaltung nicht.
- der Zustand des Tores lässt sich in der Regel am Schaltzustand der Aktionen im Webinterface feststellen. Dadurch ist es nicht zwingend erforderlich, den Türkontakt dem selben Raum zuzuordnen (obwohl es in diesem Beispiel so gemacht wurde)
- Fehlbedienungen an der Fernbedienung (falsche Taste, zu lange gedrückt) werden abgefangen (dies ist insbesondere ein Vorteil gegenüber der Lösung, mit einer Fernbedienung den FS20 Aktor direkt anzusprechen, in dem ein Timer programmiert wurde. Das Auslösen des Dim-Befehles deaktiviert nämlich FS20 Timer).
Nachteile der besprochenen Konfiguration
- der Einsatz des FHT80TF, der den Zustand nur mit einer gewissen Verzögerung meldet.
- belegt zwei Adressen und damit zwei Tastenpaare auf einer Fernbedienung. Ein Umschreiben auf ein Tastenpaar wäre aber möglich. Die Nutzung von zwei Schaltern auf der Weboberfläche hat sich bei der Bedienung mit (kleinem) Smartphonedisplay als vorteilhafter herausgestellt.
- funktioniert wegen der Verwendung von "on-for-timer" nur bei Aktoren, die dies auch unterstützen, dies ist bei FS20 und HomeMatic der Fall, sonst umschreiben notwendig.
Anmerkungen:
- Es wird hier nicht das FHEM-IF benutzt sondern das ältere Perl if. An der eigentlichen Logik ändert dies nichts.
- Die Lebensdauer der Batterie des FHT80TF stellt kein Problem dar. Standzeiten von bis zu 7 Jahren sind trotz Ausseneinsatz keine Seltenheit, das Gerät muss z.B. durch einschweissen in Plastikfolie gut gegen Wasser geschützt sein.
- die Zuverlässigkeit der Webanzeige kann noch erhöht werden, wenn in regelmässigen Intervallen der Zustand des Tors geprüft wird und die Schalter im Webinterface mit setstate angepasst werden (der gezeigte Befehl muss ohne Zeilenumbruch so in die fhem.cfg eingetragen werden):
define Torchecker at +*00:30:00 { if (Value("Einfahrt") eq "Closed") { fhem("setstate Einfahrt_AUF off ;; setstate Einfahrt_ZU on")} else { fhem ("setstate Einfahrt_ZU off ;; setstate Einfahrt_AUF on") } }
- Das garantiert, dass die Schalter am Webinterface den Zustand auch dann korrekt wiedergeben, wenn das Tor anders als über FHEM betätigt wurde.