http://wiki.fhem.de/w/api.php?action=feedcontributions&user=Maista&feedformat=atomFHEMWiki - Benutzerbeiträge [de]2024-03-28T19:49:55ZBenutzerbeiträgeMediaWiki 1.39.3http://wiki.fhem.de/w/index.php?title=DOIF/uiTable_Schnelleinstieg&diff=37247DOIF/uiTable Schnelleinstieg2022-02-19T22:36:23Z<p>Maista: An der Klammer lang es nicht ?!</p>
<hr />
<div>[[Datei:UiTable state screen.png|700px|rechts|Webansicht bestehend aus mehreren DOIF/uiTable-Definitionen]]<br />
An dieser Stelle wird das DOIF-Web-Interface erklärt, welches über das DOIF-Attribut '''uiTable''' realisiert wurde. <br />
<br />
Abhängig von der Art der Funktion können in einer tabellarischen Darstellung FHEM-Geräte visualisiert und über die Web-Oberfläche bedient werden. Eventbasierte Änderungen visualisierter Readings werden unmittelbar in der Web-Ansicht aktualisiert. Eine erstellte Tabelle erscheint unterhalb der Statuszeile eines DOIF-Devices. Das uiTable-Attribut kann in bereits bestehenden DOIFs oder in funktionslosen DOIFs, wie in den unteren Beispielen, als reines WEB-Interface erstellt werden. In der Abbildung rechts ist ein Statusbildschirm aus vier Spalten mit mehreren DOIF/uiTable-Definitionen aufgebaut worden.<br><br />
<br />
Die Darstellungsmöglichkeiten werden anhand von Beispielen insb. mit Hilfe bereits im DOIF-Modul vordefinierter uiTable-Funktionen aufgezeigt. Diese Perlfunktionen sind in einem eigenen Package namens 'ui_Table' definiert worden. Mit Hilfe dieser Funktionen lassen sich recht einfach, ohne tiefere HTML/CSS-Kenntnisse, eigene Übersichten definieren. Im Anschluss werden typische '''[[DOIF/uiTable Schnelleinstieg#Anwendungsbeispiele|Anwendungsbeispiele]]''' aufgezeigt.<br />
<br />
Die folgenden Beispieldefinitionen arbeiten mit konkreten Geräten und Readings, sie können als RAW-Definition ins eigene System übernommen werden, dazu müssen die Gerätenamen, Readings, ggf. auch Icons den existierenden Namen des eigenen Systems angepasst werden. Zum Ausprobieren der Beispiele können statt echter Geräte auch Dummys benutzt werden. <br />
<br />
Es gibt im Perl-Modus des DOIF-Moduls ebenfalls das Attribut '''uiState''', welches die gleiche Syntax wie uiTable nutzt. Die definierte Tabelle erscheint im Gegensatz zu uiTable jedoch im Status des DOIF-Devices. uiState und uiTable können gleichzeitig in einem DOIF-Device definiert werden. <br />
<br />
== Aufbau des uiTable-Attributs ==<br />
Im uiTable-Attribut wird in erster Linie die zu visualisierende Tabelle definiert. Optional können zuvor ein Perlblock sowie Templates definiert werden.<br />
{{Randnotiz|RNText='''Aufbau des Attributs'''<br />
* das uiTable-Attribut besteht aus drei Bereichen:<br />
* [[DOIF/uiTable Schnelleinstieg#Der Perlblock|Perlblock]]<br />
* [[DOIF/uiTable Schnelleinstieg#uiTable-Templates|Templates-Definitionen]] <br />
* [[DOIF/uiTable Schnelleinstieg#Die Tabellendefinition|Tabellendefinition]]<br />
}}<br />
'''Aufbaustruktur''' <br />
<syntaxhighlight lang="perl"><br />
{<br />
<Perlblock, optional><br />
}<br />
<br />
<Templates-Definitionen, optional><br />
<br />
<Tabellendefinition><br />
</syntaxhighlight><br />
=== Der Perlblock ===<br />
Der Perlblock dient dazu, das Layout der Tabelle zu beeinflussen sowie eigene uiTable-Funktionen zu definieren. Hier wird insb. das Package definiert, welches für die Tabellendefinition gilt. Ebenfalls können CSS-Variablen sowie Steuerungsattribute gesetzt werden. Der Perlblock beginnt und endet mit einer geschweiften Klammer.<br />
<br />
==== CSS-Variablen und Steuerungsattribute ====<br />
Mit Hilfe von CSS-Variablen kann das Layout der Tabelle beeinflusst werden. Die Steuerungsattribute beeinflussen die Statuszeile sowie die Detailansicht des DOIF-Moduls.<br />
{{Randnotiz|RNText='''CSS-Variablen und Steuerungsattribute'''<br />
*Das Layout der gesamten Tabelle wird beeinflusst über die Variablendefinition: '''$TABLE="<CSS-Attribute der Tabelle>"'''<br />
*Spaltenformatierungen werden beeinflusst mit Hilfe der Variablendefinition: '''$TC{<Zellenbereich für Spalten>}="<CSS-Attribute der Spalten>"''' <br />
*Zeilenformatierungen werden beeinflusst mit Hilfe der Variablendefinition: '''$TR{Zeilenbereich}="<CSS-Attribute der Zeilen>"'''<br />
*einzelne Zellen werden beeinflusst mit Hilfe der Variablen: '''$TD{<Zellenbereich für Zeilen>}{<Zellenbereich für Spalten>}="<CSS-Attribute der Zellen>"'''<br />
*für Zellen-, Spalten- und Zeilen-Bereich gilt: '''<Zahl><nowiki>|</nowiki><kommagetrennte Aufzählung><nowiki>|</nowiki><Bereich von..bis>'''<br />
*Der Status in der Statuszeile des DOIFs wird ausgeblendet mit '''$SHOWNOSTATE=1'''<br />
*Die Gerätezeile des DOIFs wird ausgeblendet mit '''$SHOWNODEVICELINE = "<regex room>"'''<br />
*Die Tabelle des DOIFs wird ausgeblendet mit '''$SHOWNOUITABLE = "<regex room>"'''<br />
*Die Detailansicht wird umorganisiert mit '''$ATTRIBUTESFIRST=1'''<br />
}}<br />
'''Bespieldefinition'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_bsp_layout DOIF ##<br />
attr di_bsp_layout uiTable { ## Beginn des Perlblocks\<br />
## CSS-Variablen\<br />
\<br />
## Die Tabelle soll ein Hintergrundbild der Größe 300x300 Pixel haben\<br />
$TABLE = "width:300px;; height:300px;; background-image:url(/fhem/www/pgm2/images/Grundriss.png);; background-size: 300px 300px;;";;\<br />
\<br />
## die Zelle der ersten Zeile und der ersten Spalte soll rechts eine Rahmenlinie haben\<br />
$TD{0}{0} = "style='border-right-style:solid;; border-right-width:10px'";;\<br />
\<br />
## Die erste Zeile soll aus der Klasse 'odd' sein und fett-Schrift haben\<br />
$TR{0} = "class='odd' style='font-weight:bold'";;\<br />
\<br />
## die Spalten 2 bis 6 sollen zentriert sein\<br />
$TC{1..5} = "align='center'";;\<br />
\<br />
## die Spalten 2, 4 und 5 sollen zentriert sein\<br />
$TC{1,3,5} = "align='center'";;\<br />
\<br />
## die letzte Spalte der Tabelle soll fett sein\<br />
$TC{last} = "style='font-weight:bold'";;\<br />
\<br />
\## Steuerungsattribute\<br />
\<br />
\## Ausblenden des Status in der Statuszeile\<br />
$SHOWNOSTATE=1;;\<br />
\<br />
## Die Gerätezeile wird ausgeblendet in allen Räumen\<br />
$SHOWNODEVICELINE = ".*";;\<br />
\<br />
## Die Tabelle wird im Raum info ausgeblendet\<br />
$SHOWNOUITABLE = "^info$";;\<br />
\<br />
## Die Detailansicht wird umorganisiert, hilfreich beim Editieren längerer uiTable-Definitionen\<br />
$ATTRIBUTESFIRST = 1;;\<br />
} ## Ende des Perlblocks<br />
</syntaxhighlight><br />
<br />
=== Die Tabellendefinition ===<br />
==== Einfache Tabellendefinition ohne Funktionen ====<br />
{{Randnotiz|RNText='''Tabellendefinition'''<br />
* eine Tabelle wird aus Zellen zusammengebaut<br />
* mehrere Zellen werden mit <nowiki>|</nowiki> von einander getrennt, sie bilden eine Tabellenzeile<br />
* eine neue Tabellenzeile beginnt mit einer neuen Zeile in der Tabellendefinition<br />
* eine Tabellenzeile kann auch in mehreren Zeilen definiert werden, diese müssen dann mit <nowiki>|</nowiki> enden<br />
* Texte werden in Anführungszeichen angegeben<br />
* Readings werden in der Form [<device>:<reading>] angegeben<br />
* Kommentare beginnen mit ## und enden mit Zeilenende<br />
* Events eines definierten Readings, führen sofort zu Aktualisierung seines Inhalts in der visualisierten Tabelle<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_definition DOIF ##<br />
attr ui_Table_definition uiTable { ## Perlblock für globale Tabellendefinitionen\<br />
\<br />
$TC{1..2}="align='center'" ## zentrierte Ausrichtung der zweiten und dritten Spalte\<br />
\<br />
}\<br />
\<br />
## Tabellendefinition\<br />
\<br />
"Warmwasser"|"Vorlauf"|"Rücklauf" ## erste Tabellenzeile\<br />
## zweite Tabellenzeile\<br />
[T_Warmwasserspeicher:temperature]| ## Zeile wird fortgesetzt, da sie mit | endet\<br />
[T_Vorlauf:temperature]| ## Zeile wird fortgesetzt, da sie mit | endet\<br />
[T_Ruecklauf:temperature]<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable Definition.png|mini|ohne]]<br />
<br />
==== Tabellendefinition mit Berechnungen ====<br />
{{Randnotiz|RNText='''Zellenauswertung'''<br />
* jede Zelle der Tabelle wird über Perl ausgewertet<br />
* Readingangaben der Form [<device>:<reading>] werden in eine Perlfunktion übersetzt<br />
* das Ergebnis des ausgewerteten Perlausdrucks wird ausgegeben<br />
* in einer Zelle können beliebige Perlfunktionen genutzt werden<br />
* Texte oder Funktionen können mit Punkt aneinander gehängt werden<br />
* mit Komma werden Texte oder Werte untereinander dargestellt<br />
* wird eine Zeile mit < abgeschlossen, so wird die aktuelle Tabelle abgeschlossen, die nächste Zeile beginnt in einer neuen Tabelle<br />
* in einer Berechnung sollte ein Trigger in Form einer Readingangabe [<device>:<reading>] vorkommen, sonst wäre das Ergebnis statisch und würde sich nicht ändern <br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_calc DOIF ##<br />
attr di_uiTable_calc uiTable ## Tabellendefinition\<br />
"Differenz"|[T_Ruecklauf:temperature]-[T_Vorlauf:temperature]\<br />
"Minimum"|minNum([TH_WZ_HM:measured-temp],[TH_Keller_HM:measured-temp])\<br />
"Durchschnitt"|([T_Ruecklauf:temperature]+[T_Vorlauf:temperature])/2<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable calc.png|mini|ohne]]<br />
<br />
== Vordefinierte uiTable-Funktionen ==<br />
Typische Widgets bzw. Styles wurden als Perl-Funktionen im package ui_Table für eine einfache Tabellendefinition programmiert. Im folgenden wird näher auf die einzelnen uiTable-Funktionen eingegangen.<br />
<br />
=== FHEM-Widgets mit der Funktion '''widget''' ===<br />
Alle in FHEM vorhanden Widgets können mit Hilfe der Perlfunktion '''widget''' genutzt werden. Bei häufiger Nutzung eines bestimmten Widgets bietet sich alternativ die Definition einer uiTable-Funktion (Typ 3) mit dem jeweiligen Widget an, siehe: [[DOIF/uiTable Schnelleinstieg#Eigene uiTable-Funktionen programmieren|uiTable-Funktion]]<br />
{{Randnotiz|RNText=Funktion '''widget'''<br />
<syntaxhighlight lang="perl"><br />
widget(<Reading>,$fhem_widget,$set)<br />
<br />
Reading # [<device>:<reading>]<br />
$fhem_widget # Angabe des FHEM-Widgets<br />
$set # optional, undef zum Setzen beliebiger Readings (entspricht setreading), "set" wenn das Reading per set-Befehl gesetzt wird (siehe Attribut ReadingList), "set <Befehl>", wenn sich der Befehl vom Reading unterscheidet, default undef<br />
</syntaxhighlight><br />
<br />
'''nützliche Links'''<br />
* [[FHEMWEB/Widgets|Fhem-Widgets]]<br />
* Fhem-Widgets als [[DOIF/uiTable Schnelleinstieg#Eigene uiTable-Funktionen programmieren|uiTable-Funktion]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_widget DOIF ##<br />
attr di_uiTable_widget uiTable ## FHEM-Widgets mit Hilfe der WID-Funktion\<br />
{package ui_Table}\<br />
"Widget"\<br />
"Select"| widget([uhr:wochentag],"select,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag")\<br />
"Selectnumbers"| widget([motor:spannung],"selectnumbers,0,0.5,12,1,lin")\<br />
"Slider"| widget([bla:wert],"slider,0,5,100,1")\<br />
"Colorpicker RGB"| widget([Lampe:farbe],"colorpicker,RGB")\<br />
"Colorpicker HSV"| widget([Lampe:farbe],"colorpicker,HSV")\<br />
"Colorpicker CT"| widget([Lampe:waerme],"colorpicker,CT,2000,10,6500")\<br />
"Colorpicker HUE"| widget([Lampe:farbe],"colorpicker,HUE,0,1,359")\<br />
"Colorpicker BRI"| widget([Lampe:helligkeit],"colorpicker,BRI,0,1,100")\<br />
"Time"| widget([start:zeit],"time")\<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable WID.png|mini|ohne]]<br />
<br />
=== SVG-uiTable-Funktionen ===<br />
SVG-uiTable-Funktionen sind skalierbare Widgets, die auf SVG-Elementen basieren. Bei allen SVG-Funktionen für Temperatur bzw. Feuchtigkeit wird die Einfärbung abhängig vom Temperatur- bzw. Feuchtigkeitswert mit Hilfe einer Zuordnungsfunktion bestimmt.<br />
<br />
==== '''ring'''-Funktionen ====<br />
===== Farbskalierte Temperaturanzeige mit Hilfe der SVG-Funktionen '''temp_ring/temp_mring''' =====<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''temp_mring'''-SVG-Funktion wird der Ring einfarbig dargestellt.<br />
<br />
Farbskalierung der '''temp_ring'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_ring_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''temp_mring'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_mring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_ring/temp_mring'''<br />
<syntaxhighlight lang="perl"><br />
temp_ring/temp_mring ($temp_value,$temp_min,$temp_max,$sizeHalf, $lightring,$lightnumber,$decFont) <br />
<br />
$temp_value # Temperatur<br />
$temp_min, # minimale Temperatur, optional, default=-20<br />
$temp_max, # maximale Temperatur, optional, default=60<br />
$sizeHalf # "<size>,<half ring>" size: Größe der Grafik, optional, default = 80, half ring: 1 für Halbring<br />
$lightring, # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_ring DOIF ##<br />
attr di_temp_ring uiTable {package ui_Table}\<br />
"außen (standard)"|temp_ring([Aussensensor:temperature])\<br />
"Warmwasser (größer,aufgehellt,Normalschrift)" |temp_mring([vaillant:WWSpeicher],15,70,110,90,100,"1,font-weight:normal")\<br />
"Vorlauf (größer)"| temp_mring([ESPEasy_ESP_Temp_Vorlauf:Temperature],15,45,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Feuchtigkeitsanzeige mit Hilfe der SVG-Funktionen '''hum_ring/hum_mring''' =====<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''hum_mring'''-SVG-Funktion wird der Ring einfarbig dargestellt.<br />
<br />
Farbskalierung der '''hum_ring'''-SVG-Funktion: <br />
[[Datei:Farbskalierung hum_ring_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''hum_mring'''-SVG-Funktion:<br />
[[Datei:Farbskalierung hum_mring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''hum_ring/hum_mring'''<br />
<syntaxhighlight lang="perl"><br />
hum_ring/hum_mring ($hum_value,$sizeHalf,$lightring,$lightnumber,$decFont) <br />
$hum_value # Feuchtigkeit<br />
$sizeHalf # "<size>,<half ring>" size: Größe der Grafik, optional, default = 80, half ring: 1 für Halbring<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_hum_ring DOIF ##<br />
attr di_hum_ring room test2<br />
attr di_hum_ring uiTable {package ui_Table}\<br />
"klein ohne Farbverlauf"|hum_mring([Aussensensor:humidity],60)\<br />
"normal groß mit Farbverlauf"|hum_ring([Aussensensor:humidity])\<br />
"groß ohne Farbverlauf aufgehellt"|hum_mring([Aussensensor:humidity],100,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:hum_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Zahlenwertes mit Hilfe der universellen SVG-Funktion '''ring''' =====<br />
Die Farbe des dargestellten Wertes kann abhängig vom Wert bestimmt werden. Dabei wird die Farbe mit Anleihen aus dem [https://de.wikipedia.org/wiki/HSV-Farbraum HSV-Farbraum] bestimmt. Dieser Farbraum benötigt eigentlich drei Werte, wobei die erste den Farbton (hue) bestimmt; hier wird nur dieser Wert verwendet (Sättigung und Hellwert sind nicht einstellbar). Der Farbton geht von rot (hue-Wert = 0) über gelb (hue-Wert = 60), dann grün (hue-Wert = 120) und blau (hue-Wert = 240) zurück zu rot (hue-Wert = 360), siehe dazu auch die [https://de.wikipedia.org/wiki/HSV-Farbraum#/media/Datei:HueScale.svg Farbtontafel] auf der Wikipedia-Seite.<br />
Die unten $colorRef genannte Funktion kann zum Beispiel in der Tabelle selbst definiert werden, beispielsweise kann man in dem device &onoff_hue verwenden, wenn man es vorab definiert (siehe [https://forum.fhem.de/index.php/topic,120088.msg1204341.html#msg1204341 Link zum Forum]):<blockquote><syntaxhighlight lang="perl"><br />
attr <ui device Name> {<br />
package ui_Table;<br />
sub onoff_hue {<br />
my($irgendeinVariablenname)=@_;<br />
return ($irgendeinVariablenname == 0 ? 240 : 0); <br />
}<br />
## Tabellendefinition<br />
...<br />
}<br />
</syntaxhighlight></blockquote>{{Randnotiz|RNText=SVG-uiTable-Funktion '''ring'''<br />
<syntaxhighlight lang="perl"><br />
ring ($value,$min,$max,$minColor,$maxColor,$unit, $sizeHalf,$colorRef,$decFont,$model,$lightness)<br />
<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$sizeHalf # "<size>,<half ring>" size: Größe der Grafik, optional, default = 100, half ring: 1 für Halbring<br />
$colorRef # Referenz auf eine Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, oder eine Referenz auf eine Arrayliste mit Grenzwerten und Farben, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$model # '<Farbverlauf>,<Min/Max>,<Innenring>,<Zeigerstärke>,<Modus>',<br />
# Farbverlauf: 1 für monochrom, <br />
# Min/Max: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte,<br />
# Innenring: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes, Zeigerstärke: in Pixel,<br />
# Zeigerstärke: Breite des Zeigers,<br />
# Modus: 0 Standard Min-Max, 1 Min-Null-Max, 2 Null-Min/Max,<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,'<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>", optional, default: "50,50,50,40,50"<br />
</syntaxhighlight><br />
Wird '''$colorFunc''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_ring DOIF (1)<br />
attr di_ring room test20,test5<br />
attr di_ring uiTable {package ui_Table;; \<br />
$SHOWNOSTATE=1}\<br />
## von 0 bis 20 in Farben von grün (hue:120) bis rot (hue:0)\<br />
"Umlaufmenge"|ring([heating:pump],0,20,120,0,"l/min",100)\<br />
\<br />
## von 0 bis 3 in Farben von rot (hue:0) bis türkis (hue:180), eine Nachkommastelle, Schriftgröße 170%\<br />
## Innenring mit Min-, Max-Beschriftung\<br />
"Wasserdruck"|ring([heating:pressure],0,3,0,180,"bar",100,undef,"1,font-size:170%,fill:silver;;font-size:50%","0,1,1")\<br />
\<br />
## Temperaturdarstellung, entspricht dem Funktionsaufruf:\<br />
## temp_ring ([outdoor:temperature],-20,60,100,"1,font-weight:normal;;font-size:140%")\<br />
## Eine Nachkommastelle, Normalschrift, Schriftgröße 140%\<br />
"Temperatur"|ring([outdoor:temperature,-20,60,undef,undef,"°C",100,\&temp_hue,"1,font-weight:normal;;font-size:140%")\<br />
\<br />
## Lufdruck als Halbring\<br />
"Luftdruck"|ring([weather:barometer],970,1045,30,90,"hPa","100,1",undef,0)\<br />
\<br />
## Co2 als Halbring, Farbgebung als Array mit drei Bereichen, Innenring mit Zeiger\<br />
"Co2"|ring([livingroom:co2],400,1200,undef,undef,'ppm',"100,1",[(600,120,1000,60,1200,0)],0,'0,0,1,5')<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Temperatur- und Feuchtigkeitsanzeige mit Hilfe der SVG-Funktion '''temp_hum_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperatur- bzw. Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar:<br />
[[Datei:Farbskalierung temp_hum_ring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_hum_ring'''<br />
<syntaxhighlight lang="perl"><br />
temp_hum_ring ($temp_value,$hum_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp,$decFontHum)<br />
<br />
$temp_value # Temperatur<br />
$hum_value # Feuchtigkeit<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp # Temperatur: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontHum # Feuchtigkeit: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_hum_ring DOIF ##<br />
attr di_temp_hum_ring uiTable {package ui_Table}\<br />
\<br />
"klein"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity],undef,undef,60)\<br />
"normal"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity])\<br />
"größer, aufgehellt"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity],undef,undef,100,undef,80)\<br />
"größer, Ring aufgehellt, Normalschrift"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity],undef,undef,100,80,50,"1,font-weight:normal","0,font-weight:normal")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_hum_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Temperaturwerten mit Hilfe der SVG-Funktion '''temp_temp_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar:<br />
[[Datei:Farbskalierung temp_temp_ring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_temp_ring'''<br />
<syntaxhighlight lang="perl"><br />
temp_temp_ring ($temp1_value,$temp2_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp1,$decFontTemp2)<br />
<br />
$temp1_value # erster Temperaturwert<br />
$temp2_value # zweiter Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp1 # Temperatur1: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontTemp2 # Temperatur2: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_temp_ring DOIF ##<br />
attr di_temp_temp_ring uiTable {package ui_Table}\<br />
"klein, Ring augehellt"|temp_temp_ring([Vorlauf:Temperature],[Ruecklauf:Temperature],15,60,60,80,50)\<br />
"normal"|temp_temp_ring([Vorlauf:Temperature],[Ruecklauf:Temperature],15,60)\<br />
"groß, Zahlen aufgehellt"|temp_temp_ring([Vorlauf:Temperature],[Ruecklauf:Temperature],15,60,100,undef,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_hum_temp_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Zahlenwerten mit Hilfe der universellen SVG-Funktion '''ring2''' =====<br />
Die Farbe der dargestellten Werte kann abhängig vom Wert bestimmt werden.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''ring2'''<br />
<syntaxhighlight lang="perl"><br />
ring2 ($value1,$min1,$max1,$minColor1,$maxColor1,$unit1,$size,$colorFunc1,$decFont1,<br />
$value2,$min2,$max2,$minColor2,$maxColor2,$unit2,$colorFunc2,$decFont2,<br />
$lightness,$icon,$model)<br />
<br />
$value1 # darzustellender Wert1<br />
$min1 # minimaler Wert, optional, default=0<br />
$max1 # maximaler Wert, optional, default=100<br />
$minColor1 # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor1 # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit1 # Einheit des Wertes, optional, default = undef<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc1 # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont1 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$value2 # darzustellender Wert2<br />
...<br />
$decFont2 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
$model # '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>',<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
<br />
Argumente für den zweiten Wert entsprechend den Argumenten des ersten Wertes<br />
</syntaxhighlight><br />
Wird '''$colorFunc...''' nicht angegeben, so wird der Farbwert zwischen '''$minColor...''' und '''$maxColor...''' linear interpoliert<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_ring2 DOIF ##<br />
attr di_ring2 uiTable {package ui_Table;;}\<br />
## Leistungsaufnahme von 0 kW bis 3,6 kW in Farben von grün (hue:120) bis rot (hue:0)\<br />
## Kapazität von 0 % bis 100 % V in Farben von rot (hue:0) bis grün (hue:120)\<br />
"Wallbox"| ring2([tesla:Leistung],0,3.6,120,0,"kW",undef,undef,"1,font-weight:normal",[tesla:Kapazitaet],0,100,0,120,"%",undef,"0,font-weight:normal")\<br />
\<br />
## Stromstärke von 0 A bis 2 A in Farben von grün (hue:120) bis rot (hue:0)\<br />
## Spannung von 1 V bis 1.5 V in Farben von rot (hue:0) bis grün (hue:120)\<br />
## 3 Nachkommastellen, Normalschrift, Schriftgröße 80% \<br />
"Akku"| ring2([akku:Strom],0,2,120,0,"A",undef,undef,"3,font-weight:normal;;font-size:80%",[akku:Spannung],1,1.5,0,120,"V",undef,"3,font-weight:normal;;font-size:80%")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:ring2_bsp.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinition Innenring, Farb-Array, Ringmodi</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_solar DOIF {}<br />
attr di_solar uiTable {package ui_Table}\<br />
"Farb-Array, ringMode 1"|\<br />
ring2([zaehler:Produktion],-20,30,undef,undef,"PV kWh",130,[(-10,0,-0.001,30,10,60,30,90)],"2",[test:Bezug],-20,30,undef,undef,"Bezug",[(-10,0,-0.001,30,10,60,30,90)],"2",undef,undef,"0,1,1,0,1")\<br />
"Farbe linear, ringMode 1"|\<br />
ring2([zeahler:Produktion],-20,30,0,120,"PV kWh",130,undef,"2",[test:Bezug],-20,30,0,120,"Bezug",undef,"2",undef,undef,"0,1,1,0,1")\<br />
"Farbe linear, ringMode 2"|\<br />
ring2([zaehler:Produktion],0,30,60,120,"PV kWh",130,undef,"2",[test:Bezug],-20,0,0,120,"Bezug",undef,"2",undef,undef,"0,,,0,2")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:ring2_ringMode.png|ohne|mini]]<br />
<br />
<br clear="all"><br />
<br />
==== '''icon_ring'''-Funktionen ====<br />
===== Farbskalierte Temperaturanzeige mit einem Icon mit Hilfe der SVG-Funktionen '''icon_temp_ring/icon_temp_mring''' =====<br />
Diese Funktionen basieren auf den obigen temp_ring-Funktionen, zusätzlich wird ein SVG-Icon dargestellt. Die Farbe des Icons kann mit @ an den Iconnamen angehängt werden, ansonsten wird die Farbe der Temperatur für das Icon verwendet. Die Größe des Icons kann skaliert werden, ebenso kann die Positionen des Icons verschoben werden.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_ring/icon_temp_mring'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_ring/icon_temp_mring ($icon,$temp_value,$temp_min,$temp_max,$size,$lightring,$lightnumber,$decFont) <br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation (0-360) sind optional<br />
$temp_value # Temperatur<br />
$temp_min, # minimale Temperatur, optional, default=-20<br />
$temp_max, # maximale Temperatur, optional, default=60<br />
$size, # Größe der Grafik, optional, default=80<br />
$lightring, # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_Heizung_temp DOIF ##<br />
attr di_Heizung_temp uiTable {\<br />
package ui_Table;;\<br />
}\<br />
\<br />
icon_temp_ring("temp_outside",[vaillant:Aussentemp],-15,40)|\<br />
icon_temp_mring(([vaillant:Flame] eq "off"?"sani_boiler_temp\@white":"sani_boiler_temp\@Darkorange"),[vaillant:Vorlauf],15,70)|\<br />
icon_temp_mring(([vaillant:Pumpenstatus] eq "4" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),[vaillant:WWSpeicher],15,70)|\<br />
icon_temp_mring(([Zirk] eq "off"?"sani_pump\@white":"sani_pump\@Darkorange"),[ESPEasy_ESP_Temp_Zirkulation:Temperature],15,70)|\<br />
icon_temp_mring(([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),[ESPEasy_ESP_Temp_Vorlauf:Temperature],15,70)|\<br />
icon_temp_mring("sani_floor_heating_neutral\@white",[ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature],15,70)|""<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Feuchtigkeitsanzeige mit einem Icon mit Hilfe der SVG-Funktionen '''icon_hum_ring/icon_hum_mring''' =====<br />
Diese Funktionen basieren auf den obigen hum_ring-Funktionen, zusätzlich wird ein SVG-Icon dargestellt. Die Farbe des Icons kann mit @ an den Iconnamen angehängt werden, ansonsten wird die Farbe der Feuchtigkeit für das Icon verwendet. Die Größe des Icons kann skaliert werden, ebenso kann die Positionen des Icons verschoben werden. <br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_hum_ring/icon_hum_mring'''<br />
<syntaxhighlight lang="perl"><br />
icon_hum_ring/icon_hum_mring ($icon,$hum_value,$size,$lightring,$lightnumber,$decFont) <br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$hum_value # Feuchtigkeit<br />
$size # Größe der Grafik, optional, default=80<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_hum_ring DOIF ##<br />
attr di_icon_hum_ring room test5<br />
attr di_icon_hum_ring uiTable {package ui_Table}\<br />
"klein ohne Farbverlauf"|icon_hum_mring("weather_humidity",[Aussensensor:humidity],60)\<br />
"normal groß mit Farbverlauf"|icon_hum_ring("weather_humidity",[Aussensensor:humidity])\<br />
"groß ohne Farbverlauf aufgehellt"|icon_hum_mring("weather_humidity",[Aussensensor:humidity],100,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_hum_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Icons mit einem Zahlenwert mit Hilfe der universellen SVG-Funktion '''icon_ring/icon_mring/icon_uring''' =====<br />
Diese Funktionen basieren auf der universellen ring-Funktion. Die Farbe des dargestellten Icons und des Wertes kann abhängig vom Wert bestimmt werden. Die Funktion '''icon_ring''' stellt den Farbring mit Farbverlauf dar, die Funktion '''icon_mring''' stellt den Farbring einfarbig dar. Die universelle Funktion '''icon_uring''' kann über den Parameter '''$model''' das Erscheinungsbild der Grafik verändern.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_ring/icon_mring/icon_uring'''<br />
<syntaxhighlight lang="perl"><br />
icon_ring ($icon,$value,$min,$max,$minColor,$maxColor, $unit,$decFont,$size,$colorRef,$lightness,$model)<br />
<br />
icon_mring ($icon,$value,$min,$max,$minColor,$maxColor, $unit,$decFont,$size,$colorRef,$lightness)<br />
<br />
icon_uring ($model,$icon,$value,$min,$max,$minColor,$maxColor, $unit,$decFont,$size,$colorRef,$lightness)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Style-SVG-Attribute Wert>,<Style-SVG-Attribute Einheit>", optional<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorRef # Referenz auf eine Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, oder eine Referenz auf eine Arrayliste mit Grenzwerten und Farben, optional, default = undef<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
$model # '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>',<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
</syntaxhighlight><br />
Wird '''$colorRef''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
<br />
<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_ring DOIF ##<br />
attr di_icon_ring uiTable {package ui_Table}\<br />
\<br />
icon_ring ('sani_floor_heating_neutral',[Heizenergie:Vortag_hc],0,150,120,0,'kWh')|\<br />
icon_mring ('fuel',[Tankstelle:Diesel],1.10,1.30,120,0,'€',2)|\<br />
icon_uring ('0,1,1',"air",[ESPEasy_Eingang_CO2:PPM],400,1200,undef,undef,'ppm',0,100,[(600,120,1000,60,1200,0)])|\<br />
icon_uring ('0,1','Zisterne',([Wasserzisterne]/3.4),0,100,0,120,'%',0)##/\<br />
\<br />
icon_uring ('1,1,0,8',"measure_water_meter",[Wasserverbrauch:heute],0,600,120,0,'l',0)|\<br />
icon_uring ('0,fill:white,opacity:0.4',([vaillant:Pumpenstatus] eq '4' ? 'sani_buffer_temp_down@Darkorange' : 'sani_buffer_temp_down@white'),[vaillant:Umlaufmenge],0,20,120,0,'l/min')|\<br />
icon_uring('0,1,1,4','weather_barometric_pressure',[vaillant:Wasserdruck],0,3,undef,undef,'bar',1,100,[(0.8,0,1,60,1.5,120,1.7,60,3,0)])|\<br />
icon_uring('0,opacity:0.8,1,6','sani_water_tap',[vaillant:HwcHours_hoursum2_value],0,2000,120,0,'h',0)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_ring_bsp.png|ohne|mini]]<br />
<br clear="all"><br />
<br />
===== Farbskalierte Temperatur- und Feuchtigkeitsanzeige mit einem Icon mit Hilfe der SVG-Funktion '''icon_temp_hum_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperatur- bzw. Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar:<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_hum_ring'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_hum_ring ($icon,$temp_value,$hum_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp,$decFontHum)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$temp_value # Temperatur<br />
$hum_value # Feuchtigkeit<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp # Temperatur: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontHum # Feuchtigkeit: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_temp_hum_ring DOIF ##<br />
attr di_icon_temp_hum_ring uiTable {package ui_Table}\<br />
\<br />
"normal"|icon_temp_hum_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:humidity])\<br />
"mit Normalschrift"|icon_temp_hum_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:humidity], undef,undef,undef,undef,undef,"1,font-weight:normal","0,font-weight:normal")\<br />
"größer aufgehellt"|icon_temp_hum_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:humidity], undef,undef,120,undef,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_hum_ring.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Temperaturwerten mit einem Icon mit Hilfe der SVG-Funktion '''icon_temp_temp_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar:<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_temp_ring'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_temp_ring ($icon,$temp1_value,$temp2_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp1,$decFontTemp2)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$temp1_value # erster Temperaturwert<br />
$temp2_value # zweiter Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp1 # Temperatur1: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontTemp2 # Temperatur2: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_temp_temp_ring DOIF ##<br />
attr di_icon_temp_temp_ring uiTable {package ui_Table}\<br />
## Größe 120%\<br />
"FB-Heizung"|icon_temp_temp_ring(([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),[ESPEasy_ESP_Temp_Vorlauf:Temperature],[ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature],15,70,120)\<br />
\<br />
## Größe 120%, Normalschrift\<br />
"Temperatur","Taupunkt"|icon_temp_temp_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:dewpoint],undef,undef,120,undef,undef,"1,font-weight:normal","1,font-weight:normal")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_temp_ring.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Zahlenwerten mit einem Icon mit Hilfe der universellen SVG-Funktion '''icon_ring2''' =====<br />
Die Farbe der dargestellten Werte kann abhängig vom Wert bestimmt werden.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_ring2'''<br />
<syntaxhighlight lang="perl"><br />
icon_ring2 ($icon,$value1,$min1,$max1,$minColor1,$maxColor1,$unit1,$size,$colorFunc1,$decFont1, $value2,$min2,$max2,$minColor2,$maxColor2,$unit2,$colorFunc2,$decFont2,$lightnesss,$model)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$value1 # darzustellender Wert1<br />
$min1 # minimaler Wert, optional, default=0<br />
$max1 # maximaler Wert, optional, default=100<br />
$minColor1 # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor1 # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit1 # Einheit des Wertes, optional, default = undef<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc1 # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont1 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$value2 ## darzustellender Wert2<br />
...<br />
$unit2 # Einheit des Wertes, optional, default = undef<br />
$colorFunc2 # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont2 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
$model # '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>',<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
<br />
Argumente für den zweiten Wert entsprechend den Argumenten des ersten Wertes<br />
</syntaxhighlight><br />
Wird '''$colorFunc...''' nicht angegeben, so wird der Farbwert zwischen '''$minColor...''' und '''$maxColor...''' linear interpoliert.<br />
<br />
Bei der Farbangabe des Icons beim Übergabeparameter $icon wird mit '''\@colorVal2''' das Icon mit der Farbe des zweiten Wertes eingefärbt. Bei keiner Farbangabe oder '''\@colorVal1''' wird das Icon mit der Farbe des ersten Wertes eingefärbt. Ansonsten gilt die allgemeine FHEM-Syntax für Farbgebung von Icons angehängt mit '''\@'''.<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_ring2 DOIF ##<br />
attr di_icon_ring2 uiTable {package ui_Table;;\<br />
\<br />
sub himmelsrichtung {\<br />
my ($richtung)=@_;;\<br />
my $element=int($richtung/22.5);;\##/<br />
my @h=(qw"N NNO NO ONO O OSO SO SSO S SSW SW WSW W WNW NW NNW");;\<br />
return($h[$element]);;\<br />
}\<br />
}\<br />
"Wallbox"| icon_ring2("car,1.5,0,-3",[tesla:Leistung],0,3.6,120,0,"kW",120,undef,"1,font-weight:normal",[tesla:Kapazitaet],0,100,0,120,"%",undef,"0,font-weight:normal")\<br />
\<br />
"Wind"|icon_ring2(([Wind:Geschwindigkeit]>0 ? "wind":"no_wind").",1,0,0,".[Wind:Richtung],[Wind:Geschwindigkeit],0,50,120,0,"km/h",120,undef,1,[Wind:Richtung],361,361,220,220,([Wind:Geschwindigkeit]>0?himmelsrichtung([Wind:Richtung]):"--"),undef,0)\<br />
\<br />
"Strom"|icon_ring2([zaehler:l-Produktion] > 0 ? "sani_solar\@colorVal1":"fa_bolt\@colorVal2",[zaehler:l-Produktion],0,3.6,20,120,"PV kW",150,undef,"1,,font-size:50%;fill:white",[zaehler:l-Bezug,0],0,2,120,0,"Netz kW",undef,"1,,font-size:50%;fill:white")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_ring2.png|ohne|mini]]<br />
<br />
==== '''bar'''-Funktionen ====<br />
===== Farbskalierte Anzeige der Temperatur in Balkenform mit Hilfe der SVG-Funktionen '''temp_bar/temp_mbar''' =====<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''temp_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
Farbskalierung der '''temp_bar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_bar_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''temp_mbar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_mbar_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_bar/temp_mbar'''<br />
<syntaxhighlight lang="perl"><br />
temp_bar/temp_mbar ($temp_value,$temp_min,$temp_max, $header,$width,$height,$size, $light,$lightnumber,$decFont)<br />
<br />
$temp_value # Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$header # Überschrift, optional, default= undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=60<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_bar DOIF ##<br />
attr di_temp_bar uiTable {package ui_Table}\<br />
"standard"|temp_bar([Aussensensor:temperature])\<br />
"heller"|temp_bar([Aussensensor:temperature],undef,undef,undef,undef,undef,undef,80)\<br />
"monochrom"|temp_mbar([Aussensensor:temperature])\<br />
"kleiner"|temp_bar([Aussensensor:temperature],undef,undef,undef,undef,undef,80)\<br />
"mit Überschrift"|temp_bar([Aussensensor:temperature],undef,undef,"Außen")\<br />
"hoch"|temp_bar([Aussensensor:temperature],undef,undef,undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige der Feuchtigkeit in Balkenform mit Hilfe der SVG-Funktionen '''hum_bar/hum_mbar''' =====<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''hum_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
Farbskalierung der '''hum_bar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung hum_bar_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''hum_mbar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung hum_mbar_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''hum_bar/hum_mbar'''<br />
<syntaxhighlight lang="perl"><br />
hum_bar/hum_mbar ($hum_value,$header,$width,$height,$size, $light,$lightnumber,$decFont)<br />
<br />
$hum_value # Feuchtigkeitswert<br />
$header # Überschrift, optional, default = undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=80<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit des der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 0<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_hum_bar DOIF ##<br />
attr di_hum_bar uiTable {package ui_Table}\<br />
"standard"|hum_bar([Aussensensor:humidity])\<br />
"heller"|hum_bar([Aussensensor:humidity],undef,undef,undef,undef,80)\<br />
"monochrom"|hum_mbar([Aussensensor:humidity])\<br />
"kleiner"|hum_bar([Aussensensor:humidity],undef,undef,undef,80)\<br />
"mit Überschrift"|hum_bar([Aussensensor:humidity],"Außen")\<br />
"hoch"|hum_bar([Aussensensor:humidity],undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:hum_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Zahlenwertes mit Hilfe der universellen SVG-Funktion '''bar''' =====<br />
Die Farbe des dargestellten Wertes kann abhängig vom Wert bestimmt werden.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''bar'''<br />
<syntaxhighlight lang="perl"><br />
bar ($value,$min,$max,$header,$minColor,$maxColor,$unit,$width, $height,$size,$colorFunc,$decFont,$gradient,$light,$lightnumber)<br />
<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$header # Überschrift, optional, default = undef (keine)<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$width # Breite der Grafik, optional, default = 63<br />
$height # Höhe der Grafik, optional, default = 60<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
$gradient # Farbverlauf, optional, undef mit Farbverlauf, 1 ohne Farbverlauf, default = undef<br />
$light # Helligkeit der Grafik (light:0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (light:0-100), optional, default=50<br />
</syntaxhighlight><br />
Wird '''$colorFunc''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
{package ui_Table}<br />
defmod di_bar DOIF ##<br />
attr di_bar uiTable {package ui_Table}\<br />
## von 0 bis 20 in Farben von grün (hue:120) bis rot (hue:0)\<br />
"Umlaufmenge"|bar([heizung:Umlaufmenge],0,20,"Umlauf",120,0,"l/min")\<br />
\<br />
## von 0 bis 3 in Farben von rot (hue:0) bis türkis (hue:180)\<br />
"Wasserdruck"|bar([heizung:Wasserdruck],0,3,undef,0,180,"bar"undef,70,undef,undef,"1,font-size:130%;;font-weight:normal")\<br />
\<br />
## Temperaturdarstellung, entspricht dem Funktionsaufruf:\<br />
## temp_bar ([Aussensensor:temperature],-20,60)\<br />
"Temperatur"|bar([Aussensensor:temperature],-20,60,undef,undef,undef,"°C",undef,undef,undef,\&temp_hue)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:bar_bsp.png|ohne|mini]]<br />
<br />
==== '''icon_bar'''-Funktionen ====<br />
===== Farbskalierte Anzeige der Temperatur in Balkenform mit Hilfe der SVG-Funktion '''icon_temp_bar/icon_temp_mbar''' =====<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''icon_temp_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_bar/icon_temp_mbar'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_bar/icon_temp_mbar ($icon,$temp_value,$temp_min,$temp_max, $header,$width,$height,$size,$light,$lightnumber,$decFont)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position", \@Farbe, Skalierungsfaktor, x-Position, y-Position sind optional<br />
$temp_value # Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$header # Überschrift, optional, default= undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=75<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_temp_bar DOIF ##<br />
attr di_icon_temp_bar room test10<br />
attr di_icon_temp_bar uiTable {package ui_Table}\<br />
"standard"|icon_temp_bar("temp_outside",[Aussensensor:temperature])\<br />
"heller"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,undef,undef,undef,undef,80)\<br />
"monochrom"|icon_temp_mbar("temp_outside",[Aussensensor:temperature])\<br />
"kleiner"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,undef,undef,undef,80)\<br />
"mit Überschrift"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,"Außen")\<br />
"hoch"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige der Feuchtigkeit in Balkenform mit Hilfe der SVG-Funktionen '''icon_hum_bar/icon_hum_mbar''' =====<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''icon_hum_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_hum_bar/icon_hum_mbar'''<br />
<syntaxhighlight lang="perl"><br />
icon_hum_bar/icon_hum_mbar ($icon,$hum_value,$header,$width,$height,$size, $light,$lightnumber,$decFont)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position", \@Farbe, Skalierungsfaktor, x-Position, y-Position sind optional<br />
$hum_value # Temperaturwert<br />
$header # Überschrift, optional, default = undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=75<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit des der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_hum_bar DOIF ##<br />
attr di_icon_hum_bar uiTable {package ui_Table}\<br />
"standard"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity])\<br />
"heller"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],undef,undef,undef,undef,80)\<br />
"monochrom"|icon_hum_mbar("temperature_humidity",[Aussensensor:humidity])\<br />
"kleiner"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],undef,undef,undef,80)\<br />
"mit Überschrift"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],"Außen")\<br />
"hoch"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_hum_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Zahlenwertes mit Hilfe der universellen SVG-Funktionen '''icon_bar/icon_mbar''' =====<br />
Die Farbe des dargestellten Wertes und des Icons kann abhängig vom Wert bestimmt werden. Bei der '''icon_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_bar/icon_mbar'''<br />
<syntaxhighlight lang="perl"><br />
icon_bar ($icon,$value,$min,$max,$minColor,$maxColor,$unit,$decfont,$header,$width,$height,$size, $colorFunc,$light,$lightnumber)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation (0-360) sind optional<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$header # Überschrift, optional, default = undef (keine)<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
$width # Breite der Grafik, optional, default = 63<br />
$height # Höhe der Grafik, optional, default = 75<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$light # Helligkeit der Grafik (light:0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (light:0-100), optional, default=50<br />
</syntaxhighlight><br />
Wird '''$colorFunc''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_bar_bsp DOIF ##<br />
attr di_icon_bar_bsp uiTable {package ui_Table;;\<br />
}\<br />
icon_bar ("fuel",[Tankstelle:Diesel],1.10,1.30,120,0,"€",2)|\<br />
icon_bar ("air",[ESPEasy_Eingang_CO2:PPM],400,1200,120,0,"ppm",0)|\<br />
icon_bar ("Zisterne",([Wasserzisterne]/3.4),0,100,0,120,"%",0)|\<br />
icon_bar (([vaillant:Pumpenstatus] eq "off" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),[vaillant:Umlaufmenge],0,20,120,0,"l/min")\<br />
icon_bar ("measure_water_meter",[Wasserverbrauch:heute],0,600,120,0,"l",0)|\<br />
icon_bar ("weather_barometric_pressure",[vaillant:Wasserdruck],0,3,0,180,"bar")|\<br />
icon_bar ("sani_water_tap",[vaillant:HwcHours_hoursum2_value],0,2000,120,0,"h",0)|\<br />
icon_bar ("sani_floor_heating_neutral",[Heizenergie:Vortag_hc],0,150,120,0,"kWh")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_bar_bsp.png|ohne|mini]]<br />
<br />
==== Anzeige eines Werteverlaufs und des aktuellen Wertes mit Hilfe der SVG-Funktion '''card''' ====<br />
Es wird der aktuelle Wert eines Readings, sein zeitlicher Verlauf sowie der maximale und minimale Wert in Form einer Informationskarte visualisiert. Das Erscheinungsbild kann über zahlreiche Parameter individualisiert werden. Die Besonderheit ist das Argument '''col<Anzahl><Zeitformat>''' bei der Angabe des Readings der Form '''[<Device>:<Reading>:col<Anzahl><Zeitformat>]'''. Dadurch werden Daten des Readings temporär im DOIF-Modul gesammelt und für die Erzeugung eines Graphen zur Verfügung gestellt - es sind keine weiteren Definitionen erforderlich. Dabei wird besonders sparsam mit der Datensammlung umgegangen, es werden maximal 72 Werte (in Timeslots) gespeichert, unabhängig davon wie lange die Zeitspanne ist und wie oft die Daten ankommen. Die Auflösung des Graphen nimmt mit der Zeitspanne ab - es werden immer maximal 72 Werte dargestellt. Daraus ergibt sich bei einer Stunde eine Auflösung von 3600/72 = 50 Sekunden/Eintrag, bei 6 Stunden sind es 6*60/72 = 5 Minuten/Eintrag, für eine Woche 7*24*60/72 = 140 Minuten/Eintrag usw. Die gesammelten Daten werden über den FHEM-Befehl '''save''' in versteckten Readings des jeweiligen DOIF-Moduls gespeichert.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''card'''<br />
<syntaxhighlight lang="perl"><br />
card ($collect,$header,$icon,$min,$max,$minColor,$maxColor, $unit,$colorRef,$decfont,$prop,$ringModel,$lightness, $collect2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$decfont2)<br />
<br />
$collect <br />
# Angabe eines Readings oder eines Arrays mit mehreren Readings der Form [<Device>:<Reading>:col<Anzahl><Zeitformat>], mit Hilfe des Argumentes col (von collect) wird das Modul angewiesen Daten des Readings über einen bestimmten Zeitraum zu sammeln<br />
<br />
col<number><timeformat> <br />
# <timeformat>: d Tage, w Wochen, ohne Angabe des Zeitformates wird <Anzahl> in Stunden interpretiert. <br />
# Beispiele: col (entspricht col24), col1, col12, col1d, col3d, col1w, col4w, col52w usw.<br />
<br />
$header # "<Überschrifttext,<Style-SVG-Text-Attribute>", optional<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = 0 (rot)<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = 120 (grün)<br />
$unit <br />
# Einheit des Wertes, optional, default = undef, falls unter $collect ein Array für mehrere Readings angegeben wurde, so werden hier als Array die entsprechenden Einheiten angegeben, zusätzlich kann kommagetrennt pro Einheit Farbe des Graphen angegeben werden<br />
<br />
$colorRef <br />
# Referenz auf eine Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, oder eine Referenz auf eine Arrayliste mit Grenzwerten und Farben, optional, default = undef<br />
<br />
$decFont<br />
# "<Anzahl der Nachkommastellen>,<Style-SVG-Attribute Wert>,<Style-SVG-Attribute Einheit>", optional<br />
<br />
$prop <br />
# Eigenschaft von card: "<size>,<y-scaling>,<steps>,<noFooter>,<noColor>,<hring>,<width>", optional<br />
<br />
# <size>: Größe der der Karte, default = 130,<br />
# <y-scaling>: feste Y-Skalierung: 1, sonst automatische Skalierung,<br />
# <steps>: 1 für Stufen,<br />
# <noFooter>: 1 für keine Fußzeile,<br />
# <noColor>: 1 für graue y-Achsenbeschriftung, <br />
# <hring>: 1 für Halbringdarstellung, <br />
# <width>: Breite der Karte, default: 160<br />
<br />
$ringModel<br />
# '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>'<br />
<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
<br />
$lightness <br />
# Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
<br />
$collect2 # optionale Angaben für ein zweites Reading (es ist hier nur eine Readingangabe erlaubt)<br />
$min # restliche Parameter<br />
$max # entsprechen der Syntax<br />
... # des ersten Sensors<br />
$decfonts2 # <br />
</syntaxhighlight><br />
Wird '''$colorRef''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
Werden mehrere Readings angegeben, so müssen sie alle die gleiche Zeitspanne besitzen (Zeitangabe bei col)<br />
<br />
'''nützliche Links'''<br />
* Anwendungsbeispiel [[DOIF/uiTable_Schnelleinstieg#Visualisierung:_Wetterstation|Wetterstation]]<br />
* Anwendungsbeispiel [[DOIF/uiTable_Schnelleinstieg#Visualisierung:_aktueller_Spritpreis|Spritpreise]]<br />
* Anwendungsbeispiel [[DOIF/uiTable_Schnelleinstieg#Visualisierung_und_Steuerung:_Heiztherme|Heiztherme]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Farbskalierte_Anzeige_eines_Icons_mit_einem_Zahlenwert_mit_Hilfe_der_universellen_SVG-Funktion_icon_ring.2Ficon_mring.2Ficon_uring|icon_ring]] <br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_collect DOIF ##<br />
attr di_collect uiTable {package ui_Table;;}\<br />
card([Aussensensor:temperature:col12],"Außen","temp_outside",-10,45,undef,undef,"°C",\&temp_hue,undef)|\<br />
card([Tankstelle:Diesel:col12],"Sprit,fill:darkorange","fuel","1.00","1.40",120,0,"Diesel €",undef,"2",",,1")\<br />
card([zaehler:l-Produktion:col12],undef,[zaehler:l-Produktion] > 0 ? "sani_solar\@colorVal1":"fa_bolt\@colorVal2",0,3.6,30,60,"PV kW",undef,"1,,font-size:50%")|\<br />
card([ESPEasy_Eingang_CO2:PPM:col12],undef,"air",400,1200,120,0,"ppm",[600,120,1000,60,1200,0],0,undef,'0,1,1',"50,35,45,35,50,35")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:svgcard.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
<br />
defmod di_cards DOIF {}<br />
attr di_cards uiTable {package ui_Table;;}\<br />
"Standard"|\<br />
card([Aussensensor:temperature:col],undef,"temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130")\<br />
"mit Halbring"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130,,,,,1")\<br />
"mit Halbring","ohne Fußzeile","Breite 110"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130,,,1,,1,110")\<br />
"Standard","Breite 200"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130,,,,,,200")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_variations.png|ohne|mini]]<br />
<br />
<br />
'''<big>Beispieldefinition mit zwei Readings mit unterschiedlichen Einheiten</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_cards DOIF {}<br />
attr di_cards uiTable {package ui_Table;;}\<br />
"Standard"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,,",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"ohne Header"|\<br />
card([Aussensensor:temperature:col],undef,"temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,,",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"ohne Header","ohne Fußzeile"|card([Aussensensor:temperature:col],undef,"temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,1,",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"Als Halbring"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,,,1",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"ohne Fußzeile"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,1,,1",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_collect2.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinitionen mit mehreren Readings mit gleicher Einheit</big>'''<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod Sprit DOIF ##<br />
attr Sprit uiTable {package ui_Table;;}\<br />
card([[Tankstelle:SuperE5:col24],[Tankstelle:Diesel:col24]],"Sprit","fuel","1.20","1.60",120,0,["E5","Diesel"],undef,"2",",,1")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_Sprit2.png|ohne|mini]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod PV DOIF {}<br />
attr PV DOIF_Readings l_Eigenv: [zaehler:l-Produktion]-[zaehler:l-Lieferung],\<br />
Eigenv:[zaehler:Produktion]-[zaehler:Lieferung],\<br />
l_Verbrauch: [zaehler:l-Bezug,0]+[$SELF:l_Eigenv,0],\<br />
Verbrauch:[zaehler:Bezug]+[$SELF:Eigenv],\<br />
l_Bezug:-[zaehler:l-Bezug]<br />
attr PV uiTable {\<br />
package ui_Table;;\<br />
$SHOWNOSTATE=1;;\<br />
}\<br />
card([[zaehler:l-Produktion:col],[$SELF:l_Eigenv:col],[$SELF:l_Bezug:col]],"kW","fa_bolt\@silver",-3.6,3.6,0,90,["Solar","Eigen.","Bezug"],[(-1,0,0,30,1,60,3.6,90)],"2","167,,1,,,1",",,1,6")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_energie.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinition mit mehreren Readings mit einfarbigen Graphen</big>'''<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_heating DOIF {}<br />
attr di_heating uiTable {\<br />
package ui_Table;;\<br />
}\<br />
card([[ESPEasy_ESP_Temp_Vorlauf:Temperature:col],[ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature:col]],"Umwälzpumpe",([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),15,70,undef,undef,["Vor. °C,red","Rück. °C,#287afc"],\&temp_hue,undef,",,1,,1")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_pump.png|ohne|mini]]<br />
<br />
==== 3d-Balkendarstellung mehrerer Zahlenwerten mit Hilfe der universellen SVG-Funktion '''cylinder''' ====<br />
Es können mehrere Zahlenwerte mit Legende farbig in Balkenform visualisiert werden. Negative Werte werden als Balken nach unten dargestellt, positive nach oben, der Nullpunkt wird automatisch berechnet.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''cylinder'''<br />
<syntaxhighlight lang="perl"><br />
cylinder ($header,$min,$max,$unit,$width,$height,$size,$dec,($value1,$color1,$text1),($value2,$color2,$text2),...<br />
<br />
$header # Überschrift<br />
$min # minimaler Wert, optional, default = 0<br />
$max # maximaler Wert, optional, default = 100<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$width # Breite der Grafik, optional, default = wird bei Beschriftungen automatisch angepasst<br />
$height # Höhe der Grafik, optional, default = wird automatisch berechnet<br />
$size # Größe der Grafik, optional, default = 100<br />
$dec # Anzahl der Nachkommastellen, optional, default=1<br />
$value1 # erster Zahlenwert<br />
$color1 # HSL-Farbe des ersten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text1 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
$value2 # zweiter Zahlenwert, optional<br />
$color2 # HSL-Farbe des zweiten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text2 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
...<br />
Es können weitere Zahlenwerte jeweils mit Farbe und Beschriftung optional angegeben werden <br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_cylinder DOIF ##<br />
attr di_cylinder room Test,wiki<br />
attr di_cylinder uiTable {package ui_Table}\<br />
"normal"|cylinder("",0,100,"%",80,undef,undef,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"mit Überschrift"|cylinder("Zisterne",0,100,"%",80,undef,undef,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"kleiner"|cylinder("Zisterne",0,100,"%",80,undef,80,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"hoch"|cylinder("Zisterne",0,100,"%",undef,100,undef,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"mit Beschriftung"|cylinder("Zisterne",0,100,"%",undef,100,undef,0,[Wasserzisterne:state],200,"Wasserstand")\<br />
\<br />
"mit mehreren Informationen"|cylinder("Energie",-20,30,"kWh",undef,undef,undef,1,[zaehler:Bezug],0,"Bezug",[zaehler:Produktion],60,"Produktion",[zaehler:Eigenverbrauch],30,"Eigenverbrauch")\<br />
\<br />
"mit hellen Farben"| cylinder("Tag",0,100,"kWh",undef,undef,undef,1,[Heizenergie:Tagesverbrauch_hc]/100000,"30.100.70","letzter",[Heizenergie:heute_hc]/100000,"60.100.70","aktuell")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:cylinder_bsp.png|ohne|mini]]<br />
<br />
==== Balkendarstellung mehrerer Zahlenwerte mit Hilfe der universellen SVG-Funktion '''cylinder_bars''' ====<br />
Es können mehrere Zahlenwerte mit Legende farbig in Balkenform visualisiert werden. Negative Werte werden als Balken nach unten dargestellt, positive nach oben, der Nullpunkt wird automatisch berechnet. Die '''cylinder_bars'''-SVG-Funkton besitzt die gleichen Argumente, wie die obige '''cylinder'''-SVG-Funktion, mehrerer Balken werden jedoch nicht übereinander, sondern nebeneinander dargestellt.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''cylinder_bars'''<br />
<syntaxhighlight lang="perl"><br />
cylinder_bars ($header,$min,$max,$unit,$width,$height,$size,$dec,($value1,$color1,$text1),($value2,$color2,$text2),...<br />
<br />
$header # Überschrift<br />
$min # minimaler Wert, optional, default = 0<br />
$max # maximaler Wert, optional, default = 100<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$width # Breite der Grafik, optional, default = wird bei Beschriftungen automatisch angepasst<br />
$height # Höhe der Grafik, optional, default = wird automatisch berechnet<br />
$size # Größe der Grafik, optional, default = 100<br />
$dec # Anzahl der Nachkommastellen, optional, default=1<br />
$value1 # erster Zahlenwert<br />
$color1 # HSL-Farbe des ersten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text1 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
$value2 # zweiter Zahlenwert, optional<br />
$color2 # HSL-Farbe des zweiten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text2 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
...<br />
Es können weitere Zahlenwerte jeweils mit Farbe und Beschriftung optional angegeben werden <br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_wasserverbrauch DOIF ##<br />
attr di_wasserverbrauch uiTable {package ui_Table;;}\<br />
cylinder_bars("Monat",0,15,"m³",undef,undef,undef,1,[Wasserverbrauch:monatsdurchschnitt],30,"Durchschnitt",[Wasserverbrauch:monatsverbrauch]/1000,220,"letzter",[Wasserverbrauch:monat]/1000,180,"aktuell")\<br />
\<br />
cylinder_bars("Monat",0,15,"m³",undef,undef,undef,1,[Wasserverbrauch:jan],30,"Januar",[Wasserverbrauch:feb],220,"Februar",[Wasserverbrauch:mrz],180,"März",[Wasserverbrauch:apr],30,"April",[Wasserverbrauch:mai],220,"Mai",[Wasserverbrauch:jun],180,"Juni",[Wasserverbrauch:jul],30,"Juli",[Wasserverbrauch:aug],220,"August",[Wasserverbrauch:sep],180,"September",[Wasserverbrauch:okt],30,"Oktober",[Wasserverbrauch:nov],220,"November",[Wasserverbrauch:dez],180,"Dezember")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:cylinder_bars_bsp.png|ohne|mini]]<br />
<br />
=== Farbskalierte Temperaturanzeige mit Hilfe der Funktion '''temp''' ===<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert:<br />
[[Datei:Farbskalierung temp.png|600px|ohne]]<br />
{{Randnotiz|RNText=uiTable-Funktion '''temp'''<br />
<syntaxhighlight lang="perl"><br />
temp ($temp,$size,$icon)<br />
<br />
$temp # Temperatur<br />
$size # Schriftgröße in Pixel (pt), optional<br />
$icon # Icon, welches vorangestellt wird, optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_temp DOIF ##<br />
attr di_uiTable_temp uiTable {\<br />
package ui_Table;; ## Package für uiTable-Funktionen\<br />
$TC{0..2}="align='center'";; ## zentrierte Darstellung aller Tabellenspalten\<br />
}\<br />
## Tabellendefinition\<br />
\<br />
"Aussen"|"Bad"|"Warmwasser" ## mit | werden Tabellenzellen voneinander getrennt \<br />
temp([Aussensensor:temperature])| ## Anzeige des Readings 'temperature' des Gerätes 'Aussensensor' \<br />
temp([TH_Bad_HM:measured-temp],24,"temp_temperature")| ## Schriftgröße 24pt, mit Icon namens temp_temperature\<br />
temp([T_Warmwasserspeicher:temperature:d1],20) ## Schriftgröße 20pt<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Temp.png|ohne|mini]]<br />
<br />
=== Farbskalierte Feuchtigkeitsanzeige mit Hilfe der Funktion '''hum''' ===<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert:<br />
[[Datei:Farbskalierung hum.png|350px|ohne]]<br />
{{Randnotiz|RNText=uiTable-Funktion '''hum'''<br />
<syntaxhighlight lang="perl"><br />
hum ($hum,$size,$icon)<br />
<br />
$hum # Feuchtigkeit<br />
$size # Schriftgröße in Pixel (pt), optional<br />
$icon # Icon, welches vorangestellt wird, optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_hum DOIF ##<br />
attr di_uiTable_hum uiTable {\<br />
package ui_Table;;\<br />
$TC{1}="align='center'";; ## zweite Spalte der Tabelle zentriert\<br />
}\<br />
## Tabellendefinition \<br />
\<br />
## Anzeige des Readings 'humidity' des Thermostats 'TH_Bad_HM' \<br />
"Bad"|hum ([TH_Bad_HM:humidity])\<br />
\<br />
## Feuchtigkeit in Größe 10pt mit Temperatur in einer Tabellenzelle\<br />
"Aussen"|temp ([Aussensensor:temperature]),hum ([Aussensensor:humidity],10)\<br />
\<br />
## Feuchtigkeit in Größe 26pt mit Icon namens 'temperature_humidity'\<br />
"Keller"|hum ([TH_Keller_HM:humidity],26,"temperature_humidity")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable Funktion hum.png|ohne|mini]]<br />
<br />
=== Textformatierungen mit Hilfe der Funktion '''style''' ===<br />
Texte werden in Farbe, Größe und Schriftart statisch oder dynamisch formatiert.<br />
{{Randnotiz|RNText=uiTable-Funktion '''style'''<br />
<syntaxhighlight lang="perl"><br />
style ($text,$color,$font_size,$font_weight)<br />
<br />
$text # anzuzeigender Text<br />
$color # CSS color, optional<br />
$font_size # Schriftgröße in Pixel (pt), optional<br />
$font_weight # CSS Schriftart, optional<br />
</syntaxhighlight><br />
Mögliche Werte für '''''color''''' und '''''font_weight''''' können in einschlägiger Dokumentation zu CSS nachgeschlagen werden<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_style DOIF ##<br />
attr di_uiTable_style uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## Tabellendefinition\<br />
\<br />
## statische Farbgebung, Größe, Schriftart \<br />
style("Montag","orange")\<br />
style("Dienstag","red",14)\<br />
style("Mittwoch","#00FFFF",20)\<br />
style("Donnerstag","blue",23,"bold")\<br />
\<br />
## dynamische Farbgebung abhängig vom Zustand des Gerätes 'Alarm'\<br />
style("Alarm",([Alarm:state] eq "on" ? "red":"green"))\<br />
\<br />
## dynamische Farbgebung des Zustands des Gerätes 'Alarm'\<br />
style([Alarm:state],([Alarm:state] eq "on" ? "red":"green"))\<br />
\<br />
## variabler Text abhängig vom Zustand des Gerätes 'Alarm'\<br />
style(([Alarm:state] eq "on" ? "Alarm aktiv":"Alarm deaktiviert"),"red")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Style.png|ohne|mini]]<br />
<br />
=== Icon-Darstellung mit Hilfe der Funktion '''ICON''' ===<br />
Mit Hilfe der Funktion '''ICON''' kann ein FHEM-Icon dargestellt werden<br />
{{Randnotiz|RNText=uiTable-Funktion '''ICON'''<br />
<syntaxhighlight lang="perl"><br />
ICON ($icon)<br />
<br />
$icon # Icon mit Farbgebung<br />
</syntaxhighlight><br />
<br />
'''ICON''' benutzt die Funktion [[DevelopmentFHEMWEB-API#FW_makeImage|FW_makeImage]]<br />
<br />
'''nützliche Links'''<br />
* [[DOIF/uiTable Schnelleinstieg#hsv-Funktion für Farbskalierungen|hsv-Funktion]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_Table_ICON DOIF ##<br />
attr di_Table_ICON uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## Tabellendefinition\<br />
ICON("temp_frost") | ## Icon ohne Einfärbung\<br />
ICON("temp_frost\@blue") | ## Icon in CSS-Farbe blau\<br />
ICON("temp_frost\@#8A2BE2") | ## Icon in CSS-Farbe #8A2BE2\<br />
ICON("temp_frost\@".([Aussensensor:temperature] > 0 ? "orange":"blue"))| ## Icon in CSS-Farbe orange über Null Grad, sonst in CSS-Farbe blau\<br />
ICON("temp_frost\@".hsv ([Aussensensor:temperature],-20,40,320,0)) ## Icon in Farbskalierung von violett (-20 °C) bis rot (40 °C) mit Hilfe der Funktion hsv<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable_IC.png|mini|ohne]]<br />
<br />
=== Icon-Darstellung mit Text mit Hilfe der Funktion '''icon_label''' ===<br />
Mit Hilfe der Funktion '''icon_label''' kann ein FHEM-Icon mit einem angehängten Text/Wert dargestellt werden.<br />
{{Randnotiz|RNText=uiTable-Funktion '''icon_label'''<br />
<syntaxhighlight lang="perl"><br />
icon_label ($icon,$text,$color,$color_bg,$pos_left,$pos_top)<br />
$icon # FHEM-Icon mit Farboption<br />
$text # dargestellter Text<br />
$color # Farbe des Textes, optional<br />
$color # Hintergrundfarbe des Textes, optional<br />
$pos_left # horizontale Position des Textes in px, default -5, optional<br />
$pos_top # vertikale Position des Textes in px, default -8, optional<br />
</syntaxhighlight><br />
<br />
'''Anwendungsbeispiele'''<br />
* [[DOIF/uiTable Schnelleinstieg#Anzahl der Tage bis zur Abfall-Entsorgung|Abfall]]<br />
* [[DOIF/uiTable Schnelleinstieg#Visualisierung: aktueller Spritpreis|Sprit]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_icon_label DOIF ##<br />
attr di_uiTable_icon_label uiTable { package ui_Table;;\<br />
}\<br />
\<br />
icon_label("fuel",[Tankstelle:Diesel])|\<br />
icon_label("fuel",[Tankstelle:Diesel],"red")|\<br />
icon_label("fuel\@blue",[Tankstelle:Diesel],"blue","#999999")|\<br />
icon_label("fuel\@red",[Tankstelle:Diesel],"red","white",-10)|\<br />
icon_label("fuel",[Tankstelle:Diesel],"white","red",-5,8)\<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable_icon_label.png|mini|ohne]]<br />
<br />
=== Visualisierung eines Gerätes mit Hilfe der Funktion '''icon''' ===<br />
Der Zustand eines Gerätes/Readings wird mit Hilfe eines Icons dargestellt.<br />
{{Randnotiz|RNText=uiTable-Funktion '''icon'''<br />
<syntaxhighlight lang="perl"><br />
icon ($value,$icon_off,$icon_on,$state_off,$state_on)<br />
<br />
$value # Wert <br />
$icon_off # Icon für den Wert off, default "off"<br />
$icon_on # Icon für den Wert on, default Icon für Wert 'off' in Farbe 'DarkOrange', sonst Icon 'on', wenn $icon_off nicht definiert ist<br />
$state_off # Wert zugehörig zum Icon off, default "off"<br />
$state_on # Wert zugehörig zum Icon on, default "on"<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_icon DOIF ##<br />
attr di_uiTable_icon uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## Tabellendefinition\<br />
\<br />
## Standard-Icon off/on für Standardwert off/on \<br />
"Lampe"|icon([Lampe:state]) ## entspricht icon([Lampe:state],"off","on","off","on")\<br />
\<br />
## Icon für Zustand 'off' ist 'hue_room_hallway', für Zustand 'on' 'hue_room_hallway\@DarkOrange'\<br />
"Flur"|icon([Lampeflur:state],"hue_room_hallway") ## entspricht icon([Lampeflur:state],"hue_room_hallway","hue_room_hallway\DarkOrange","off","on")\<br />
\<br />
## Icon für Zustand 'off' ist 'status_away_2', für Zustand 'on' 'status_available\@DarkOrange'\<br />
"Anwesenheit"|icon([Anwesenheit:state],"status_away_2","status_available\@DarkOrange") \<br />
\<br />
## Icon für Zustand 'closed' ist "status_locked", für Zustand 'open' 'status_open\@DarkOrange'\<br />
"Haus"|icon([Schloss:state],"status_locked","status_open\@DarkOrange","closed","open") <br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable icon.png|mini|ohne]]<br />
<br />
=== Schaltbares Icon mit Hilfe der Funktion '''switch''' ===<br />
Der Zustand eines Gerätes/Readings wird mit Hilfe eines Icons dargestellt, er kann über die WEB-Oberfläche durch Anklicken geschaltet werden. Damit der Zustand des Gerätes geschaltet werden kann, muss das Gerät den set-Befehl unterstützen.<br />
<br />
{{Randnotiz|RNText=uiTable-Funktion '''switch'''<br />
<syntaxhighlight lang="perl"><br />
switch ($value,$icon_off,$icon_on,$state_off,$state_on)<br />
<br />
$value # [<device>:<reading>] <br />
$icon_off # Icon für den Wert off, default "off"<br />
$icon_on # Icon für den Wert on, default Icon für Wert 'off' in Farbe 'DarkOrange', sonst Icon 'on', wenn $icon_off nicht definiert ist<br />
$state_off # Wert zugehörig zum Icon off, default "off"<br />
$state_on # Wert zugehörig zum Icon on, default "on"<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_switch DOIF ##<br />
attr di_uiTable_switch uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## schaltbares Icons in der Webansicht \<br />
switch([Lampe:state]) | \<br />
switch([Lampeflur:state],"hue_room_hallway") |\<br />
switch([Anwesenheit:state],"status_away_2","status_available\@DarkOrange")|\<br />
switch([Haus:state],"status_locked","status_open\@DarkOrange","closed","open")\<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable switch.png|mini|ohne]]<br />
<br />
=== Rollladen: Visualisierung und Steuerung mit Hilfe der Funktion '''shutter''' ===<br />
Die aktuelle Position des Rollladens (0 % - 100 %) wird über Icons visualisiert. Das Anklicken eines Symbols steuert den Rollladen auf die entsprechende Position. Prozentwerte zwischen zwei Icon-Werten werden dem nächsthöheren Icon-Wert zugeordnet.<br />
{{Randnotiz|RNText=uiTable-Funktion '''shutter'''<br />
<syntaxhighlight lang="perl"><br />
shutter ($value,$color,$type)<br />
<br />
$value # [<device>:<reading>] <br />
$color # Farbe der aktuellen Rollladenposition, vorangestelltes @ verändert die Farbe des Icons, ohne @ wird der Hintergrund des Icons eingefärbt, default ist @DarkOrange<br />
$type # optional, Anzahl der Symbole 2 bis 6, 3 ist default<br />
</syntaxhighlight><br />
<br />
* [[DOIF/uiTable Schnelleinstieg#Visualisierung und Steuerung von Rollläden|Anwendungsbeispiel]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_shutter DOIF ##<br />
attr ui_Table_shutter uiTable {\<br />
package ui_Table;;\<br />
}\<br />
shutter([R_Keller:pct],"\@yellow",2) ## zwei Symbole für 0 % und 100 %\<br />
shutter([R_Wohnzimmer_S:pct]) ## entspricht shutter ([R_Wohnzimmer_S:pct],"\@DarkOrange",3) \<br />
shutter([R_Wohnzimmer_W1:pct],"blue",4) ## vier Symbole \<br />
shutter([R_Wohnzimmer_W2:pct],"\@red",5) ## fünf Symbole\<br />
shutter([R_Wohnzimmer_W3:pct],"red",6 ## sechs Symbole)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable shutter.png|mini|ohne]]<br />
<br />
=== Helligkeit: Visualisierung und Steuerung mit Hilfe der Funktion '''dimmer''' ===<br />
Die aktuelle Helligkeit (0 % - 100 %) wird über Icons visualisiert. Das Anklicken eines Icons bestimmt die Helligkeit der Leuchte. Prozentwerte zwischen zwei Icon-Werten werden dem nächsthöheren Icon-Wert zugeordnet.<br />
{{Randnotiz|RNText=uiTable-Funktion '''dimmer'''<br />
<syntaxhighlight lang="perl"><br />
dimmer ($value,$color,$type)<br />
<br />
$value # [<device>:<reading>] <br />
$color # Farbe der aktuellen Helligkeit, vorangestelltes @ verändert die Farbe des Icons, ohne @ wird der Hintergrund des Icons eingefärbt, default ist @DarkOrange<br />
$type # Anzahl der Symbole 2 bis 7, 3 ist default<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_dimmer DOIF ##<br />
attr di_uiTable_dimmer uiTable {\<br />
package ui_Table;;\<br />
}\<br />
dimmer([Strauch3:pct],"\@yellow",2)\<br />
dimmer([Strauch3:pct]) ## entspricht dimmer([Strauch3:pct],"\@DarkOrange",3) \<br />
dimmer([Strauch3:pct],"blue",4)\<br />
dimmer([Strauch3:pct],"\@red",5)\<br />
dimmer([Strauch3:pct],"red",6)\<br />
dimmer([Strauch3:pct],"DarkOrange",7)<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable dimmer.png|mini|ohne]]<br />
<br />
=== Vorgabetemperatur eines Thermostats mit Hilfe der Funktion '''temp_knob''' ===<br />
Die aktuelle Vorgabetemperatur eines Thermostats wird über ein Icons visualisiert. Durch Anklicken des Ringes wird die Vorgabetemperatur verändert.<br />
{{Randnotiz|RNText=uiTable-Funktion '''temp_knob'''<br />
<syntaxhighlight lang="perl"><br />
temp_knob ($value,$color,$set)<br />
<br />
$value # [<device>:<reading>] <br />
$color # Farbe der voreingestellten Temperatur, default "Darkorange"<br />
$set # set-Befehl, default "set", sonst muss "set <Readingname>" angegeben werden, falls sich das Reading vom set-Befehl vom angezeigten Reading unterscheidet, wie beim THRESHOLD-Modul<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_temp_knob DOIF ##<br />
attr ui_Table_temp_knob uiTable {\<br />
package ui_Table;;\<br />
}\<br />
\<br />
## HM-EU-Thermostat, angezeigt wird das Reading "desired-temp", geschaltet wird über "set desired-temp" \<br />
"Dachgeschoss"|temp_knob([TH_DG_HM:desired-temp]) ## entspricht temp_knob([TH_DG_HM:desired-temp],"Darkorange","set") \<br />
\<br />
## HM-EU-Thermostat Temperaturanzeige in gelb \ <br />
"Wohnzimmer"|temp_knob([TH_WZ_HM:desired-temp],"yellow") \<br />
\<br />
## Beim THRESHOLD-Modul wird das Reading "desired_value" angezeigt, geändert wird die Temperatur per "set desired" \<br />
"Küche"|temp_knob([TH_Kueche:desired_value],"red","set desired")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable temp knob.png|mini|ohne]]<br />
<br />
== uiTable-'''Templates''' ==<br />
Die Definition einer oder mehrere Zellen kann zu einem Template zusammengefasst werden. Durch die Nutzung von Templates kann die Definition einer Tabelle erheblich vereinfacht werden. Insb. bei gleichartigen Zellen/Zeilen für verschiedene Geräte/Readings braucht eine aufwendige Definition nicht immer wieder wiederholt werden, sondern kann jeweils mit dem Aufruf eines zuvor definierten Templates realisiert werden.<br />
{{Randnotiz|RNText='''Templates'''<br />
* Die Definition von Templates muss vor der Tabellendefinition vorgenommen werden<br />
* Eine Template-Definition beginnt mit dem Schlüsselwort '''DEF'''<br />
* Der Template-Name muss mit '''TPL_''' beginnen<br />
* '''Template-Definition'''-Syntax<br />
<syntaxhighlight lang="perl"><br />
DEF TPL_<Template-Name>(<Zellendefinition mit Platzhaltern: $1,$2,...>)<br />
</syntaxhighlight><br />
* Templates-Definitionen können in externe Dateien ausgelagert werden<br />
* Templates-Definitionen können per IMPORT-Befehl aus externen Dateien importiert werden<br />
* '''Template-Import'''-Syntax<br />
<syntaxhighlight lang="perl"><br />
IMPORT <Pfad mit Dateinamen><br />
</syntaxhighlight><br />
* Innerhalb einer Tabellendefinition können zuvor definierte oder importierte Templates mehrfach genutzt werden<br />
* '''Template-Aufruf'''-Syntax<br />
<syntaxhighlight lang="perl"><br />
TPL_<Template-Name>(<Übergabeparameter für $1>,<Übergabeparameter für $2>,...)<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_Template DOIF ##<br />
attr ui_Table_Template uiTable {\<br />
package ui_Table;;\<br />
$TC{1..3}="align='center'";; ## Spalten 1 bis 3 werden zentriert\<br />
}\<br />
\<br />
## Template-Definitionen beginnen vor der Tabellendefinition\<br />
\<br />
## Das Template TPL_raum stellt eine Tabellenzeile dar, die mit Hilfe von uiTable-Funktionen mehrere Tabellenzellen definiert\<br />
DEF TPL_raum ("$1" | temp([TH_$2_HM:measured-temp]),hum([TH_$2_HM:humidity]) | switch([H_$2:state],"fa_off") | temp_knob([TH_$2_HM:desired-temp]))\<br />
\<br />
## Tabellendefinition\<br />
\<br />
## pro Tabellenzeile wird ein Raum mit Hilfe des oben definierten Templates "TPL_raum" dargestellt\<br />
"Raum"|"Temp./Feuchte"|"Ventil"|"Vorgabetemp."\<br />
TPL_raum (Dachgeschoss,DG) ## der Übergabeparameter "Dachgeschoss" wird im Template "TPL_raum" anstelle von $1 eingesetzt, "DG" wird anstelle von $2 eingesetzt\<br />
TPL_raum (Bad,Bad)\<br />
TPL_raum (Kinderzimmer ost,Kz_o)\<br />
TPL_raum (Kinderzimmer west,Kz_w)\<br />
TPL_raum (Wohnzimmer,WZ)\<br />
TPL_raum (Keller,Keller)<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable Templates.png|mini|ohne]]<br />
<br />
== Eigene uiTable-Funktionen programmieren ==<br />
Für die eigenen Bedürfnisse können eigene uiTable-Funktionen programmiert werden. In der Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DOIF/uiTable.tpl contrib/DOIF/uiTable.tpl] befinden sich alle intern definierten uiTable-Funktion aus dem package ui_Table als Kopie. Diese Funktionen können als Inspiration für eigene Entwicklung dienen. <br />
{{Randnotiz|RNText='''uiTable-Funktionen'''<br />
* Es gibt drei Arten von uiTable-Funktionen, sie werden intern anhand der Rückgabewerte unterschieden<br />
* uiTable-Funktionen vom Typ 1: '''HTML''', ein Rückgabewert<br />
<syntaxhighlight lang="perl"><br />
return(<HTML-code>)<br />
</syntaxhighlight><br />
* uiTable-Funktionen vom Typ 2: '''Style''' (entspricht der '''STY'''-Funktion), zwei Rückgabewerte<br />
<syntaxhighlight lang="perl"><br />
return(<value>,<CSS-style>)<br />
</syntaxhighlight><br />
* uiTable-Funktionen vom Typ 3: '''Widget''' (entspricht der '''WID'''-Funktion), vier Rückgabewerte<br />
<syntaxhighlight lang="perl"><br />
return (<value>,<>,<FHEM-widget>,<set-command: "" or "set" or "set <Readingname>">)<br />
</syntaxhighlight><br />
* uiTable-Funktionen sind reine Perlfunktionen<br />
* uiTable-Funktionen sollten im eigenen Package definiert werden, sonst könnten bestehende Perlfunktionen im System überschrieben werden<br />
* uiTable-Funktionen können in Template-Dateien ausgelagert werden und über IMPORT-Befehl importiert werden, siehe Templates<br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_function DOIF ##<br />
attr di_uiTable_function uiTable {\<br />
package my_uiTable;; ## eigenes Package mit selbstdefinierten Funktionen\<br />
\<br />
## uiTable-Funktion vom Typ "HTML", Rückgabewert: (HTML-code)\<br />
\<br />
sub clock { ## Anzeige aktueller Uhrzeit mit Datum\<br />
## Voraussetzung: contrib/DOIF/doifclock.js muss ins www/pgm2-Verzeichnis kopiert werden\<br />
## Attribut setzen in der Webinstanz: attr <WEB-Instanz> JavaScripts pgm2/doifclock.js \<br />
my ($color,$size)=@_;;\<br />
$color="darkorange" if (!defined ($color));; ## $color ist optional, default Darkorange\<br />
$size="20" if (!defined ($size));; ## $size ist optional, default 20pt\<br />
return("<div class='doifclock'style='font-weight:bold;;font-size:".$size."pt;;color:".$color.";;'>error</div>")\<br />
}\<br />
\<br />
## uiTable-Funktion vom Typ Style, Rückgabewerte (Wert,CSS-style)\<br />
\<br />
sub red_green { ## Farbige Skalierung von Zahlen mit Hilfe der DOIF_hsv-Funktion: von 0 - rot bis 10 - grün\<br />
my ($value)=@_;;\<br />
return ($value." KW", ## Wert/Text\<br />
"font-weight:bold;;color:".::DOIF_hsv ($value,0,10,0,120,70,100) ## CSS-Style\<br />
);;\<br />
} \<br />
\<br />
## uiTable-Funktion vom Typ Widget, Rückgabewerte (Wert,Leer,FHEM-Widget,set-Befehl)\<br />
\<br />
sub slider { ## FHEM-Widget Slider, weitere FHEM-Widgets siehe: https://wiki.fhem.de/wiki/FHEMWEB/Widgets\<br />
my ($value,$set)=@_;;\<br />
$set="" if (!defined $set);;\<br />
return ($value, ## Zahlenwert\<br />
"", ## leer\<br />
"slider,0,0.5,100,1", ## FHEM-Widget\<br />
$set ## set-Befehl des FHEM-Widgets\<br />
) \<br />
}\<br />
\<br />
}\<br />
\<br />
## Tabellendefinition\<br />
\<br />
"Uhrzeit/Datum"\<br />
clock("yellow",30) ## obige Funktion clock\<br />
"Dimmer"\<br />
slider([Wohnzimmer:pct]) ## obige Funktion slider\<br />
"Leistung"\<br />
red_green([Leistung:state]) ## obige Funktion red_green<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-functions.png|mini|ohne]]<br />
<br />
== Package-Konzept, Auslagerung eigener Funktionen, der '''IMPORT'''-Befehl==<br />
uiTable arbeitet mit Packages. In einem Package sind definierte Funktionen gekapselt, sie kollidieren nicht mit bereits definierten Funktionen in FHEM.<br />
{{Randnotiz|RNText='''Package'''<br />
* das für die Definition der Tabelle gültige Package wird im Perlblock des uiTable-Attributes angegeben<br />
* interne uiTable-Funktionen befinden sich im Package '''ui_Table'''<br />
* ohne eine Angabe eines Package befindet man sich im Package '''main'''<br />
* Funktionen außerhalb des gültigen Package müssen mit <package-Name>::<Funktion> angegeben werden<br />
* externe uiTable-Funktionen können per IMPORT-Befehl importiert werden<br />
}} <br />
=== Tabellendefinition im Package main ===<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel1 DOIF ##<br />
attr beispiel1 uiTable ## keine Package-Definition im Perlblock\<br />
\<br />
## Tabellendefinition befindet sich im Package main\<br />
\<br />
## Funktionen aus dem main-Package können unmittelbar angegeben werden\<br />
FW_makeImage("scene_day")\<br />
\<br />
## Funktionen aus dem ui_Table-Package müssen mit vorangestelltem Package angegeben werden\<br />
ui_Table::temp ([Aussensensor:tempaerature])<br />
</syntaxhighlight><br />
<br />
=== Tabellendefinition im Package ui_Table ===<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel2 DOIF ##<br />
attr beispiel2 uiTable {\<br />
package ui_Table; ## Package-Angabe im Perlblock\<br />
}\<br />
\<br />
## Tabellendefinition befindet sich im Package ui_Table\<br />
\<br />
## Funktionen aus dem main-Package müssen mit vorangestelltem package angegeben werden, der Name main kann weggelassen werden\<br />
::FW_makeImage("scene_day")\<br />
\<br />
## Funktionen aus dem ui_Table-Package können direkt angegeben werden\<br />
temp ([Aussensensor:temperature])<br />
</syntaxhighlight><br />
<br />
=== Eigene uiTable-Funktionen im eigenen Package ===<br />
Diese Art der Definition bietet sich dann an, wenn man eine eigene uiTable-Funktion nur in einem DOIF nutzen möchte.<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel3 DOIF ##<br />
attr beispiel3 uiTable {\<br />
package $SELF;; ## Package-Name ist der Name des DOIF-Moduls, dadurch ist der Package-Name eindeutig\<br />
sub scene_day { ## eigene Funktion befindet sich im eigenen Package beispiel3\<br />
return (::FW_makeImage("scene_day"));;\<br />
}\<br />
}\<br />
## Tabellendefinition befindet sich im Package beispiel3\<br />
\<br />
## Funktionen aus dem main-Package müssen mit vorangestelltem Package angegeben werden (der Name main kann weggelassen werden)\<br />
::FW_makeImage("scene_day")\<br />
\<br />
## interne Funktionen aus dem ui_Table-Package müssen mit vorangestelltem Package ui_Table angegeben werden\<br />
ui_Table::temp ([Aussensensor:temperature])\<br />
\<br />
## eigene Funktionen können direkt angegeben werden\<br />
scene_day()<br />
</syntaxhighlight><br />
<br />
=== Eigene ausgelagerte uiTable-Funktionen ===<br />
Möchte man das ui_Table-Package um eigene Funktionen erweitern, die man in verschiedenen DOIFs nutzen möchte, so sollte man diese in eine eigene Datei auslagern, die man mit dem IMPORT-Befehl vor der Definition der Tabelle importieren kann.<br />
<br />
Ausgelagerte Funktion in einer eigenen Datei z. B. my_uiTable.tpl:<br />
<br />
<syntaxhighlight lang="perl"><br />
{ ## Inhalt der Datei my_uiTable.tpl<br />
package ui_Table; ## das aktuelle Package ist ui_Table<br />
sub scene_day { ## eigene Funktion wird zum Package ui_Table hinzugefügt <br />
return (::FW_makeImage("scene_day"));<br />
}<br />
## die Datei kann alle Funktionen beinhalten, die man in diversen DOIFs nutzen möchte<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel4 DOIF ##<br />
attr beispiel4 uiTable ##\<br />
\<br />
IMPORT ./contrib/DOIF/my_uiTable.tpl ## nach dem Import befindet man sich in Package ui_Table erweitert um eigene Funktionen\<br />
\<br />
## Tabellendefinition befindet sich im Package ui_Table\<br />
\<br />
## Funktionen aus dem main-Package müssen mit vorangestelltem Package angegeben werden (der Name main kann weggelassen werden)\<br />
::FW_makeImage("scene_day")\<br />
\<br />
## interne uiTable-Funktionen aus dem ui_Table-Package können direkt angegeben werden\<br />
temp ([Aussensensor:temperature])\<br />
\<br />
## eigene Funktionen können direkt angegeben werden, da man sich bereits im Package uiTable befinden\<br />
scene_day()\<br />
</syntaxhighlight><br />
<br />
== '''hsv'''-Funktion für Farbskalierungen==<br />
Mit Hilfe der hsv-Funktion können Texte, Werte oder Icons abhängig vom Wert eingefärbt werden. Es wird durch Vorgabe von Farbsättigung (saturation) und Helligkeit (lightness), linear ein Farbton für einen bestimmten Wert errechnet. Den Farbwert HUE (0 - 360) für den kleinsten sowie größten Wert kann man mit Hilfe eines Color-Pickers bestimmen. Der Rückgabewert ist ein Farbwert in der CSS-Notation.<br />
{{Randnotiz|RNText='''hsv-Funktion für Farbskalierungen'''<br />
<syntaxhighlight lang="perl"><br />
hsv ($value,$min_value,$max_value,$min_hue,$max_hue,$saturation,$lightness)<br />
$value # Wert, Reading<br />
$min_value # der kleinste Wert, dieser entspricht dem Farbwert $min_hue<br />
$max_value # der größte Wert, dieser entspricht dem Farbwert $max_hue<br />
$min_hue # Farbwert für den kleinsten Wert $min_value<br />
$max_hue # Farbwert für den größten Wert $max_value<br />
$saturation # Farbsättigung, default 100, optional<br />
$lightness # Farbhelligkeit, default 100, optional<br />
</syntaxhighlight><br />
Die Funktion befindet sich im ui_Table-Package<br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_hsv DOIF ##<br />
attr di_uiTable_hsv uiTable {\<br />
package ui_Table;;\<br />
## eigene uiTable-Funktionen vom Typ 1 mit einem Rückgabewert als HTML-Code\<br />
\<br />
sub bat_icon { ## färbt das Icon 'measure_battery_100' abhängig vom Wert mit Hilfe der Funktion hsv \<br />
my ($value)=@_;;\<br />
return(ICON("measure_battery_100\@".hsv($value,0,100,0,120,100,100)))\<br />
}\<br />
\<br />
sub bat_icon2 {## zusätzlich zum Farbwert wird ein entsprechendes Icon bestimmt\<br />
my($val)=@_;;\<br />
my $icon;;\<br />
if ($val==0) {\<br />
$icon="measure_battery_0";;\<br />
} elsif ($val<=25) {\<br />
$icon="measure_battery_25";;\<br />
} elsif ($val<=50) {\<br />
$icon="measure_battery_50";;\<br />
} elsif ($val<=75) {\<br />
$icon="measure_battery_75";;\<br />
} else {\<br />
$icon="measure_battery_100";;\<br />
}\<br />
\<br />
my $output=ICON("$icon\@".hsv ($val,0,100,0,120,90,100));;\<br />
return($output);;\<br />
}\<br />
}\<br />
\<br />
## Tabellendefinition\<br />
\<br />
## eingefärbtes Icon 0 % entspricht rot (HSV-Wert 0), 100 % entspricht grün (HSV-Wert 120) mit Direktangabe\<br />
1|ICON("measure_battery_100\@".hsv([bat:level],0,100,0,120,100,100))\<br />
\<br />
## gleiche Funktionalität mit Hilfe der oben definierten Funktion bat_icon \<br />
2|bat_icon([bat:level])\<br />
\<br />
## Icon mit Hilfe der oben definierten Funktion bat_icon2\<br />
3|bat_icon2([bat:level])\<br />
\<br />
## Beispiel für die Farbskaliereung von 0 bis 100 % mit der obigen Funktion bat_icon\<br />
4|bat_icon(0)|bat_icon(10)|bat_icon(20)|bat_icon(30)|bat_icon(40)|bat_icon(50)|bat_icon(60)|bat_icon(70)|bat_icon(80)|bat_icon(90)|bat_icon(100)\<br />
\<br />
## Beispiel für die Farbskaliereung von 0 bis 100 % mit der obigen Funktion bat_icon2\<br />
5|bat_icon2(0)|bat_icon2(10)|bat_icon2(20)|bat_icon2(30)|bat_icon2(40)|bat_icon2(50)|bat_icon2(60)|bat_icon2(70)|bat_icon2(80)|bat_icon2(90)|bat_icon2(100)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable DOIF hsv.png|mini|ohne]]<br />
<br />
== Eine for-Schleife mit Hilfe des '''FOR'''-Befehls ==<br />
Mit Hilfe des '''FOR'''-Befehls können über eine Schleife aus einer Liste mit Elementen mehrere Tabellenzellen definiert werden. Die Elementenliste (Array) kann über eine Funktion bestimmt werden. Auf diese Weise kann z. B. eine Tabelle für mehrere Geräte einfach definiert werden.<br />
{{Randnotiz|RNText='''FOR-Befehl'''<br />
* Der FOR-Befehl entspricht einer foreach-Schleife in Perl<br />
* Syntax: '''FOR (<Array>,<Zellendefinitionen>)'''<br>'''<Array>''' eine gültige Angabe eines Arrays oder eine Perlfunktion, die ein Array liefert<br>'''<Zellendefinitionen>''' Definition einer oder mehrerer Zellen, die Angabe $_ wird durch das jeweilige Element des Arrays ersetzt<br />
*'''nützliche Links'''<br />
**{{Link2CmdRef|Anker=DOIF_aggregation|Lang=de|Label=DOIF Aggregationsfunktionen mit Perlfunktion AggrDoIf}}<br />
**[[DevelopmentModuleAPI#devspec2array|devspec2array]]<br />
}}<br />
'''<big>Beispieldefinitionen</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Temperaturen aller Geräte, die mit 'T' beginnen und ein Reading 'temperature' haben, sollen in einer Tabelle visualisiert werden\<br />
FOR(::AggrDoIf('@','^T_','temperature'),"$_"|temp([$_:temperature:d2]))<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-temperature.png|200px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Anzeige des Batteriestatus aller Geräte, bei denen das Wort 'Fenster' vorkommt, die das Readings 'battery' haben\ <br />
FOR(::AggrDoIf('@','Fenster','battery'),"$_"|bat([$_:battery]))<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-battery.png|200px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Anzeige des Status aller Geräte im System vom Typ 'HMS'\<br />
FOR(::devspec2array("TYPE=HMS"),"$_"|[$_])<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-HMS.png|300px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Elemente einer kommagetrennten Liste sollen jeweils in einer Tabellenzelle in einer Tabellenzeile angezeigt werden\<br />
FOR(split(",","Mo,Di,Mi,Do,Fr,Sa,So"),ui_Table::style("$_","Darkorange")|)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-split.png|300px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Durch Leerzeichen getrennte Zeichenketten sollen jeweils in einer Tabellenzelle in einer Tabellenzeile angezeigt werden\<br />
FOR(qw/Montag Dienstag Mittwoch Donnerstag Freitag/,"$_"|)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-qw.png|300px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## das Templates TPL_raum, soll vier mal aufgerufen werden: TPL_raum(1), TPL_raum(2)...\<br />
## das Templates TPL_raum muss vorher definiert worden sein\<br />
FOR(1..4,TPL_raum($_))<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR TPL raum.png|600px|ohne]]<br />
<br />
== '''Anwendungsbeispiele''' ==<br />
=== '' Visualisierung und Steuerung von '''Rollläden''''' ===<br />
Im folgenden Beispiel werden Rollläden morgens hochgefahren, ebenso wird die Position aller Rollläden visualisiert. Durch Anklicken eines Icons wird der Rollladen auf die entsprechende Position bewegt. <br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* {{Link2CmdRef|Anker=DOIF_Zeitsteuerung_mit_Zeitintervallen|Lang=de|Label=Zeitsteuerung}}<br />
* uiTable-Funktion [[DOIF/uiTable Schnelleinstieg#Rollladen: Visualisierung und Steuerung mit Hilfe der Funktion shutter|shutter]]<br />
* uiTable-Funktion [[DOIF/uiTable Schnelleinstieg#Textformatierungen mit Hilfe der Funktion style|style]]<br />
* [[DOIF/uiTable Schnelleinstieg#uiTable-Templates|Templates]]<br />
}}<br />
<syntaxhighlight lang="perl"><br />
defmod DI_Rollladen DOIF (([Dunkelheit] eq "off" and [06:25-09:00|8]) or [09:00|7]) \<br />
((set R_W_S,R_W_W[1-3] on)) ## Hochfahren der Rollläden im Erdgeschoss morgens\<br />
DOELSEIF ([Dunkelheit] eq "on")<br />
attr DI_Rollladen cmdState oben|unten<br />
attr DI_Rollladen devStateIcon unten:status_night oben:scene_day<br />
attr DI_Rollladen icon fts_shutter_automatic<br />
attr DI_Rollladen uiTable {\<br />
package ui_Table;;\<br />
}\<br />
\<br />
## Template für ein Fenster\<br />
DEF TPL_shutter("$1"|shutter([$1:pct]))\<br />
\<br />
## Tabellendefinition\<br />
\<br />
style("Dachgeschoss","Darkorange")|""\<br />
TPL_shutter(R_Dachboden)\<br />
style("erstes Geschoss","Darkorange")|""\<br />
TPL_shutter(R_Bad)\<br />
TPL_shutter(R_Kinderzimmer1_O)\<br />
TPL_shutter(R_Kinderzimmer1_S)\<br />
TPL_shutter(R_Kinderzimmer2_S)\<br />
TPL_shutter(R_Kinderzimmer2_W1)\<br />
TPL_shutter(R_Kinderzimmer2_W2)\<br />
style("Erdgeschoss","Darkorange")|""\<br />
TPL_shutter(R_Kueche)\<br />
TPL_shutter(R_W_S)\<br />
TPL_shutter(R_W_W1)\<br />
TPL_shutter(R_W_W2)\<br />
TPL_shutter(R_W_W3)\<br />
style("Keller","Darkorange")|""\<br />
TPL_shutter(R_Keller)\<br />
</syntaxhighlight><br />
''Ergebnis des Anwendungsbeispiels in der Webansicht:''<br />
[[Datei:UiTable Rollladen.png|mini|ohne]]<br />
<br />
=== ''Anzahl der Tage bis zur '''Abfall-Entsorgung''''' ===<br />
Mit Hilfe des Kalender-Moduls werden die verbleibenden Tage bis zur Abfall-Entsorgung der jeweiligen Tonne berechnet und mit Hilfe von uiTable visualisiert. Wenn der Tag der Entsorgung bevorsteht, wird er farbig gekennzeichnet. Vorausgesetzt wird die Definition des Kalenders namens 'cal' mit Hilfe des Moduls [[Calendar]]. Dieser muss die Termine der Abfallentsorgung der Tonnen beinhalten. Im Beispiel wird nach Stichwörtern: "Altpapier", "Restmüll", "Bio", "Gelber" und "Grünschnitt" im Kalender gesucht. <br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* FHEM-Modul [[Calendar]]<br />
* ui_Table Funktion [[DOIF/uiTable Schnelleinstieg#Icon-Darstellung mit Text mit Hilfe der Funktion icon_label|icon_label]]<br />
}}<br />
<syntaxhighlight lang="perl"><br />
defmod Abfall DOIF subs {\<br />
## Die Funktion 'days' sucht nach dem Ereignis $event im Kalender und berechnet die Anzahl der verbleibenden Tage und legt sie im entsprechendem Reading $reading des DOIF-Moduls ab\<br />
sub days \<br />
{\<br />
my ($event,$reading)=@_;;\<br />
set_Reading($reading,fhem('get cal events timeFormat:"%j" filter:field(summary)=~"'.$event.'" limit:count=1,from=0 format:custom="$T1"')-::strftime ('%j', localtime()),1)\<br />
}\<br />
## Die Funktion 'update' bestimmt die verbleibenden Tage mit Hilfe der obigen Funktion 'days' für die jeweiligen Tonnen\<br />
sub update\<br />
{\<br />
days("Altpapier","altpapier");;days("Restmüll","restmuell");;days("Bio","bio");;days("Gelber","gelbe_tonne");;days("Grünschnitt","gruenschnitt");;\<br />
}\<br />
}\<br />
## Beim Start, um 02:00 Uhr und 08:00 Uhr wird zeitverzögert die obige Funktion 'update' aufgerufen\<br />
init {[02:00];;[08:00];;set_Exec("Timer",60,'update()');;\<br />
}<br />
attr Abfall uiTable {\<br />
package ui_Table;;\<br />
$TC{0..4}="align='center'";;\<br />
$SHOWNOSTATE=1;;\<br />
\<br />
## die Funktion 'ic' benutzt die Funktion 'icon_label' für die Darstellung des Icons, abhängig von der Anzahl der Tage wird die Anzahl in grün bzw. rot eingefärbt \<br />
sub ic\<br />
{\<br />
my ($icon,$days)=@_;;\<br />
icon_label($icon,$days,"white",$days > 1 ? "green":"red")\<br />
}\<br />
}\<br />
## Tabellendefinition, die einzelnen Tonnen werden mit Hilfe der obigen Funkton 'ic' dargestellt\<br />
\<br />
ic ("Abfalltonne-Recycling-Logo\@yellow",[$SELF:gelbe_tonne])|\<br />
ic ("Abfalltonne-Recycling-Logo\@blue",[$SELF:altpapier])|\<br />
ic ("Abfalltonne\@gray",[$SELF:restmuell])|\<br />
ic ("Abfalltonne-Recycling-Logo\@green",[$SELF:bio])|\<br />
ic ("Gartenabfall\@green",[$SELF:gruenschnitt])<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Anwendungsbeispiel Abfall.png|mini|ohne]]<br />
<br />
=== ''Visualisierung: '''offene Fenster''''' ===<br />
Alle offenen Fenster werden aufgelistet und mit entsprechendem Icon visualisiert.<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* Attribut {{Link2CmdRef|Anker=DOIF_DOIF_Readings|Lang=de|Label=DOIF_Readings}}<br />
* DOIF-{{Link2CmdRef|Anker=DOIF_aggregation|Lang=de|Label=Aggregationsfunktionen}}<br />
* uiTable-Funktion [[DOIF/uiTable Schnelleinstieg#Icon-Darstellung mit Hilfe der Funktion icon|icon]]<br />
}}<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_windows DOIF ## Visualisierung offener Fenster, Fenster-Devices enden mit "Fenster" im Namen<br />
attr di_uiTable_windows DOIF_Readings windows:[@as(<br>)"Fenster$":state:"open","keine"]<br />
attr di_uiTable_windows uiTable {package ui_Table;;}\<br />
icon([$SELF:windows],"fts_window_1w_open\@DarkOrange","fts_window_1w",".*","keine")|[$SELF:windows]<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable windows closed.png|mini|ohne]]<br />
[[Datei:UiTable windows open.png|mini|ohne]]<br />
<br />
=== ''Visualisierung: '''aktuelle Wetterlage''''' ===<br />
Regenrader animiert, aktuelle Temperatur und Feuchte vom Sensor, aktuelle Wetterlage sowie Wettervorhersage der nächsten Tage. Über entsprechende Weblinks werden Bilder aus dem WWW in der Tabelle visualisiert. Im Gegensatz zu lokalen Sensoren, muss für die Aktualisierung der WWW-Elemente in der jeweiligen Webinstanz (FHEMWEB) das refresh-Attribut gesetzt werden. <br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* DWD [https://www.dwd.de/DE/Home/home_node.html Homepage]<br />
* Regenradar [https://www.dwd.de/DE/wetter/wetterundklima_vorort/_node.html Radarfilm BRD]<br />
* aktuelles Wetter [https://www.dwd.de/DE/wetter/wetterundklima_vorort/nordrhein-westfalen/nrw_node.html NRW]<br />
* Wetteronline [https://www.wetteronline.de/wetter-widget eignes Widget]<br />
* <br />
}}<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_wetter DOIF ##<br />
attr di_uiTable_wetter uiTable {\<br />
package ui_Table;;\<br />
$TC{1}="align='center'";;\<br />
}\<br />
## das Attribut 'refresh' der Webinstanz für ein Wandtablet wurde auf 900 gesetzt, damit die Bilder alle 15 Minuten aktualisiert werden \<br />
## Tabellendefinition\<br />
\<br />
## Regenradar BRD\<br />
'<img src="https://www.dwd.de/DWD/wetter/radar/radfilm_brd_akt.gif" height="365px" width="365px">'|\<br />
\<br />
## Aktuelle Temperatur und Feuchtigkeit vom lokalen sensor\<br />
temp([Aussensensor:temperature],40),hum ([Aussensensor:humidity],30),\<br />
\<br />
## aktuelle Wetterlage NRW\<br />
"<img src ='https://www.dwd.de/DE/wetter/wetterundklima_vorort/nordrhein-westfalen/_functions/bildgalerie/wetter_aktuell.jpg?view=nasImage&nn=561200' height='255px' width='255px'>"|\<br />
\<br />
## Wettervorhersage\<br />
"<iframe marginheight='0' marginwidth='0' scrolling='no' width='300' height='365' name='FC3' style='border:1px solid;;border-color:#00537f;;' src='https://api.wetteronline.de/wetterwidget?gid=x0677&modeid=FC3&seourl=juelich&locationname=Jülich&lang=de'></iframe>"\<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable wetter.png|600px|links]]<br />
<br clear="all"><br />
<br />
=== ''Visualisierung: '''Wetterstation''''' ===<br />
Die vorgestellte Lösung funktioniert ohne Anmeldung beim Wetterdienst und ohne Nutzung von API.<br />
Über den Wetterdienst: https://www.wunderground.com/ werden sehr viele private Wifi-Wetterstationen eingebunden. Das kann man sich zunutze machen, indem man zunächst in seiner Umgebung nach Wetterstationen des Dienstes sucht - oft findet man im Umkreis von wenigen Kilometern schon einige Stationen, die rege Wetterdaten liefern. Danach definiert man über HTTPMOD seine Station und visualisiert diese anschließend.<br />
<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* Wunderground [https://wunderground.com/ Homepage]<br />
* svg-Funktion [https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card card]<br />
* svg-Funktionen [https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#icon_ring-Funktionen icon_ring]<br />
}}<br />
Definition einer Station in der Nachbarschaft. <StationsID> muss gegen die korrekte Stationsnummer ersetzt werden.<br />
<syntaxhighlight lang="perl"><br />
defmod Wetter HTTPMOD https://www.wunderground.com/dashboard/pws/<StationsID><br />
attr Wetter enableControlSet 1<br />
attr Wetter reading01Name Wind<br />
attr Wetter reading01Regex wu-unit .{109}>(\d+\.\d)<br />
attr Wetter reading02Name Windboeen<br />
attr Wetter reading02Regex wu-unit-speed .{109}>(\d+\.\d)<br />
attr Wetter reading03Name Windrichtung<br />
attr Wetter reading03Regex (\d+)deg\).{84}Wind-Marker<br />
attr Wetter reading04Name Regen<br />
attr Wetter reading04Regex wu-unit-rainRate .{109}>(\d+\.\d\d)<br />
attr Wetter reading05Name RegenGesamt<br />
attr Wetter reading05Regex wu-unit-rain .{109}>(\d+\.\d\d)<br />
attr Wetter reading06Name Temperatur<br />
attr Wetter reading06Regex wu-unit-temperature .{127}>(\d+.\d)<br />
attr Wetter reading07Name Feuchtigkeit<br />
attr Wetter reading07Regex wu-unit-humidity .{109}>(\d\d)<br />
attr Wetter reading08Name UV<br />
attr Wetter reading08Regex UV<.{268}>(\d)<br />
attr Wetter reading09Name Luftdruck<br />
attr Wetter reading09Regex PRESSURE<.{285}>(\d+.\d+)<br />
attr Wetter reading10Name TemperaturGefuehlt<br />
attr Wetter reading10Regex wu-unit is-degree-visible .{109}>(\d+.\d)<br />
attr Wetter reading11Name TaupunktTemp<br />
attr Wetter reading11Regex DEWPOINT.{306}>(\d+.\d)<br />
attr Wetter reading12Name Sonnenstrahlung<br />
attr Wetter reading12Regex Solar radiation<.{549}>(\d+.\d+)<br />
attr Wetter timeout 10<br />
attr Wetter userReadings WindKm {sprintf("%1.1f",ReadingsVal($name,"Wind",0)*1.60934)},\<br />
WindboeenKm {sprintf("%1.1f",ReadingsVal($name,"Windboeen",0)*1.60934)},\<br />
WindrichtungGrad {ReadingsVal($name,"Windrichtung",0)-180},\<br />
RegenMm {ReadingsVal($name,"Regen",0)*25.4},\<br />
RegenGesamtMm {ReadingsVal($name,"RegenGesamt",0)*25.4},\<br />
TemperaturC {sprintf("%1.1f",(ReadingsVal($name,"Temperatur",0)-32)*5/9)},\<br />
TaupunktTempC {sprintf("%1.1f",(ReadingsVal($name,"TaupunktTemp",0)-32)*5/9)},\<br />
LuftdruckHpa {sprintf("%d",ReadingsVal($name,"Luftdruck",0)*33.8639)},\<br />
TemperaturGefuehltC {sprintf("%1.1f",(ReadingsVal($name,"TemperaturGefuehlt",0)-32)*5/9)}<br />
</syntaxhighlight><br />
<br />
Nun erfolgt die Visualisierung der Daten.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_Wetter_ring DOIF ##<br />
attr di_Wetter_ring uiTable {package ui_Table;;}\<br />
\<br />
icon_temp_hum_ring("temp_outside",[Wetter:TemperaturC],[Wetter:Feuchtigkeit],undef,undef,150)|\<br />
icon_temp_ring ("temp_windchill",[Wetter:TemperaturGefuehltC],undef,undef,150) |\<br />
icon_temp_ring ("temperature_humidity",[Wetter:TaupunktTempC],undef,undef,150) |\<br />
icon_ring2([Wetter:WindKm] > 0 ? "wind".",1,0,0,".[Wetter:WindrichtungGrad]:"no_wind",[Wetter:WindKm],0,50,120,0,"km/h",150,undef,1,[Wetter:WindboeenKm],0,50,120,0,"km/h",undef,1) |\<br />
icon_ring2("weather_rain_gauge",[Wetter:RegenMm],0,10,180,270,"mm/h",150,undef,1,[Wetter:RegenGesamtMm],0,50,180,270,"mm",undef,1)|\<br />
icon_ring2("sani_solar",[Wetter:UV],0,10,100,30,"UV",150,undef,0,[Wetter:Sonnenstrahlung],0,1000,100,30,"Watt/m²",undef,0)|\<br />
icon_ring ("weather_barometric_pressure",[Wetter:LuftdruckHpa],980,1047,0,120,"hPa",0,150)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable ringwetter.png|600px|links]]<br />
<br clear="all"><br />
<br />
Hier ein Beispiel der Visualisierung mit Verlauf der letzten drei Tage mit Hilfe der svg-Funktion '''card''':<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_Wetter DOIF ##<br />
attr di_Wetter icon weather_wind<br />
attr di_Wetter uiTable {package ui_Table;;}\<br />
## card ($collect,$header,$icon,$min,$max,$minColor,$maxColor,$unit,$func,$decfont,$size,$model,$lightness)\<br />
\<br />
card([Wetter:TemperaturC:col3d],"Außentemperatur","temp_outside",-10,60,undef,undef,"°C",\&temp_hue)|\<br />
card([Wetter:TemperaturGefuehltC:col3d],"gefühlte Temperatur","temp_windchill",-10,60,undef,undef,"°C",\&temp_hue)|\<br />
card([Wetter:TaupunktTempC:col3d],"Taupunkttemperatur","temperature_humidity",-10,60,undef,undef,"°C",\&temp_hue)|\<br />
card([Wetter:Feuchtigkeit:col3d],"Außenfeuchtigkeit","temperature_humidity",0,100,undef,undef,"%",\&hum_hue)|\<br />
card([Wetter:WindKm:col3d],"Wind",[Wetter:WindKm] > 0 ? "wind".",1,0,0,".[Wetter:WindrichtungGrad]:"no_wind",0,30,90,30,"km/h",undef,1)\<br />
card([Wetter:WindboeenKm:col3d],"Windböen","weather_wind",0,30,90,30,"km/h",undef,1)|\<br />
card([Wetter:RegenMm:col3d],"Regen","weather_rain_gauge",0,10,180,270,"mm/h")|\<br />
card([Wetter:RegenGesamtMm:col3d],"Regengesamt","weather_rain_gauge",0,50,180,270,"mm")|\<br />
##card([Wetter:UV:col3d],"UV-Strahlung","sani_solar",0,7,100,30,"UV",undef,0)|\<br />
card([Wetter:Sonnenstrahlung:col3d],"Sonnenstrahlung","sani_solar",0,1000,30,90,"Watt/m²",undef,0)|\<br />
card([Wetter:LuftdruckHpa:col3d],"Luftdruck","weather_barometric_pressure",980,1047,30,90,"hPa",undef,0)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable svgwetter.png|600px|links]]<br />
<br clear="all"><br />
<br />
Ohne Angabe der Überschrift (undef für $header setzen) lässt sich eine kompaktere Darstellung erzielen:<br />
<br />
[[Datei:UiTable svgwetteroh.png|600px|links]]<br />
<br />
<br clear="all"><br />
<br />
=== ''Visualisierung: '''aktueller Spritpreis''''' ===<br />
Der aktuelle Spritpreis einer Tankstelle wird ermittelt und mit seinem zeitlichen Verlauf visualisiert.<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#ring-Funktionen|ring]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card|card]]<br />
* Tankstelle bestimmen [https://www.clever-tanken.de/ Clever tanken]<br />
* Modul [[HTTPMOD]]<br />
}}<br />
<br />
Zunächst wird ein HTTPMOD-Modul für den aktuellen Spritpreis definiert, dabei ist <Stations-ID> durch die ID der Tankstelle zu ersetzen.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod Tankstelle HTTPMOD http://www.clever-tanken.de/tankstelle_details/<Stations-ID> 300<br />
attr Tankstelle devStateIcon {ui_Table::ring(ReadingsVal("$name","Diesel",0),1.00,1.40,120,0,"Diesel",90,undef,2)." ".ui_Table::ring(ReadingsVal("$name","SuperE5",0),1.10,1.60,120,0,"E5",90,undef,2)}<br />
attr Tankstelle enableControlSet 1<br />
attr Tankstelle event-on-change-reading .*<br />
attr Tankstelle group Spritpreise<br />
attr Tankstelle reading01Name Diesel<br />
attr Tankstelle reading01Regex "current-price-1">(\d.\d{2})<br />
attr Tankstelle reading02Name SuperE5<br />
attr Tankstelle reading02Regex "current-price-2">(\d.\d{2})<br />
attr Tankstelle room Spritpreise<br />
attr Tankstelle timeout 10<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Di uiTable Tankstelle.png|ohne|mini]]<br />
<br />
Visualisierung der Preisentwicklung der letzten 24 Stunden: <br />
<br />
<syntaxhighlight lang="perl"><br />
defmod sprit DOIF ##<br />
attr sprit uiTable {package ui_Table;;}\<br />
card([Tankstelle:Diesel:col24],"Diesel","fuel","1.00","1.40",120,0,"Diesel €",undef,"2",",,1")\<br />
card([Tankstelle:SuperE5:col24],"Super E5","fuel","1.10","1.60",120,0,"Super €",undef,"2",",,1")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Di uiTable sprit.png|ohne|mini]]<br />
<br />
=== ''Visualisierung: '''aktuelle Corona-7-Tage-Inzidenz''''' ===<br />
Die aktuellen Inzidenzwerte werden vom RKI ausgelesen und deren Verlauf visualisiert.<br />
<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#ring-Funktionen|ring]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card|card]]<br />
* Modul [[JsonMod]]<br />
}}<br />
<br />
Zunächst wird ein JsonMod Device für das Auslesen der Inzidenzzahlen definiert. Die gewünschten Regionen müssen für eigene Bedürfnisse angepasst werden.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod RKI7 JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=last_update,cases7_per_100k,BEZ,BEM,GEN,BL,county&returnGeometry=false&outSR=4326&f=json<br />
attr RKI7 readingList multi(jsonPath("\$.features[?(\@.attributes.GEN in ['Städteregion Aachen', 'Düren', 'Heinsberg'])]"), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));;<br />
</syntaxhighlight><br />
<br />
Visualisierung der Inzidenzzahlen der letzten sieben Tage: <br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_corona DOIF ##<br />
attr di_corona uiTable {package ui_Table}\<br />
card([RKI7:Duren:col1w],"Düren","coronavirus",0,200,120,0,"Fälle")|\<br />
card([RKI7:Heinsberg:col1w],"Heinsberg","coronavirus",0,200,120,0,"Fälle")|\<br />
card([RKI7:Stadteregion_Aachen:col1w],"Aachen","coronavirus",0,200,120,0,"Fälle")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:uiTable_Inzidenz.png|600px|links]]<br />
<br />
<br clear="all"><br />
<br />
=== '' Visualisierung und Steuerung: '''Heiztherme''''' ===<br />
Im folgenden Beispiel wurde eine Heiztherme über einen ebus-Adapter in FHEM eingebunden. Die Heizungsdaten werden über MQTT ausgelesen und anschließend visualisiert. Die vorgestellten Visualisierungsbeispiele können ebenso im funktionslosen DOIF mit Hilfe des uiTable-Attriutes auf bereits existierende Readings des eigenen Systems angewendet werden. <br />
<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#icon_ring-Funktionen|icon_ring]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card|card]]<br />
* Commandref [https://fhem.de/commandref_DE.html#DOIF_Perl_Modus DOIF Perl-Modus]<br />
* ebus-Adapter [https://ebusd.de/ ebusd]<br />
* ebus-Wiki [[EBUS|ebus]]<br />
}}<br />
<br />
Definition eines MQTT2-Devices für die Kommunikation mit der Therme über einen ebus-Adapter.<br />
<br />
Im diesem Fall wurde eine Vaillanttherme eingebunden, die meisten Readings wurden automatisch vom MQTT2-Server angelegt. Die Anbindung ist gerätespezifisch und unterscheidet sich je nach Gerättyp.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod vaillant MQTT2_DEVICE ebusd_bai<br />
attr vaillant IODev MQTT2_FHEM_Server<br />
attr vaillant devStateStyle style="text-align:left"<br />
attr vaillant event-on-change-reading .*<br />
attr vaillant group Ebus<br />
attr vaillant icon sani_boiler_temp<br />
attr vaillant jsonMap Status01_0_value:Vorlauf Status01_0_name:0\<br />
Status01_1_value:Ruecklauf Status01_1_name:0\<br />
Status01_2_value:Aussentemp Status01_2_name:0\<br />
Status01_3_value:Warmwasser Status01_3_name:0\<br />
Status01_4_value:WWSpeicher Status01_4_name:0\<br />
Status01_5_value:Pumpenstatus Status01_5_name:0\<br />
Flame_0_value:Flame Flame_0_name:0\<br />
Storageloadpump_percent0_value:Storageloadpump\<br />
FlowTempDesired_temp_value:VorlaufSoll\<br />
Hc1HeatCurve_0_value:HeizKennlinie Hc1HeatCurve_0_name:0\<br />
HolidayEndPeriod_hto_value:FerienEnde\<br />
HolidayStartPeriod_hfrom_value:FerienBeginn\<br />
PumpPower_0_value:PumpenLeistung PumpPower_0_name:0\<br />
PrimaryCircuitFlowrate_uin100_value:Umlaufmenge\<br />
z1DayTemp_tempv_value:TagSolltemp\<br />
z1NightTemp_tempv_value:NachtSolltemp\<br />
FanSpeed_0_value:LuefterDrehzahl FanSpeed_0_name:0\<br />
WaterPressure_pressv_value:Wasserdruck\<br />
z1OpMode_opmode_value:Heizmodus<br />
attr vaillant model eBus_bai_jsonmap<br />
attr vaillant readingList ebusd/bai/PumpHours:.* { json2nameValue($EVENT, 'PumpHours_', $JSONMAP) }\<br />
ebusd/bai/WPPostrunTime:.* { json2nameValue($EVENT, 'WPPostrunTime_', $JSONMAP) }\<br />
ebusd/bai/PowerValue:.* { json2nameValue($EVENT, 'PowerValue_', $JSONMAP) }\<br />
ebusd/bai/StorageExitTemp:.* { json2nameValue($EVENT, 'StorageExitTemp_', $JSONMAP) }\<br />
ebusd/global/version:.* version\<br />
ebusd/global/running:.* running\<br />
ebusd/scan\x5c\x2e08/:.* { json2nameValue($EVENT, 'scan.08_', $JSONMAP) }\<br />
ebusd/scan\x5c\x2e08/id:.* { json2nameValue($EVENT, 'id_', $JSONMAP) }\<br />
ebusd/global/uptime:.* uptime\<br />
ebusd/global/signal:.* signal\<br />
ebusd/scan\x5c\x2e15/:.* { json2nameValue($EVENT, 'scan.15_', $JSONMAP) }\<br />
ebusd/scan\x5c\x2e15/id:.* { json2nameValue($EVENT, 'id_', $JSONMAP) }\<br />
ebusd/bai/FanSpeed:.* { json2nameValue($EVENT, 'FanSpeed_', $JSONMAP) }\<br />
ebusd/bai/PumpPower:.* { json2nameValue($EVENT, 'PumpPower_', $JSONMAP) }\<br />
ebusd/broadcast/vdatetime:.* { json2nameValue($EVENT, 'vdatetime_', $JSONMAP) }\<br />
ebusd/broadcast/outsidetemp:.* { json2nameValue($EVENT, 'outsidetemp_', $JSONMAP) }\<br />
ebusd/bai/DateTime:.* { json2nameValue($EVENT, 'DateTime_', $JSONMAP) }\<br />
ebusd/global/updatecheck:.* updatecheck\<br />
ebusd/bai/DCFTimeDate:.* { json2nameValue($EVENT, 'DCFTimeDate_', $JSONMAP) }\<br />
ebusd/bai/PumpPowerDesired:.* { json2nameValue($EVENT, 'PumpPowerDesired_', $JSONMAP) }\<br />
ebusd/bai/HwcImpellorSwitch:.* { json2nameValue($EVENT, 'HwcImpellorSwitch_', $JSONMAP) }\<br />
ebusd/bai/ReturnTemp:.* { json2nameValue($EVENT, 'ReturnTemp_', $JSONMAP) }\<br />
ebusd/700/HwcStorageTempBottom:.* { json2nameValue($EVENT, 'HwcStorageTempBottom_', $JSONMAP) }\<br />
ebusd/700/HwcTempDesired:.* { json2nameValue($EVENT, 'HwcTempDesired_', $JSONMAP) }\<br />
ebusd/bai/FanPWMSum:.* { json2nameValue($EVENT, 'FanPWMSum_', $JSONMAP) }\<br />
ebusd/bai/HcHours:.* { json2nameValue($EVENT, 'HcHours_', $JSONMAP) }\<br />
ebusd/bai/HoursTillService:.* { json2nameValue($EVENT, 'HoursTillService_', $JSONMAP) }\<br />
ebusd/bai/PumpHwcFlowNumber:.* { json2nameValue($EVENT, 'PumpHwcFlowNumber_', $JSONMAP) }\<br />
ebusd/bai/WP:.* { json2nameValue($EVENT, 'WP_', $JSONMAP) }\<br />
ebusd/700/WaterPressure:.* { json2nameValue($EVENT, 'WaterPressure_', $JSONMAP) }\<br />
ebusd/bai/PrimaryCircuitFlowrate:.* { json2nameValue($EVENT, 'PrimaryCircuitFlowrate_', $JSONMAP) }\<br />
ebusd/bai/Flame:.* { json2nameValue($EVENT, 'Flame_', $JSONMAP) }\<br />
ebusd/bai/Storageloadpump:.* { json2nameValue($EVENT, 'Storageloadpump_', $JSONMAP) }\<br />
ebusd/bai/Status01:.* { json2nameValue($EVENT, 'Status01_', $JSONMAP) }\<br />
ebusd/bai/FlowTempDesired:.* { json2nameValue($EVENT, 'FlowTempDesired_', $JSONMAP) }\<br />
ebusd/700/FrostOverRideTime:.* { json2nameValue($EVENT, 'FrostOverRideTime_', $JSONMAP) }\<br />
ebusd/700/Hc1ActualFlowTempDesired:.* { json2nameValue($EVENT, 'Hc1ActualFlowTempDesired_', $JSONMAP) }\<br />
ebusd/700/Hc1AutoOffMode:.* { json2nameValue($EVENT, 'Hc1AutoOffMode_', $JSONMAP) }\<br />
ebusd/700/Hc1CircuitType:.* { json2nameValue($EVENT, 'Hc1CircuitType_', $JSONMAP) }\<br />
ebusd/700/Hc1HeatCurve:.* { json2nameValue($EVENT, 'Hc1HeatCurve_', $JSONMAP) }\<br />
ebusd/700/HcStorageTempBottom:.* { json2nameValue($EVENT, 'HcStorageTempBottom_', $JSONMAP) }\<br />
ebusd/700/HcStorageTempTop:.* { json2nameValue($EVENT, 'HcStorageTempTop_', $JSONMAP) }\<br />
ebusd/700/HolidayTemp:.* { json2nameValue($EVENT, 'HolidayTemp_', $JSONMAP) }\<br />
ebusd/700/OpMode:.* { json2nameValue($EVENT, 'OpMode_', $JSONMAP) }\<br />
ebusd/700/z1RoomTemp:.* { json2nameValue($EVENT, 'z1RoomTemp_', $JSONMAP) }\<br />
ebusd/700/z1SFMode:.* { json2nameValue($EVENT, 'z1SFMode_', $JSONMAP) }\<br />
ebusd/700/z1OpMode:.* { json2nameValue($EVENT, 'z1OpMode_', $JSONMAP) }\<br />
ebusd/700/Time:.* { json2nameValue($EVENT, 'Time_', $JSONMAP) }\<br />
ebusd/bai/EbusVoltage:.* { json2nameValue($EVENT, 'EbusVoltage_', $JSONMAP) }\<br />
ebusd/bai/extWP:.* { json2nameValue($EVENT, 'extWP_', $JSONMAP) }\<br />
ebusd/bai/FanStarts:.* { json2nameValue($EVENT, 'FanStarts_', $JSONMAP) }\<br />
ebusd/700/z1NightTemp:.* { json2nameValue($EVENT, 'z1NightTemp_', $JSONMAP) }\<br />
ebusd/700/z1DayTemp:.* { json2nameValue($EVENT, 'z1DayTemp_', $JSONMAP) }\<br />
ebusd/700/HolidayStartPeriod:.* { json2nameValue($EVENT, 'HolidayStartPeriod_', $JSONMAP) }\<br />
ebusd/700/HolidayEndPeriod:.* { json2nameValue($EVENT, 'HolidayEndPeriod_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Monday:.* { json2nameValue($EVENT, 'z1Timer.Monday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Tuesday:.* { json2nameValue($EVENT, 'z1Timer.Tuesday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Wednesday:.* { json2nameValue($EVENT, 'z1Timer.Wednesday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Thursday:.* { json2nameValue($EVENT, 'z1Timer.Thursday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Friday:.* { json2nameValue($EVENT, 'z1Timer.Friday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Sunday:.* { json2nameValue($EVENT, 'z1Timer.Sunday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Saturday:.* { json2nameValue($EVENT, 'z1Timer.Saturday_', $JSONMAP) }\<br />
ebusd/bai/PrEnergyCountHc1:.* { json2nameValue($EVENT, 'PrEnergyCountHc1_', $JSONMAP) }\<br />
ebusd/bai/PrEnergyCountHwc1:.* { json2nameValue($EVENT, 'PrEnergyCountHwc1_', $JSONMAP) }\<br />
ebusd/bai/PrEnergySumHc1:.* { json2nameValue($EVENT, 'PrEnergySumHc1_', $JSONMAP) }\<br />
ebusd/bai/PrEnergySumHwc1:.* { json2nameValue($EVENT, 'PrEnergySumHwc1_', $JSONMAP) }\<br />
ebusd/bai/FanHours:.* { json2nameValue($EVENT, 'FanHours_', $JSONMAP) }\<br />
ebusd/bai/HcHours:.* { json2nameValue($EVENT, 'HcHours_', $JSONMAP) }\<br />
ebusd/bai/HwcHours:.* { json2nameValue($EVENT, 'HwcHours_', $JSONMAP) }\<br />
ebusd/bai/HcStarts:.* { json2nameValue($EVENT, 'HcStarts_', $JSONMAP) }\<br />
ebusd/bai/HwcStarts:.* { json2nameValue($EVENT, 'HwcStarts_', $JSONMAP) }<br />
attr vaillant setList HeizKennlinie:selectnumbers,0,.1,2,1,lin ebusd/700/Hc1HeatCurve/set $EVTPART1\<br />
TagSolltemp:selectnumbers,15,1,25,1,lin ebusd/700/z1DayTemp/set $EVTPART1\<br />
NachtSolltemp:selectnumbers,15,1,25,1,lin ebusd/700/z1NightTemp/set $EVTPART1<br />
</syntaxhighlight><br />
<br />
Definition eines DOIF-Devices zur Steuerung der Therme und Visualisierung der Daten. Es werden Readings und Befehle genutzt, die durch den MQTT2-Server der obigen Definition zur Verfügung gestellt werden. Einzelne Heizungswerte werden in bestimmten Intervallen über den publish-Befehl ausgelesen. Die Temperaturen der Zirkulation, des Vorlaufs und des Rücklaufs werden außerhalb der Therme mit 1-wire-Temperatursensoren über WLAN-ESP-Easy ausgelesen. Die Definition des Layouts über das Attribut uiTable ist unabhängig vom Auslesen der Werte, sie bezieht sich lediglich auf vorhandene Readings, die visualisiert werden sollen. Das Layout kann ebenso auf Readings aus anderen Devices der eigenen FHEM-Umgebung anpasst werden.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_vaillant DOIF ##{[+00:01];;foreach (qw(FanSpeed Flame PumpPower Storageloadpump PrimaryCircuitFlowrate FlowTempDesired PumpHours HcHours HcPumpStarts)) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}}\<br />
\<br />
{[+[1]:01];;foreach (qw(PrEnergySumHc1 PrEnergySumHwc1 HcHours HwcHours z1OpMode WaterPressure z1NightTemp z1DayTemp Hc1HeatCurve HwcLockTime HolidayStartPeriod HolidayEndPeriod)) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}\<br />
}\<br />
\<br />
{[+00:00:30];;foreach (qw(Flame PrimaryCircuitFlowrate)) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}}\<br />
\<br />
{[00:01];;foreach (qw(FanHours HcStarts HwcStarts )) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}\<br />
set_Reading("gesamt_hc",int([?vaillant:PrEnergySumHc1_0_value]/10000)/10,0);;\<br />
set_Reading("gesamt_hwc",int([?vaillant:PrEnergySumHwc1_0_value]/10000)/10,0);;\<br />
set_Reading("diff_hc",0,1);;\<br />
set_Reading("diff_hwc",0,1);;\<br />
set_Reading("diff_h",0,1)\<br />
}\<br />
\<br />
{if ([00:05|WE]) {fhem_set("MQTT2_FHEM_Server publish ebusd/700/BankHolidayStartPeriod/set $mday.$month.$year");;fhem_set("MQTT2_FHEM_Server publish ebusd/700/BankHolidayEndPeriod/set $mday.$month.$year")}}\<br />
\<br />
Timer {\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Monday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Tuesday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Wednesday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Thursday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Friday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Sunday/set 05:00;;10:00;;12:00;;22:30;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Saturday/set 05:00;;10:00;;12:00;;22:30;;-:-;;-:-"\<br />
}\<br />
\<br />
diff {\<br />
set_Reading("diff_hc",int(([vaillant:PrEnergySumHc1_0_value]/100000-get_Reading("gesamt_hc",0))*10)/10,1);;\<br />
set_Reading("diff_hwc",int(([vaillant:PrEnergySumHwc1_0_value]/100000-get_Reading("gesamt_hwc",0))*10)/10,1);;\<br />
set_Reading("diff_h",get_Reading("diff_hc")+get_Reading("diff_hwc"),1);;\<br />
}\<br />
\<br />
<br />
attr di_vaillant event-on-change-reading .*<br />
attr di_vaillant room Ebus<br />
attr di_vaillant uiTable {\<br />
package ui_Table;;\<br />
$TABLE='text-align:center;;';;\<br />
$SHOWNODEVICELINE = "test9|Damian";;\<br />
}\<br />
icon_temp_ring("temp_outside",[vaillant:Aussentemp],-15,40,130)|\<br />
icon_temp_mring(([vaillant:Flame] eq "off"?"sani_boiler_temp\@white":"sani_boiler_temp\@Darkorange"),[vaillant:Vorlauf],15,70,130)|\<br />
icon_temp_mring(([vaillant:Pumpenstatus] eq "4" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),[vaillant:WWSpeicher],15,70,130)|\<br />
icon_uring("0,0,1","weather_barometric_pressure",[vaillant:Wasserdruck],0,3,undef,undef,"bar",1,130,[(0.8,0,1,60,1.5,120,1.7,60,3,0)],"50,35")|\<br />
icon_ring("sani_floor_heating_neutral",[vaillant:HcHours_hoursum2_value],0,10000,120,0,"h",0,130)|\<br />
icon_ring("sani_water_tap",[vaillant:HwcHours_hoursum2_value],0,2000,120,0,"h",0,130)|\<br />
\<br />
icon_ring("time_graph",[vaillant:HeizKennlinie],0.4,1,120,0,"HK",1,130)|\<br />
icon_temp_mring("scene_day\@yellow",[vaillant:TagSolltemp],undef,undef,130)|\<br />
icon_temp_mring("scene_night\@#3464eb",[vaillant:NachtSolltemp],undef,undef,130)\<br />
""|""|""|""|""|""|widget([vaillant:HeizKennlinie],"selectnumbers,0.4,.1,1,1,lin","set")|widget([vaillant:TagSolltemp],"selectnumbers,15,1,25,1,lin","set")|widget([vaillant:NachtSolltemp],"selectnumbers,15,1,25,1,lin","set")<\<br />
\<br />
card([vaillant:Aussentemp:col],"Außentemperatur","temp_outside",-15,35,undef,undef,"°C",\&temp_hue)|\<br />
card([vaillant:WWSpeicher:col],"WW-Speicher",([vaillant:Pumpenstatus] eq "4" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([ESPEasy_ESP_Temp_Vorlauf:Temperature:col],"Vorlauf",([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([$SELF:diff_hc:col],"Energie Heizung","sani_floor_heating_neutral",0,100,120,0,"kWh",undef,1)\<br />
card([vaillant:Umlaufmenge:col],"Umlaufmenge","sani_pump",0,20,120,0,"l/min")|\<br />
card([ESPEasy_ESP_Temp_Zirkulation:Temperature:col],"Zirkulation",([Zirk] eq "off"?"sani_pump\@white":"sani_pump\@Darkorange"),15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature:col],"Rücklauf","sani_floor_heating_neutral\@wite",15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([$SELF:diff_hwc:col],"Energie Warmwasser","sani_water_tap",0,15,120,0,"kWh",undef,1)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Di uiTable Heizung.png|600px|links]]<br />
<br />
<br clear="all"><br />
<br />
=== ''Visualisierung: '''Anwesenheitsstatus''''' ===<br />
Die aktuelle Anwesenheit von Heimbewohnern wird visualisiert.<br><br><br />
Zunächst wird mit Hilfe des Moduls [[FRITZBOX]] ein Device namens ''FritzBox'' erstellt. Dort werden die eingebuchten Smartphones der Bewohner mit Ihren MAC-Adressen in Readings abgelegt. Die folgende Definition wertet aus, ob die angegebenen MAC-Adressen als Readings vorhanden sind und erstellt für jeden Bewohner ein Reading mit den Zuständen on/off. Diese Readings werden dann über das Attribut uiTable visualisiert. Die anwesenden Personen werden farblich markiert. Die Namen der Personen sowie die MAC-Adressen sind fiktiv und müssen den eigenen Angaben entsprechend angepasst werden.<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* [[FRITZBOX|FritzBox-Modul]]<br />
* ui_Table Funktion [[DOIF/uiTable Schnelleinstieg#Icon-Darstellung mit Text mit Hilfe der Funktion icon_label|icon_label]]<br />
*[[DOIF/uiTable Schnelleinstieg#uiTable-Templates|uiTable-Templates]]<br />
}}<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod myHome DOIF {\<br />
set_Reading_Begin;;\<br />
set_Reading_Update("Ernie",[FritzBox:mac_12_34_E0_00_CD_E4] ? "on":"off");;\<br />
set_Reading_Update("Bert", [FritzBox:mac_02_08_02_07_30_E3] ? "on":"off");;\<br />
set_Reading_Update("Grobi", [FritzBox:mac_00_08_01_0B_00_E7] ? "on":"off");; \<br />
set_Reading_Update("Kermit", [FritzBox:mac_01_30_A9_72_02_E3] ? "on":"off");; \<br />
set_Reading_End(1);;\<br />
}<br />
attr myHome checkReadingEvent 0<br />
attr myHome uiTable {\<br />
package ui_Table;;\<br />
$SHOWNOSTATE=1;;\<br />
$TC{0..4}="align='center'";;\<br />
}\<br />
## Template-Definition für die Visualisierung eines Bewohners mit Hilfe des Icons fa__508\<br />
DEF TPL_person (icon_label([$SELF:$1] eq "on" ? "fa__508\@DarkOrange":"fa__508","$1","#e67e00","white",-10))\<br />
\<br />
## Darstellung der Bewohner mit Hilfe des obigen Templates\<br />
TPL_person(Ernie)|TPL_person(Bert)|TPL_person(Grobi)|TPL_person(Kermit)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable myHome.png|ohne|mini]]<br />
<br />
=== Weitere Anwendungsbeispiele zur Automatisierung ===<br />
* siehe [[DOIF/Automatisierung]]<br />
<br />
== Weiterführende Links ==<br />
* Weitere Beispiele für Fortgeschrittene, siehe "[[DOIF/uiTable|uiTable mit FHEM-Widgets und Styles]]"<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Code Snippets]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=DOIF/uiTable_Schnelleinstieg&diff=37246DOIF/uiTable Schnelleinstieg2022-02-19T22:30:08Z<p>Maista: Eine Klammer fehlte</p>
<hr />
<div>[[Datei:UiTable state screen.png|700px|rechts|Webansicht bestehend aus mehreren DOIF/uiTable-Definitionen]]<br />
An dieser Stelle wird das DOIF-Web-Interface erklärt, welches über das DOIF-Attribut '''uiTable''' realisiert wurde. <br />
<br />
Abhängig von der Art der Funktion können in einer tabellarischen Darstellung FHEM-Geräte visualisiert und über die Web-Oberfläche bedient werden. Eventbasierte Änderungen visualisierter Readings werden unmittelbar in der Web-Ansicht aktualisiert. Eine erstellte Tabelle erscheint unterhalb der Statuszeile eines DOIF-Devices. Das uiTable-Attribut kann in bereits bestehenden DOIFs oder in funktionslosen DOIFs, wie in den unteren Beispielen, als reines WEB-Interface erstellt werden. In der Abbildung rechts ist ein Statusbildschirm aus vier Spalten mit mehreren DOIF/uiTable-Definitionen aufgebaut worden.<br><br />
<br />
Die Darstellungsmöglichkeiten werden anhand von Beispielen insb. mit Hilfe bereits im DOIF-Modul vordefinierter uiTable-Funktionen aufgezeigt. Diese Perlfunktionen sind in einem eigenen Package namens 'ui_Table' definiert worden. Mit Hilfe dieser Funktionen lassen sich recht einfach, ohne tiefere HTML/CSS-Kenntnisse, eigene Übersichten definieren. Im Anschluss werden typische '''[[DOIF/uiTable Schnelleinstieg#Anwendungsbeispiele|Anwendungsbeispiele]]''' aufgezeigt.<br />
<br />
Die folgenden Beispieldefinitionen arbeiten mit konkreten Geräten und Readings, sie können als RAW-Definition ins eigene System übernommen werden, dazu müssen die Gerätenamen, Readings, ggf. auch Icons den existierenden Namen des eigenen Systems angepasst werden. Zum Ausprobieren der Beispiele können statt echter Geräte auch Dummys benutzt werden. <br />
<br />
Es gibt im Perl-Modus des DOIF-Moduls ebenfalls das Attribut '''uiState''', welches die gleiche Syntax wie uiTable nutzt. Die definierte Tabelle erscheint im Gegensatz zu uiTable jedoch im Status des DOIF-Devices. uiState und uiTable können gleichzeitig in einem DOIF-Device definiert werden. <br />
<br />
== Aufbau des uiTable-Attributs ==<br />
Im uiTable-Attribut wird in erster Linie die zu visualisierende Tabelle definiert. Optional können zuvor ein Perlblock sowie Templates definiert werden.<br />
{{Randnotiz|RNText='''Aufbau des Attributs'''<br />
* das uiTable-Attribut besteht aus drei Bereichen:<br />
* [[DOIF/uiTable Schnelleinstieg#Der Perlblock|Perlblock]]<br />
* [[DOIF/uiTable Schnelleinstieg#uiTable-Templates|Templates-Definitionen]] <br />
* [[DOIF/uiTable Schnelleinstieg#Die Tabellendefinition|Tabellendefinition]]<br />
}}<br />
'''Aufbaustruktur''' <br />
<syntaxhighlight lang="perl"><br />
{<br />
<Perlblock, optional><br />
}<br />
<br />
<Templates-Definitionen, optional><br />
<br />
<Tabellendefinition><br />
</syntaxhighlight><br />
=== Der Perlblock ===<br />
Der Perlblock dient dazu, das Layout der Tabelle zu beeinflussen sowie eigene uiTable-Funktionen zu definieren. Hier wird insb. das Package definiert, welches für die Tabellendefinition gilt. Ebenfalls können CSS-Variablen sowie Steuerungsattribute gesetzt werden. Der Perlblock beginnt und endet mit einer geschweiften Klammer.<br />
<br />
==== CSS-Variablen und Steuerungsattribute ====<br />
Mit Hilfe von CSS-Variablen kann das Layout der Tabelle beeinflusst werden. Die Steuerungsattribute beeinflussen die Statuszeile sowie die Detailansicht des DOIF-Moduls.<br />
{{Randnotiz|RNText='''CSS-Variablen und Steuerungsattribute'''<br />
*Das Layout der gesamten Tabelle wird beeinflusst über die Variablendefinition: '''$TABLE="<CSS-Attribute der Tabelle>"'''<br />
*Spaltenformatierungen werden beeinflusst mit Hilfe der Variablendefinition: '''$TC{<Zellenbereich für Spalten>}="<CSS-Attribute der Spalten>"''' <br />
*Zeilenformatierungen werden beeinflusst mit Hilfe der Variablendefinition: '''$TR{Zeilenbereich}="<CSS-Attribute der Zeilen>"'''<br />
*einzelne Zellen werden beeinflusst mit Hilfe der Variablen: '''$TD{<Zellenbereich für Zeilen>}{<Zellenbereich für Spalten>}="<CSS-Attribute der Zellen>"'''<br />
*für Zellen-, Spalten- und Zeilen-Bereich gilt: '''<Zahl><nowiki>|</nowiki><kommagetrennte Aufzählung><nowiki>|</nowiki><Bereich von..bis>'''<br />
*Der Status in der Statuszeile des DOIFs wird ausgeblendet mit '''$SHOWNOSTATE=1'''<br />
*Die Gerätezeile des DOIFs wird ausgeblendet mit '''$SHOWNODEVICELINE = "<regex room>"'''<br />
*Die Tabelle des DOIFs wird ausgeblendet mit '''$SHOWNOUITABLE = "<regex room>"'''<br />
*Die Detailansicht wird umorganisiert mit '''$ATTRIBUTESFIRST=1'''<br />
}}<br />
'''Bespieldefinition'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_bsp_layout DOIF ##<br />
attr di_bsp_layout uiTable { ## Beginn des Perlblocks\<br />
## CSS-Variablen\<br />
\<br />
## Die Tabelle soll ein Hintergrundbild der Größe 300x300 Pixel haben\<br />
$TABLE = "width:300px;; height:300px;; background-image:url(/fhem/www/pgm2/images/Grundriss.png);; background-size: 300px 300px;;";;\<br />
\<br />
## die Zelle der ersten Zeile und der ersten Spalte soll rechts eine Rahmenlinie haben\<br />
$TD{0}{0} = "style='border-right-style:solid;; border-right-width:10px'";;\<br />
\<br />
## Die erste Zeile soll aus der Klasse 'odd' sein und fett-Schrift haben\<br />
$TR{0} = "class='odd' style='font-weight:bold'";;\<br />
\<br />
## die Spalten 2 bis 6 sollen zentriert sein\<br />
$TC{1..5} = "align='center'";;\<br />
\<br />
## die Spalten 2, 4 und 5 sollen zentriert sein\<br />
$TC{1,3,5} = "align='center'";;\<br />
\<br />
## die letzte Spalte der Tabelle soll fett sein\<br />
$TC{last} = "style='font-weight:bold'";;\<br />
\<br />
\## Steuerungsattribute\<br />
\<br />
\## Ausblenden des Status in der Statuszeile\<br />
$SHOWNOSTATE=1;;\<br />
\<br />
## Die Gerätezeile wird ausgeblendet in allen Räumen\<br />
$SHOWNODEVICELINE = ".*";;\<br />
\<br />
## Die Tabelle wird im Raum info ausgeblendet\<br />
$SHOWNOUITABLE = "^info$";;\<br />
\<br />
## Die Detailansicht wird umorganisiert, hilfreich beim Editieren längerer uiTable-Definitionen\<br />
$ATTRIBUTESFIRST = 1;;\<br />
} ## Ende des Perlblocks<br />
</syntaxhighlight><br />
<br />
=== Die Tabellendefinition ===<br />
==== Einfache Tabellendefinition ohne Funktionen ====<br />
{{Randnotiz|RNText='''Tabellendefinition'''<br />
* eine Tabelle wird aus Zellen zusammengebaut<br />
* mehrere Zellen werden mit <nowiki>|</nowiki> von einander getrennt, sie bilden eine Tabellenzeile<br />
* eine neue Tabellenzeile beginnt mit einer neuen Zeile in der Tabellendefinition<br />
* eine Tabellenzeile kann auch in mehreren Zeilen definiert werden, diese müssen dann mit <nowiki>|</nowiki> enden<br />
* Texte werden in Anführungszeichen angegeben<br />
* Readings werden in der Form [<device>:<reading>] angegeben<br />
* Kommentare beginnen mit ## und enden mit Zeilenende<br />
* Events eines definierten Readings, führen sofort zu Aktualisierung seines Inhalts in der visualisierten Tabelle<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_definition DOIF ##<br />
attr ui_Table_definition uiTable { ## Perlblock für globale Tabellendefinitionen\<br />
\<br />
$TC{1..2}="align='center'" ## zentrierte Ausrichtung der zweiten und dritten Spalte\<br />
\<br />
}\<br />
\<br />
## Tabellendefinition\<br />
\<br />
"Warmwasser"|"Vorlauf"|"Rücklauf" ## erste Tabellenzeile\<br />
## zweite Tabellenzeile\<br />
[T_Warmwasserspeicher:temperature]| ## Zeile wird fortgesetzt, da sie mit | endet\<br />
[T_Vorlauf:temperature]| ## Zeile wird fortgesetzt, da sie mit | endet\<br />
[T_Ruecklauf:temperature]<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable Definition.png|mini|ohne]]<br />
<br />
==== Tabellendefinition mit Berechnungen ====<br />
{{Randnotiz|RNText='''Zellenauswertung'''<br />
* jede Zelle der Tabelle wird über Perl ausgewertet<br />
* Readingangaben der Form [<device>:<reading>] werden in eine Perlfunktion übersetzt<br />
* das Ergebnis des ausgewerteten Perlausdrucks wird ausgegeben<br />
* in einer Zelle können beliebige Perlfunktionen genutzt werden<br />
* Texte oder Funktionen können mit Punkt aneinander gehängt werden<br />
* mit Komma werden Texte oder Werte untereinander dargestellt<br />
* wird eine Zeile mit < abgeschlossen, so wird die aktuelle Tabelle abgeschlossen, die nächste Zeile beginnt in einer neuen Tabelle<br />
* in einer Berechnung sollte ein Trigger in Form einer Readingangabe [<device>:<reading>] vorkommen, sonst wäre das Ergebnis statisch und würde sich nicht ändern <br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_calc DOIF ##<br />
attr di_uiTable_calc uiTable ## Tabellendefinition\<br />
"Differenz"|[T_Ruecklauf:temperature]-[T_Vorlauf:temperature]\<br />
"Minimum"|minNum([TH_WZ_HM:measured-temp],[TH_Keller_HM:measured-temp])\<br />
"Durchschnitt"|([T_Ruecklauf:temperature]+[T_Vorlauf:temperature])/2<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable calc.png|mini|ohne]]<br />
<br />
== Vordefinierte uiTable-Funktionen ==<br />
Typische Widgets bzw. Styles wurden als Perl-Funktionen im package ui_Table für eine einfache Tabellendefinition programmiert. Im folgenden wird näher auf die einzelnen uiTable-Funktionen eingegangen.<br />
<br />
=== FHEM-Widgets mit der Funktion '''widget''' ===<br />
Alle in FHEM vorhanden Widgets können mit Hilfe der Perlfunktion '''widget''' genutzt werden. Bei häufiger Nutzung eines bestimmten Widgets bietet sich alternativ die Definition einer uiTable-Funktion (Typ 3) mit dem jeweiligen Widget an, siehe: [[DOIF/uiTable Schnelleinstieg#Eigene uiTable-Funktionen programmieren|uiTable-Funktion]]<br />
{{Randnotiz|RNText=Funktion '''widget'''<br />
<syntaxhighlight lang="perl"><br />
widget(<Reading>,$fhem_widget,$set)<br />
<br />
Reading # [<device>:<reading>]<br />
$fhem_widget # Angabe des FHEM-Widgets<br />
$set # optional, undef zum Setzen beliebiger Readings (entspricht setreading), "set" wenn das Reading per set-Befehl gesetzt wird (siehe Attribut ReadingList), "set <Befehl>", wenn sich der Befehl vom Reading unterscheidet, default undef<br />
</syntaxhighlight><br />
<br />
'''nützliche Links'''<br />
* [[FHEMWEB/Widgets|Fhem-Widgets]]<br />
* Fhem-Widgets als [[DOIF/uiTable Schnelleinstieg#Eigene uiTable-Funktionen programmieren|uiTable-Funktion]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_widget DOIF ##<br />
attr di_uiTable_widget uiTable ## FHEM-Widgets mit Hilfe der WID-Funktion\<br />
{package ui_Table}\<br />
"Widget"\<br />
"Select"| widget([uhr:wochentag],"select,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag")\<br />
"Selectnumbers"| widget([motor:spannung],"selectnumbers,0,0.5,12,1,lin")\<br />
"Slider"| widget([bla:wert],"slider,0,5,100,1")\<br />
"Colorpicker RGB"| widget([Lampe:farbe],"colorpicker,RGB")\<br />
"Colorpicker HSV"| widget([Lampe:farbe],"colorpicker,HSV")\<br />
"Colorpicker CT"| widget([Lampe:waerme],"colorpicker,CT,2000,10,6500")\<br />
"Colorpicker HUE"| widget([Lampe:farbe],"colorpicker,HUE,0,1,359")\<br />
"Colorpicker BRI"| widget([Lampe:helligkeit],"colorpicker,BRI,0,1,100")\<br />
"Time"| widget([start:zeit],"time")\<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable WID.png|mini|ohne]]<br />
<br />
=== SVG-uiTable-Funktionen ===<br />
SVG-uiTable-Funktionen sind skalierbare Widgets, die auf SVG-Elementen basieren. Bei allen SVG-Funktionen für Temperatur bzw. Feuchtigkeit wird die Einfärbung abhängig vom Temperatur- bzw. Feuchtigkeitswert mit Hilfe einer Zuordnungsfunktion bestimmt.<br />
<br />
==== '''ring'''-Funktionen ====<br />
===== Farbskalierte Temperaturanzeige mit Hilfe der SVG-Funktionen '''temp_ring/temp_mring''' =====<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''temp_mring'''-SVG-Funktion wird der Ring einfarbig dargestellt.<br />
<br />
Farbskalierung der '''temp_ring'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_ring_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''temp_mring'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_mring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_ring/temp_mring'''<br />
<syntaxhighlight lang="perl"><br />
temp_ring/temp_mring ($temp_value,$temp_min,$temp_max,$sizeHalf, $lightring,$lightnumber,$decFont) <br />
<br />
$temp_value # Temperatur<br />
$temp_min, # minimale Temperatur, optional, default=-20<br />
$temp_max, # maximale Temperatur, optional, default=60<br />
$sizeHalf # "<size>,<half ring>" size: Größe der Grafik, optional, default = 80, half ring: 1 für Halbring<br />
$lightring, # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_ring DOIF ##<br />
attr di_temp_ring uiTable {package ui_Table}\<br />
"außen (standard)"|temp_ring([Aussensensor:temperature])\<br />
"Warmwasser (größer,aufgehellt,Normalschrift)" |temp_mring([vaillant:WWSpeicher],15,70,110,90,100,"1,font-weight:normal")\<br />
"Vorlauf (größer)"| temp_mring([ESPEasy_ESP_Temp_Vorlauf:Temperature],15,45,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Feuchtigkeitsanzeige mit Hilfe der SVG-Funktionen '''hum_ring/hum_mring''' =====<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''hum_mring'''-SVG-Funktion wird der Ring einfarbig dargestellt.<br />
<br />
Farbskalierung der '''hum_ring'''-SVG-Funktion: <br />
[[Datei:Farbskalierung hum_ring_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''hum_mring'''-SVG-Funktion:<br />
[[Datei:Farbskalierung hum_mring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''hum_ring/hum_mring'''<br />
<syntaxhighlight lang="perl"><br />
hum_ring/hum_mring ($hum_value,$sizeHalf,$lightring,$lightnumber,$decFont) <br />
$hum_value # Feuchtigkeit<br />
$sizeHalf # "<size>,<half ring>" size: Größe der Grafik, optional, default = 80, half ring: 1 für Halbring<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_hum_ring DOIF ##<br />
attr di_hum_ring room test2<br />
attr di_hum_ring uiTable {package ui_Table}\<br />
"klein ohne Farbverlauf"|hum_mring([Aussensensor:humidity],60)\<br />
"normal groß mit Farbverlauf"|hum_ring([Aussensensor:humidity])\<br />
"groß ohne Farbverlauf aufgehellt"|hum_mring([Aussensensor:humidity],100,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:hum_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Zahlenwertes mit Hilfe der universellen SVG-Funktion '''ring''' =====<br />
Die Farbe des dargestellten Wertes kann abhängig vom Wert bestimmt werden. Dabei wird die Farbe mit Anleihen aus dem [https://de.wikipedia.org/wiki/HSV-Farbraum HSV-Farbraum] bestimmt. Dieser Farbraum benötigt eigentlich drei Werte, wobei die erste den Farbton (hue) bestimmt; hier wird nur dieser Wert verwendet (Sättigung und Hellwert sind nicht einstellbar). Der Farbton geht von rot (hue-Wert = 0) über gelb (hue-Wert = 60), dann grün (hue-Wert = 120) und blau (hue-Wert = 240) zurück zu rot (hue-Wert = 360), siehe dazu auch die [https://de.wikipedia.org/wiki/HSV-Farbraum#/media/Datei:HueScale.svg Farbtontafel] auf der Wikipedia-Seite.<br />
Die unten $colorRef genannte Funktion kann zum Beispiel in der Tabelle selbst definiert werden, beispielsweise kann man in dem device &onoff_hue verwenden, wenn man es vorab definiert (siehe [https://forum.fhem.de/index.php/topic,120088.msg1204341.html#msg1204341 Link zum Forum]):<blockquote><syntaxhighlight lang="perl"><br />
attr <ui device Name> {<br />
package ui_Table;<br />
sub onoff_hue {<br />
my($irgendeinVariablenname)=@_;<br />
return ($irgendeinVariablenname == 0 ? 240 : 0); <br />
}<br />
## Tabellendefinition<br />
...<br />
}<br />
</syntaxhighlight></blockquote>{{Randnotiz|RNText=SVG-uiTable-Funktion '''ring'''<br />
<syntaxhighlight lang="perl"><br />
ring ($value,$min,$max,$minColor,$maxColor,$unit, $sizeHalf,$colorRef,$decFont,$model,$lightness)<br />
<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$sizeHalf # "<size>,<half ring>" size: Größe der Grafik, optional, default = 100, half ring: 1 für Halbring<br />
$colorRef # Referenz auf eine Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, oder eine Referenz auf eine Arrayliste mit Grenzwerten und Farben, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$model # '<Farbverlauf>,<Min/Max>,<Innenring>,<Zeigerstärke>,<Modus>',<br />
# Farbverlauf: 1 für monochrom, <br />
# Min/Max: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte,<br />
# Innenring: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes, Zeigerstärke: in Pixel,<br />
# Zeigerstärke: Breite des Zeigers,<br />
# Modus: 0 Standard Min-Max, 1 Min-Null-Max, 2 Null-Min/Max,<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,'<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>", optional, default: "50,50,50,40,50"<br />
</syntaxhighlight><br />
Wird '''$colorFunc''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_ring DOIF (1)<br />
attr di_ring room test20,test5<br />
attr di_ring uiTable {package ui_Table;; \<br />
$SHOWNOSTATE=1}\<br />
## von 0 bis 20 in Farben von grün (hue:120) bis rot (hue:0)\<br />
"Umlaufmenge"|ring([heating:pump],0,20,120,0,"l/min",100)\<br />
\<br />
## von 0 bis 3 in Farben von rot (hue:0) bis türkis (hue:180), eine Nachkommastelle, Schriftgröße 170%\<br />
## Innenring mit Min-, Max-Beschriftung\<br />
"Wasserdruck"|ring([heating:pressure],0,3,0,180,"bar",100,undef,"1,font-size:170%,fill:silver;;font-size:50%","0,1,1")\<br />
\<br />
## Temperaturdarstellung, entspricht dem Funktionsaufruf:\<br />
## temp_ring ([outdoor:temperature],-20,60,100,"1,font-weight:normal;;font-size:140%")\<br />
## Eine Nachkommastelle, Normalschrift, Schriftgröße 140%\<br />
"Temperatur"|ring([outdoor:temperature,-20,60,undef,undef,"°C",100,\&temp_hue,"1,font-weight:normal;;font-size:140%")\<br />
\<br />
## Lufdruck als Halbring\<br />
"Luftdruck"|ring([weather:barometer],970,1045,30,90,"hPa","100,1",undef,0)\<br />
\<br />
## Co2 als Halbring, Farbgebung als Array mit drei Bereichen, Innenring mit Zeiger\<br />
"Co2"|ring([livingroom:co2],400,1200,undef,undef,'ppm',"100,1",[(600,120,1000,60,1200,0)],0,'0,0,1,5')<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Temperatur- und Feuchtigkeitsanzeige mit Hilfe der SVG-Funktion '''temp_hum_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperatur- bzw. Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar:<br />
[[Datei:Farbskalierung temp_hum_ring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_hum_ring'''<br />
<syntaxhighlight lang="perl"><br />
temp_hum_ring ($temp_value,$hum_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp,$decFontHum)<br />
<br />
$temp_value # Temperatur<br />
$hum_value # Feuchtigkeit<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp # Temperatur: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontHum # Feuchtigkeit: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_hum_ring DOIF ##<br />
attr di_temp_hum_ring uiTable {package ui_Table}\<br />
\<br />
"klein"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity],undef,undef,60)\<br />
"normal"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity])\<br />
"größer, aufgehellt"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity],undef,undef,100,undef,80)\<br />
"größer, Ring aufgehellt, Normalschrift"|temp_hum_ring([Aussensensor:temperature],[Aussensensor:humidity],undef,undef,100,80,50,"1,font-weight:normal","0,font-weight:normal")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_hum_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Temperaturwerten mit Hilfe der SVG-Funktion '''temp_temp_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar:<br />
[[Datei:Farbskalierung temp_temp_ring_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_temp_ring'''<br />
<syntaxhighlight lang="perl"><br />
temp_temp_ring ($temp1_value,$temp2_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp1,$decFontTemp2)<br />
<br />
$temp1_value # erster Temperaturwert<br />
$temp2_value # zweiter Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp1 # Temperatur1: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontTemp2 # Temperatur2: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_temp_ring DOIF ##<br />
attr di_temp_temp_ring uiTable {package ui_Table}\<br />
"klein, Ring augehellt"|temp_temp_ring([Vorlauf:Temperature],[Ruecklauf:Temperature],15,60,60,80,50)\<br />
"normal"|temp_temp_ring([Vorlauf:Temperature],[Ruecklauf:Temperature],15,60)\<br />
"groß, Zahlen aufgehellt"|temp_temp_ring([Vorlauf:Temperature],[Ruecklauf:Temperature],15,60,100,undef,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_hum_temp_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Zahlenwerten mit Hilfe der universellen SVG-Funktion '''ring2''' =====<br />
Die Farbe der dargestellten Werte kann abhängig vom Wert bestimmt werden.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''ring2'''<br />
<syntaxhighlight lang="perl"><br />
ring2 ($value1,$min1,$max1,$minColor1,$maxColor1,$unit1,$size,$colorFunc1,$decFont1,<br />
$value2,$min2,$max2,$minColor2,$maxColor2,$unit2,$colorFunc2,$decFont2,<br />
$lightness,$icon,$model)<br />
<br />
$value1 # darzustellender Wert1<br />
$min1 # minimaler Wert, optional, default=0<br />
$max1 # maximaler Wert, optional, default=100<br />
$minColor1 # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor1 # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit1 # Einheit des Wertes, optional, default = undef<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc1 # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont1 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$value2 # darzustellender Wert2<br />
...<br />
$decFont2 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
$model # '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>',<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
<br />
Argumente für den zweiten Wert entsprechend den Argumenten des ersten Wertes<br />
</syntaxhighlight><br />
Wird '''$colorFunc...''' nicht angegeben, so wird der Farbwert zwischen '''$minColor...''' und '''$maxColor...''' linear interpoliert<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_ring2 DOIF ##<br />
attr di_ring2 uiTable {package ui_Table;;}\<br />
## Leistungsaufnahme von 0 kW bis 3,6 kW in Farben von grün (hue:120) bis rot (hue:0)\<br />
## Kapazität von 0 % bis 100 % V in Farben von rot (hue:0) bis grün (hue:120)\<br />
"Wallbox"| ring2([tesla:Leistung],0,3.6,120,0,"kW",undef,undef,"1,font-weight:normal",[tesla:Kapazitaet],0,100,0,120,"%",undef,"0,font-weight:normal")\<br />
\<br />
## Stromstärke von 0 A bis 2 A in Farben von grün (hue:120) bis rot (hue:0)\<br />
## Spannung von 1 V bis 1.5 V in Farben von rot (hue:0) bis grün (hue:120)\<br />
## 3 Nachkommastellen, Normalschrift, Schriftgröße 80% \<br />
"Akku"| ring2([akku:Strom],0,2,120,0,"A",undef,undef,"3,font-weight:normal;;font-size:80%",[akku:Spannung],1,1.5,0,120,"V",undef,"3,font-weight:normal;;font-size:80%")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:ring2_bsp.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinition Innenring, Farb-Array, Ringmodi</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_solar DOIF {}<br />
attr di_solar uiTable {package ui_Table}\<br />
"Farb-Array, ringMode 1"|\<br />
ring2([zaehler:Produktion],-20,30,undef,undef,"PV kWh",130,[(-10,0,-0.001,30,10,60,30,90)],"2",[test:Bezug],-20,30,undef,undef,"Bezug",[(-10,0,-0.001,30,10,60,30,90)],"2",undef,undef,"0,1,1,0,1")\<br />
"Farbe linear, ringMode 1"|\<br />
ring2([zeahler:Produktion],-20,30,0,120,"PV kWh",130,undef,"2",[test:Bezug],-20,30,0,120,"Bezug",undef,"2",undef,undef,"0,1,1,0,1")\<br />
"Farbe linear, ringMode 2"|\<br />
ring2([zaehler:Produktion],0,30,60,120,"PV kWh",130,undef,"2",[test:Bezug],-20,0,0,120,"Bezug",undef,"2",undef,undef,"0,,,0,2")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:ring2_ringMode.png|ohne|mini]]<br />
<br />
<br clear="all"><br />
<br />
==== '''icon_ring'''-Funktionen ====<br />
===== Farbskalierte Temperaturanzeige mit einem Icon mit Hilfe der SVG-Funktionen '''icon_temp_ring/icon_temp_mring''' =====<br />
Diese Funktionen basieren auf den obigen temp_ring-Funktionen, zusätzlich wird ein SVG-Icon dargestellt. Die Farbe des Icons kann mit @ an den Iconnamen angehängt werden, ansonsten wird die Farbe der Temperatur für das Icon verwendet. Die Größe des Icons kann skaliert werden, ebenso kann die Positionen des Icons verschoben werden.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_ring/icon_temp_mring'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_ring/icon_temp_mring ($icon,$temp_value,$temp_min,$temp_max,$size,$lightring,$lightnumber,$decFont) <br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation (0-360) sind optional<br />
$temp_value # Temperatur<br />
$temp_min, # minimale Temperatur, optional, default=-20<br />
$temp_max, # maximale Temperatur, optional, default=60<br />
$size, # Größe der Grafik, optional, default=80<br />
$lightring, # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_Heizung_temp DOIF ##<br />
attr di_Heizung_temp uiTable {\<br />
package ui_Table;;\<br />
}\<br />
\<br />
icon_temp_ring("temp_outside",[vaillant:Aussentemp],-15,40)|\<br />
icon_temp_mring(([vaillant:Flame] eq "off"?"sani_boiler_temp\@white":"sani_boiler_temp\@Darkorange"),[vaillant:Vorlauf],15,70)|\<br />
icon_temp_mring(([vaillant:Pumpenstatus] eq "4" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),[vaillant:WWSpeicher],15,70)|\<br />
icon_temp_mring(([Zirk] eq "off"?"sani_pump\@white":"sani_pump\@Darkorange"),[ESPEasy_ESP_Temp_Zirkulation:Temperature],15,70)|\<br />
icon_temp_mring(([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),[ESPEasy_ESP_Temp_Vorlauf:Temperature],15,70)|\<br />
icon_temp_mring("sani_floor_heating_neutral\@white",[ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature],15,70)|""<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Feuchtigkeitsanzeige mit einem Icon mit Hilfe der SVG-Funktionen '''icon_hum_ring/icon_hum_mring''' =====<br />
Diese Funktionen basieren auf den obigen hum_ring-Funktionen, zusätzlich wird ein SVG-Icon dargestellt. Die Farbe des Icons kann mit @ an den Iconnamen angehängt werden, ansonsten wird die Farbe der Feuchtigkeit für das Icon verwendet. Die Größe des Icons kann skaliert werden, ebenso kann die Positionen des Icons verschoben werden. <br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_hum_ring/icon_hum_mring'''<br />
<syntaxhighlight lang="perl"><br />
icon_hum_ring/icon_hum_mring ($icon,$hum_value,$size,$lightring,$lightnumber,$decFont) <br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$hum_value # Feuchtigkeit<br />
$size # Größe der Grafik, optional, default=80<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_hum_ring DOIF ##<br />
attr di_icon_hum_ring room test5<br />
attr di_icon_hum_ring uiTable {package ui_Table}\<br />
"klein ohne Farbverlauf"|icon_hum_mring("weather_humidity",[Aussensensor:humidity],60)\<br />
"normal groß mit Farbverlauf"|icon_hum_ring("weather_humidity",[Aussensensor:humidity])\<br />
"groß ohne Farbverlauf aufgehellt"|icon_hum_mring("weather_humidity",[Aussensensor:humidity],100,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_hum_ring_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Icons mit einem Zahlenwert mit Hilfe der universellen SVG-Funktion '''icon_ring/icon_mring/icon_uring''' =====<br />
Diese Funktionen basieren auf der universellen ring-Funktion. Die Farbe des dargestellten Icons und des Wertes kann abhängig vom Wert bestimmt werden. Die Funktion '''icon_ring''' stellt den Farbring mit Farbverlauf dar, die Funktion '''icon_mring''' stellt den Farbring einfarbig dar. Die universelle Funktion '''icon_uring''' kann über den Parameter '''$model''' das Erscheinungsbild der Grafik verändern.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_ring/icon_mring/icon_uring'''<br />
<syntaxhighlight lang="perl"><br />
icon_ring ($icon,$value,$min,$max,$minColor,$maxColor, $unit,$decFont,$size,$colorRef,$lightness,$model)<br />
<br />
icon_mring ($icon,$value,$min,$max,$minColor,$maxColor, $unit,$decFont,$size,$colorRef,$lightness)<br />
<br />
icon_uring ($model,$icon,$value,$min,$max,$minColor,$maxColor, $unit,$decFont,$size,$colorRef,$lightness)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Style-SVG-Attribute Wert>,<Style-SVG-Attribute Einheit>", optional<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorRef # Referenz auf eine Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, oder eine Referenz auf eine Arrayliste mit Grenzwerten und Farben, optional, default = undef<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
$model # '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>',<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
</syntaxhighlight><br />
Wird '''$colorRef''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
<br />
<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_ring DOIF ##<br />
attr di_icon_ring uiTable {package ui_Table}\<br />
\<br />
icon_ring ('sani_floor_heating_neutral',[Heizenergie:Vortag_hc],0,150,120,0,'kWh')|\<br />
icon_mring ('fuel',[Tankstelle:Diesel],1.10,1.30,120,0,'€',2)|\<br />
icon_uring ('0,1,1',"air",[ESPEasy_Eingang_CO2:PPM],400,1200,undef,undef,'ppm',0,100,[(600,120,1000,60,1200,0)])|\<br />
icon_uring ('0,1','Zisterne',([Wasserzisterne]/3.4),0,100,0,120,'%',0)##/\<br />
\<br />
icon_uring ('1,1,0,8',"measure_water_meter",[Wasserverbrauch:heute],0,600,120,0,'l',0)|\<br />
icon_uring ('0,fill:white,opacity:0.4',([vaillant:Pumpenstatus] eq '4' ? 'sani_buffer_temp_down@Darkorange' : 'sani_buffer_temp_down@white'),[vaillant:Umlaufmenge],0,20,120,0,'l/min')|\<br />
icon_uring('0,1,1,4','weather_barometric_pressure',[vaillant:Wasserdruck],0,3,undef,undef,'bar',1,100,[(0.8,0,1,60,1.5,120,1.7,60,3,0)])|\<br />
icon_uring('0,opacity:0.8,1,6','sani_water_tap',[vaillant:HwcHours_hoursum2_value],0,2000,120,0,'h',0)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_ring_bsp.png|ohne|mini]]<br />
<br clear="all"><br />
<br />
===== Farbskalierte Temperatur- und Feuchtigkeitsanzeige mit einem Icon mit Hilfe der SVG-Funktion '''icon_temp_hum_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperatur- bzw. Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar:<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_hum_ring'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_hum_ring ($icon,$temp_value,$hum_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp,$decFontHum)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$temp_value # Temperatur<br />
$hum_value # Feuchtigkeit<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp # Temperatur: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontHum # Feuchtigkeit: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_temp_hum_ring DOIF ##<br />
attr di_icon_temp_hum_ring uiTable {package ui_Table}\<br />
\<br />
"normal"|icon_temp_hum_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:humidity])\<br />
"mit Normalschrift"|icon_temp_hum_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:humidity], undef,undef,undef,undef,undef,"1,font-weight:normal","0,font-weight:normal")\<br />
"größer aufgehellt"|icon_temp_hum_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:humidity], undef,undef,120,undef,80)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_hum_ring.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Temperaturwerten mit einem Icon mit Hilfe der SVG-Funktion '''icon_temp_temp_ring''' =====<br />
Die Farbe ist jeweils abhängig vom dargestellten Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar:<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_temp_ring'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_temp_ring ($icon,$temp1_value,$temp2_value,$temp_min,$temp_max,$size, $lightring,$lightnumber,$decFontTemp1,$decFontTemp2)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$temp1_value # erster Temperaturwert<br />
$temp2_value # zweiter Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$size # Größe der Grafik, optional, default=90<br />
$lightring # Helligkeit des Ringes (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFontTemp1 # Temperatur1: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$decFontTemp2 # Temperatur2: "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_temp_temp_ring DOIF ##<br />
attr di_icon_temp_temp_ring uiTable {package ui_Table}\<br />
## Größe 120%\<br />
"FB-Heizung"|icon_temp_temp_ring(([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),[ESPEasy_ESP_Temp_Vorlauf:Temperature],[ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature],15,70,120)\<br />
\<br />
## Größe 120%, Normalschrift\<br />
"Temperatur","Taupunkt"|icon_temp_temp_ring("temp_outside",[Aussensensor:temperature],[Aussensensor:dewpoint],undef,undef,120,undef,undef,"1,font-weight:normal","1,font-weight:normal")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_temp_ring.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige von zwei Zahlenwerten mit einem Icon mit Hilfe der universellen SVG-Funktion '''icon_ring2''' =====<br />
Die Farbe der dargestellten Werte kann abhängig vom Wert bestimmt werden.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_ring2'''<br />
<syntaxhighlight lang="perl"><br />
icon_ring2 ($icon,$value1,$min1,$max1,$minColor1,$maxColor1,$unit1,$size,$colorFunc1,$decFont1, $value2,$min2,$max2,$minColor2,$maxColor2,$unit2,$colorFunc2,$decFont2,$lightnesss,$model)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$value1 # darzustellender Wert1<br />
$min1 # minimaler Wert, optional, default=0<br />
$max1 # maximaler Wert, optional, default=100<br />
$minColor1 # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor1 # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit1 # Einheit des Wertes, optional, default = undef<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc1 # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont1 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$value2 ## darzustellender Wert2<br />
...<br />
$unit2 # Einheit des Wertes, optional, default = undef<br />
$colorFunc2 # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont2 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional<br />
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
$model # '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>',<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
<br />
Argumente für den zweiten Wert entsprechend den Argumenten des ersten Wertes<br />
</syntaxhighlight><br />
Wird '''$colorFunc...''' nicht angegeben, so wird der Farbwert zwischen '''$minColor...''' und '''$maxColor...''' linear interpoliert.<br />
<br />
Bei der Farbangabe des Icons beim Übergabeparameter $icon wird mit '''\@colorVal2''' das Icon mit der Farbe des zweiten Wertes eingefärbt. Bei keiner Farbangabe oder '''\@colorVal1''' wird das Icon mit der Farbe des ersten Wertes eingefärbt. Ansonsten gilt die allgemeine FHEM-Syntax für Farbgebung von Icons angehängt mit '''\@'''.<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_ring2 DOIF ##<br />
attr di_icon_ring2 uiTable {package ui_Table};;\<br />
\<br />
sub himmelsrichtung {\<br />
my ($richtung)=@_;;\<br />
my $element=int($richtung/22.5);;\##/<br />
my @h=(qw"N NNO NO ONO O OSO SO SSO S SSW SW WSW W WNW NW NNW");;\<br />
return($h[$element]);;\<br />
}\<br />
}\<br />
"Wallbox"| icon_ring2("car,1.5,0,-3",[tesla:Leistung],0,3.6,120,0,"kW",120,undef,"1,font-weight:normal",[tesla:Kapazitaet],0,100,0,120,"%",undef,"0,font-weight:normal")\<br />
\<br />
"Wind"|icon_ring2(([Wind:Geschwindigkeit]>0 ? "wind":"no_wind").",1,0,0,".[Wind:Richtung],[Wind:Geschwindigkeit],0,50,120,0,"km/h",120,undef,1,[Wind:Richtung],361,361,220,220,([Wind:Geschwindigkeit]>0?himmelsrichtung([Wind:Richtung]):"--"),undef,0)\<br />
\<br />
"Strom"|icon_ring2([zaehler:l-Produktion] > 0 ? "sani_solar\@colorVal1":"fa_bolt\@colorVal2",[zaehler:l-Produktion],0,3.6,20,120,"PV kW",150,undef,"1,,font-size:50%;fill:white",[zaehler:l-Bezug,0],0,2,120,0,"Netz kW",undef,"1,,font-size:50%;fill:white")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_ring2.png|ohne|mini]]<br />
<br />
==== '''bar'''-Funktionen ====<br />
===== Farbskalierte Anzeige der Temperatur in Balkenform mit Hilfe der SVG-Funktionen '''temp_bar/temp_mbar''' =====<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''temp_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
Farbskalierung der '''temp_bar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_bar_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''temp_mbar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung temp_mbar_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''temp_bar/temp_mbar'''<br />
<syntaxhighlight lang="perl"><br />
temp_bar/temp_mbar ($temp_value,$temp_min,$temp_max, $header,$width,$height,$size, $light,$lightnumber,$decFont)<br />
<br />
$temp_value # Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$header # Überschrift, optional, default= undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=60<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_temp_bar DOIF ##<br />
attr di_temp_bar uiTable {package ui_Table}\<br />
"standard"|temp_bar([Aussensensor:temperature])\<br />
"heller"|temp_bar([Aussensensor:temperature],undef,undef,undef,undef,undef,undef,80)\<br />
"monochrom"|temp_mbar([Aussensensor:temperature])\<br />
"kleiner"|temp_bar([Aussensensor:temperature],undef,undef,undef,undef,undef,80)\<br />
"mit Überschrift"|temp_bar([Aussensensor:temperature],undef,undef,"Außen")\<br />
"hoch"|temp_bar([Aussensensor:temperature],undef,undef,undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:temp_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige der Feuchtigkeit in Balkenform mit Hilfe der SVG-Funktionen '''hum_bar/hum_mbar''' =====<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''hum_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
Farbskalierung der '''hum_bar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung hum_bar_scaling.png|600px|ohne]]<br />
<br />
Farbskalierung der '''hum_mbar'''-SVG-Funktion:<br />
[[Datei:Farbskalierung hum_mbar_scaling.png|600px|ohne]]<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''hum_bar/hum_mbar'''<br />
<syntaxhighlight lang="perl"><br />
hum_bar/hum_mbar ($hum_value,$header,$width,$height,$size, $light,$lightnumber,$decFont)<br />
<br />
$hum_value # Feuchtigkeitswert<br />
$header # Überschrift, optional, default = undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=80<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit des der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 0<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_hum_bar DOIF ##<br />
attr di_hum_bar uiTable {package ui_Table}\<br />
"standard"|hum_bar([Aussensensor:humidity])\<br />
"heller"|hum_bar([Aussensensor:humidity],undef,undef,undef,undef,80)\<br />
"monochrom"|hum_mbar([Aussensensor:humidity])\<br />
"kleiner"|hum_bar([Aussensensor:humidity],undef,undef,undef,80)\<br />
"mit Überschrift"|hum_bar([Aussensensor:humidity],"Außen")\<br />
"hoch"|hum_bar([Aussensensor:humidity],undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:hum_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Zahlenwertes mit Hilfe der universellen SVG-Funktion '''bar''' =====<br />
Die Farbe des dargestellten Wertes kann abhängig vom Wert bestimmt werden.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''bar'''<br />
<syntaxhighlight lang="perl"><br />
bar ($value,$min,$max,$header,$minColor,$maxColor,$unit,$width, $height,$size,$colorFunc,$decFont,$gradient,$light,$lightnumber)<br />
<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$header # Überschrift, optional, default = undef (keine)<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$width # Breite der Grafik, optional, default = 63<br />
$height # Höhe der Grafik, optional, default = 60<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
$gradient # Farbverlauf, optional, undef mit Farbverlauf, 1 ohne Farbverlauf, default = undef<br />
$light # Helligkeit der Grafik (light:0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (light:0-100), optional, default=50<br />
</syntaxhighlight><br />
Wird '''$colorFunc''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
{package ui_Table}<br />
defmod di_bar DOIF ##<br />
attr di_bar uiTable {package ui_Table}\<br />
## von 0 bis 20 in Farben von grün (hue:120) bis rot (hue:0)\<br />
"Umlaufmenge"|bar([heizung:Umlaufmenge],0,20,"Umlauf",120,0,"l/min")\<br />
\<br />
## von 0 bis 3 in Farben von rot (hue:0) bis türkis (hue:180)\<br />
"Wasserdruck"|bar([heizung:Wasserdruck],0,3,undef,0,180,"bar"undef,70,undef,undef,"1,font-size:130%;;font-weight:normal")\<br />
\<br />
## Temperaturdarstellung, entspricht dem Funktionsaufruf:\<br />
## temp_bar ([Aussensensor:temperature],-20,60)\<br />
"Temperatur"|bar([Aussensensor:temperature],-20,60,undef,undef,undef,"°C",undef,undef,undef,\&temp_hue)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:bar_bsp.png|ohne|mini]]<br />
<br />
==== '''icon_bar'''-Funktionen ====<br />
===== Farbskalierte Anzeige der Temperatur in Balkenform mit Hilfe der SVG-Funktion '''icon_temp_bar/icon_temp_mbar''' =====<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''icon_temp_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_temp_bar/icon_temp_mbar'''<br />
<syntaxhighlight lang="perl"><br />
icon_temp_bar/icon_temp_mbar ($icon,$temp_value,$temp_min,$temp_max, $header,$width,$height,$size,$light,$lightnumber,$decFont)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position", \@Farbe, Skalierungsfaktor, x-Position, y-Position sind optional<br />
$temp_value # Temperaturwert<br />
$temp_min # minimale Temperatur, optional, default=-20<br />
$temp_max # maximale Temperatur, optional, default=60<br />
$header # Überschrift, optional, default= undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=75<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_temp_bar DOIF ##<br />
attr di_icon_temp_bar room test10<br />
attr di_icon_temp_bar uiTable {package ui_Table}\<br />
"standard"|icon_temp_bar("temp_outside",[Aussensensor:temperature])\<br />
"heller"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,undef,undef,undef,undef,80)\<br />
"monochrom"|icon_temp_mbar("temp_outside",[Aussensensor:temperature])\<br />
"kleiner"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,undef,undef,undef,80)\<br />
"mit Überschrift"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,"Außen")\<br />
"hoch"|icon_temp_bar("temp_outside",[Aussensensor:temperature],undef,undef,undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_temp_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige der Feuchtigkeit in Balkenform mit Hilfe der SVG-Funktionen '''icon_hum_bar/icon_hum_mbar''' =====<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert. Die Helligkeit der Farbgebung ist einstellbar. Bei der '''icon_hum_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_hum_bar/icon_hum_mbar'''<br />
<syntaxhighlight lang="perl"><br />
icon_hum_bar/icon_hum_mbar ($icon,$hum_value,$header,$width,$height,$size, $light,$lightnumber,$decFont)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position", \@Farbe, Skalierungsfaktor, x-Position, y-Position sind optional<br />
$hum_value # Temperaturwert<br />
$header # Überschrift, optional, default = undef (keine)<br />
$width # Breite der Grafik, optional, default=63<br />
$height # Höhe der Grafik, optional, default=75<br />
$size # Größe der Grafik, optional, default=100<br />
$light # Helligkeit des der Grafik (0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (0-100), optional, default=50<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_hum_bar DOIF ##<br />
attr di_icon_hum_bar uiTable {package ui_Table}\<br />
"standard"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity])\<br />
"heller"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],undef,undef,undef,undef,80)\<br />
"monochrom"|icon_hum_mbar("temperature_humidity",[Aussensensor:humidity])\<br />
"kleiner"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],undef,undef,undef,80)\<br />
"mit Überschrift"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],"Außen")\<br />
"hoch"|icon_hum_bar("temperature_humidity",[Aussensensor:humidity],undef,undef,100)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_hum_bar_bsp.png|ohne|mini]]<br />
<br />
===== Farbskalierte Anzeige eines Zahlenwertes mit Hilfe der universellen SVG-Funktionen '''icon_bar/icon_mbar''' =====<br />
Die Farbe des dargestellten Wertes und des Icons kann abhängig vom Wert bestimmt werden. Bei der '''icon_mbar'''-SVG-Funktion wird der Balken einfarbig dargestellt.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''icon_bar/icon_mbar'''<br />
<syntaxhighlight lang="perl"><br />
icon_bar ($icon,$value,$min,$max,$minColor,$maxColor,$unit,$decfont,$header,$width,$height,$size, $colorFunc,$light,$lightnumber)<br />
<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation (0-360) sind optional<br />
$value # darzustellender Wert<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$header # Überschrift, optional, default = undef (keine)<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$decFont # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>", optional, default = 1<br />
$width # Breite der Grafik, optional, default = 63<br />
$height # Höhe der Grafik, optional, default = 75<br />
$size # Größe der Grafik, optional, default = 100<br />
$colorFunc # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef<br />
$light # Helligkeit der Grafik (light:0-100), optional, default=50<br />
$lightnumber # Helligkeit der Zahl (light:0-100), optional, default=50<br />
</syntaxhighlight><br />
Wird '''$colorFunc''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_icon_bar_bsp DOIF ##<br />
attr di_icon_bar_bsp uiTable {package ui_Table;;\<br />
}\<br />
icon_bar ("fuel",[Tankstelle:Diesel],1.10,1.30,120,0,"€",2)|\<br />
icon_bar ("air",[ESPEasy_Eingang_CO2:PPM],400,1200,120,0,"ppm",0)|\<br />
icon_bar ("Zisterne",([Wasserzisterne]/3.4),0,100,0,120,"%",0)|\<br />
icon_bar (([vaillant:Pumpenstatus] eq "off" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),[vaillant:Umlaufmenge],0,20,120,0,"l/min")\<br />
icon_bar ("measure_water_meter",[Wasserverbrauch:heute],0,600,120,0,"l",0)|\<br />
icon_bar ("weather_barometric_pressure",[vaillant:Wasserdruck],0,3,0,180,"bar")|\<br />
icon_bar ("sani_water_tap",[vaillant:HwcHours_hoursum2_value],0,2000,120,0,"h",0)|\<br />
icon_bar ("sani_floor_heating_neutral",[Heizenergie:Vortag_hc],0,150,120,0,"kWh")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:icon_bar_bsp.png|ohne|mini]]<br />
<br />
==== Anzeige eines Werteverlaufs und des aktuellen Wertes mit Hilfe der SVG-Funktion '''card''' ====<br />
Es wird der aktuelle Wert eines Readings, sein zeitlicher Verlauf sowie der maximale und minimale Wert in Form einer Informationskarte visualisiert. Das Erscheinungsbild kann über zahlreiche Parameter individualisiert werden. Die Besonderheit ist das Argument '''col<Anzahl><Zeitformat>''' bei der Angabe des Readings der Form '''[<Device>:<Reading>:col<Anzahl><Zeitformat>]'''. Dadurch werden Daten des Readings temporär im DOIF-Modul gesammelt und für die Erzeugung eines Graphen zur Verfügung gestellt - es sind keine weiteren Definitionen erforderlich. Dabei wird besonders sparsam mit der Datensammlung umgegangen, es werden maximal 72 Werte (in Timeslots) gespeichert, unabhängig davon wie lange die Zeitspanne ist und wie oft die Daten ankommen. Die Auflösung des Graphen nimmt mit der Zeitspanne ab - es werden immer maximal 72 Werte dargestellt. Daraus ergibt sich bei einer Stunde eine Auflösung von 3600/72 = 50 Sekunden/Eintrag, bei 6 Stunden sind es 6*60/72 = 5 Minuten/Eintrag, für eine Woche 7*24*60/72 = 140 Minuten/Eintrag usw. Die gesammelten Daten werden über den FHEM-Befehl '''save''' in versteckten Readings des jeweiligen DOIF-Moduls gespeichert.<br />
<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''card'''<br />
<syntaxhighlight lang="perl"><br />
card ($collect,$header,$icon,$min,$max,$minColor,$maxColor, $unit,$colorRef,$decfont,$prop,$ringModel,$lightness, $collect2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$decfont2)<br />
<br />
$collect <br />
# Angabe eines Readings oder eines Arrays mit mehreren Readings der Form [<Device>:<Reading>:col<Anzahl><Zeitformat>], mit Hilfe des Argumentes col (von collect) wird das Modul angewiesen Daten des Readings über einen bestimmten Zeitraum zu sammeln<br />
<br />
col<number><timeformat> <br />
# <timeformat>: d Tage, w Wochen, ohne Angabe des Zeitformates wird <Anzahl> in Stunden interpretiert. <br />
# Beispiele: col (entspricht col24), col1, col12, col1d, col3d, col1w, col4w, col52w usw.<br />
<br />
$header # "<Überschrifttext,<Style-SVG-Text-Attribute>", optional<br />
$icon # "Iconname\@Farbe,Skalierungsfaktor,x-Position,y-Position,Rotation", \@Farbe, Skalierungsfaktor, x-Position, y-Position, Rotation sind optional<br />
$min # minimaler Wert, optional, default=0<br />
$max # maximaler Wert, optional, default=100<br />
$minColor # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = 0 (rot)<br />
$maxColor # Farbe (hue: 0-360) des maximalen Wertes, optional, default = 120 (grün)<br />
$unit <br />
# Einheit des Wertes, optional, default = undef, falls unter $collect ein Array für mehrere Readings angegeben wurde, so werden hier als Array die entsprechenden Einheiten angegeben, zusätzlich kann kommagetrennt pro Einheit Farbe des Graphen angegeben werden<br />
<br />
$colorRef <br />
# Referenz auf eine Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, oder eine Referenz auf eine Arrayliste mit Grenzwerten und Farben, optional, default = undef<br />
<br />
$decFont<br />
# "<Anzahl der Nachkommastellen>,<Style-SVG-Attribute Wert>,<Style-SVG-Attribute Einheit>", optional<br />
<br />
$prop <br />
# Eigenschaft von card: "<size>,<y-scaling>,<steps>,<noFooter>,<noColor>,<hring>,<width>", optional<br />
<br />
# <size>: Größe der der Karte, default = 130,<br />
# <y-scaling>: feste Y-Skalierung: 1, sonst automatische Skalierung,<br />
# <steps>: 1 für Stufen,<br />
# <noFooter>: 1 für keine Fußzeile,<br />
# <noColor>: 1 für graue y-Achsenbeschriftung, <br />
# <hring>: 1 für Halbringdarstellung, <br />
# <width>: Breite der Karte, default: 160<br />
<br />
$ringModel<br />
# '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>'<br />
<br />
# <color gradient>: 1 für monochrom<br />
# <min/max>: Style-SVG-Attribute oder 1 zum Anzeigen der Min-/Maxwerte<br />
# <inner ring>: Style-SVG-Attribute oder 1 zum Anzeigen des Innenringes<br />
# <pointer>: Breite des Zeigers in Pixel<br />
# <mode>: 0 Standard Min. - Max., 1 negativ - Null - positiv, 2 Null - negativ/positiv<br />
# alle Parameter sind optional, default keine Angaben: ',,,,,,'<br />
<br />
$lightness <br />
# Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"<br />
<br />
$collect2 # optionale Angaben für ein zweites Reading (es ist hier nur eine Readingangabe erlaubt)<br />
$min # restliche Parameter<br />
$max # entsprechen der Syntax<br />
... # des ersten Sensors<br />
$decfonts2 # <br />
</syntaxhighlight><br />
Wird '''$colorRef''' nicht angegeben, so wird der Farbwert zwischen '''$minColor''' und '''$maxColor''' linear interpoliert<br />
Werden mehrere Readings angegeben, so müssen sie alle die gleiche Zeitspanne besitzen (Zeitangabe bei col)<br />
<br />
'''nützliche Links'''<br />
* Anwendungsbeispiel [[DOIF/uiTable_Schnelleinstieg#Visualisierung:_Wetterstation|Wetterstation]]<br />
* Anwendungsbeispiel [[DOIF/uiTable_Schnelleinstieg#Visualisierung:_aktueller_Spritpreis|Spritpreise]]<br />
* Anwendungsbeispiel [[DOIF/uiTable_Schnelleinstieg#Visualisierung_und_Steuerung:_Heiztherme|Heiztherme]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Farbskalierte_Anzeige_eines_Icons_mit_einem_Zahlenwert_mit_Hilfe_der_universellen_SVG-Funktion_icon_ring.2Ficon_mring.2Ficon_uring|icon_ring]] <br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_collect DOIF ##<br />
attr di_collect uiTable {package ui_Table;;}\<br />
card([Aussensensor:temperature:col12],"Außen","temp_outside",-10,45,undef,undef,"°C",\&temp_hue,undef)|\<br />
card([Tankstelle:Diesel:col12],"Sprit,fill:darkorange","fuel","1.00","1.40",120,0,"Diesel €",undef,"2",",,1")\<br />
card([zaehler:l-Produktion:col12],undef,[zaehler:l-Produktion] > 0 ? "sani_solar\@colorVal1":"fa_bolt\@colorVal2",0,3.6,30,60,"PV kW",undef,"1,,font-size:50%")|\<br />
card([ESPEasy_Eingang_CO2:PPM:col12],undef,"air",400,1200,120,0,"ppm",[600,120,1000,60,1200,0],0,undef,'0,1,1',"50,35,45,35,50,35")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:svgcard.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
<br />
defmod di_cards DOIF {}<br />
attr di_cards uiTable {package ui_Table;;}\<br />
"Standard"|\<br />
card([Aussensensor:temperature:col],undef,"temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130")\<br />
"mit Halbring"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130,,,,,1")\<br />
"mit Halbring","ohne Fußzeile","Breite 110"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130,,,1,,1,110")\<br />
"Standard","Breite 200"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,50,undef,undef,"°C",\&temp_hue,"1","130,,,,,,200")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_variations.png|ohne|mini]]<br />
<br />
<br />
'''<big>Beispieldefinition mit zwei Readings mit unterschiedlichen Einheiten</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_cards DOIF {}<br />
attr di_cards uiTable {package ui_Table;;}\<br />
"Standard"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,,",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"ohne Header"|\<br />
card([Aussensensor:temperature:col],undef,"temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,,",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"ohne Header","ohne Fußzeile"|card([Aussensensor:temperature:col],undef,"temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,1,",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"Als Halbring"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,,,1",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")\<br />
"ohne Fußzeile"|\<br />
card([Aussensensor:temperature:col],"Außen","temp_outside",-10,60,undef,undef,"°C",\&temp_hue,"1","130,,,1,,1",undef,undef,[outsensor:humidity:col],0,100,undef,undef,"%",\&hum_hue,"0")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_collect2.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinitionen mit mehreren Readings mit gleicher Einheit</big>'''<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod Sprit DOIF ##<br />
attr Sprit uiTable {package ui_Table;;}\<br />
card([[Tankstelle:SuperE5:col24],[Tankstelle:Diesel:col24]],"Sprit","fuel","1.20","1.60",120,0,["E5","Diesel"],undef,"2",",,1")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_Sprit2.png|ohne|mini]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod PV DOIF {}<br />
attr PV DOIF_Readings l_Eigenv: [zaehler:l-Produktion]-[zaehler:l-Lieferung],\<br />
Eigenv:[zaehler:Produktion]-[zaehler:Lieferung],\<br />
l_Verbrauch: [zaehler:l-Bezug,0]+[$SELF:l_Eigenv,0],\<br />
Verbrauch:[zaehler:Bezug]+[$SELF:Eigenv],\<br />
l_Bezug:-[zaehler:l-Bezug]<br />
attr PV uiTable {\<br />
package ui_Table;;\<br />
$SHOWNOSTATE=1;;\<br />
}\<br />
card([[zaehler:l-Produktion:col],[$SELF:l_Eigenv:col],[$SELF:l_Bezug:col]],"kW","fa_bolt\@silver",-3.6,3.6,0,90,["Solar","Eigen.","Bezug"],[(-1,0,0,30,1,60,3.6,90)],"2","167,,1,,,1",",,1,6")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_energie.png|ohne|mini]]<br />
<br />
'''<big>Beispieldefinition mit mehreren Readings mit einfarbigen Graphen</big>'''<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_heating DOIF {}<br />
attr di_heating uiTable {\<br />
package ui_Table;;\<br />
}\<br />
card([[ESPEasy_ESP_Temp_Vorlauf:Temperature:col],[ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature:col]],"Umwälzpumpe",([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),15,70,undef,undef,["Vor. °C,red","Rück. °C,#287afc"],\&temp_hue,undef,",,1,,1")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:di_card_pump.png|ohne|mini]]<br />
<br />
==== 3d-Balkendarstellung mehrerer Zahlenwerten mit Hilfe der universellen SVG-Funktion '''cylinder''' ====<br />
Es können mehrere Zahlenwerte mit Legende farbig in Balkenform visualisiert werden. Negative Werte werden als Balken nach unten dargestellt, positive nach oben, der Nullpunkt wird automatisch berechnet.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''cylinder'''<br />
<syntaxhighlight lang="perl"><br />
cylinder ($header,$min,$max,$unit,$width,$height,$size,$dec,($value1,$color1,$text1),($value2,$color2,$text2),...<br />
<br />
$header # Überschrift<br />
$min # minimaler Wert, optional, default = 0<br />
$max # maximaler Wert, optional, default = 100<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$width # Breite der Grafik, optional, default = wird bei Beschriftungen automatisch angepasst<br />
$height # Höhe der Grafik, optional, default = wird automatisch berechnet<br />
$size # Größe der Grafik, optional, default = 100<br />
$dec # Anzahl der Nachkommastellen, optional, default=1<br />
$value1 # erster Zahlenwert<br />
$color1 # HSL-Farbe des ersten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text1 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
$value2 # zweiter Zahlenwert, optional<br />
$color2 # HSL-Farbe des zweiten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text2 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
...<br />
Es können weitere Zahlenwerte jeweils mit Farbe und Beschriftung optional angegeben werden <br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_cylinder DOIF ##<br />
attr di_cylinder room Test,wiki<br />
attr di_cylinder uiTable {package ui_Table}\<br />
"normal"|cylinder("",0,100,"%",80,undef,undef,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"mit Überschrift"|cylinder("Zisterne",0,100,"%",80,undef,undef,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"kleiner"|cylinder("Zisterne",0,100,"%",80,undef,80,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"hoch"|cylinder("Zisterne",0,100,"%",undef,100,undef,0,[Wasserzisterne:state],200,undef)\<br />
\<br />
"mit Beschriftung"|cylinder("Zisterne",0,100,"%",undef,100,undef,0,[Wasserzisterne:state],200,"Wasserstand")\<br />
\<br />
"mit mehreren Informationen"|cylinder("Energie",-20,30,"kWh",undef,undef,undef,1,[zaehler:Bezug],0,"Bezug",[zaehler:Produktion],60,"Produktion",[zaehler:Eigenverbrauch],30,"Eigenverbrauch")\<br />
\<br />
"mit hellen Farben"| cylinder("Tag",0,100,"kWh",undef,undef,undef,1,[Heizenergie:Tagesverbrauch_hc]/100000,"30.100.70","letzter",[Heizenergie:heute_hc]/100000,"60.100.70","aktuell")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:cylinder_bsp.png|ohne|mini]]<br />
<br />
==== Balkendarstellung mehrerer Zahlenwerte mit Hilfe der universellen SVG-Funktion '''cylinder_bars''' ====<br />
Es können mehrere Zahlenwerte mit Legende farbig in Balkenform visualisiert werden. Negative Werte werden als Balken nach unten dargestellt, positive nach oben, der Nullpunkt wird automatisch berechnet. Die '''cylinder_bars'''-SVG-Funkton besitzt die gleichen Argumente, wie die obige '''cylinder'''-SVG-Funktion, mehrerer Balken werden jedoch nicht übereinander, sondern nebeneinander dargestellt.<br />
{{Randnotiz|RNText=SVG-uiTable-Funktion '''cylinder_bars'''<br />
<syntaxhighlight lang="perl"><br />
cylinder_bars ($header,$min,$max,$unit,$width,$height,$size,$dec,($value1,$color1,$text1),($value2,$color2,$text2),...<br />
<br />
$header # Überschrift<br />
$min # minimaler Wert, optional, default = 0<br />
$max # maximaler Wert, optional, default = 100<br />
$unit # Einheit des Wertes, optional, default = undef<br />
$width # Breite der Grafik, optional, default = wird bei Beschriftungen automatisch angepasst<br />
$height # Höhe der Grafik, optional, default = wird automatisch berechnet<br />
$size # Größe der Grafik, optional, default = 100<br />
$dec # Anzahl der Nachkommastellen, optional, default=1<br />
$value1 # erster Zahlenwert<br />
$color1 # HSL-Farbe des ersten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text1 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
$value2 # zweiter Zahlenwert, optional<br />
$color2 # HSL-Farbe des zweiten Balkens: "<hue>.<saturation>.<lightness>" (hue:0-360,saturation:0-100,lightness:0-100), saturation (default:100) und lightness (default:50) sind optional<br />
$text2 # Beschriftung des Zahlenwertes in der Legende, optional, default = undef<br />
...<br />
Es können weitere Zahlenwerte jeweils mit Farbe und Beschriftung optional angegeben werden <br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_wasserverbrauch DOIF ##<br />
attr di_wasserverbrauch uiTable {package ui_Table;;}\<br />
cylinder_bars("Monat",0,15,"m³",undef,undef,undef,1,[Wasserverbrauch:monatsdurchschnitt],30,"Durchschnitt",[Wasserverbrauch:monatsverbrauch]/1000,220,"letzter",[Wasserverbrauch:monat]/1000,180,"aktuell")\<br />
\<br />
cylinder_bars("Monat",0,15,"m³",undef,undef,undef,1,[Wasserverbrauch:jan],30,"Januar",[Wasserverbrauch:feb],220,"Februar",[Wasserverbrauch:mrz],180,"März",[Wasserverbrauch:apr],30,"April",[Wasserverbrauch:mai],220,"Mai",[Wasserverbrauch:jun],180,"Juni",[Wasserverbrauch:jul],30,"Juli",[Wasserverbrauch:aug],220,"August",[Wasserverbrauch:sep],180,"September",[Wasserverbrauch:okt],30,"Oktober",[Wasserverbrauch:nov],220,"November",[Wasserverbrauch:dez],180,"Dezember")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:cylinder_bars_bsp.png|ohne|mini]]<br />
<br />
=== Farbskalierte Temperaturanzeige mit Hilfe der Funktion '''temp''' ===<br />
Die Farbe der dargestellten Temperatur ist abhängig vom Temperaturwert:<br />
[[Datei:Farbskalierung temp.png|600px|ohne]]<br />
{{Randnotiz|RNText=uiTable-Funktion '''temp'''<br />
<syntaxhighlight lang="perl"><br />
temp ($temp,$size,$icon)<br />
<br />
$temp # Temperatur<br />
$size # Schriftgröße in Pixel (pt), optional<br />
$icon # Icon, welches vorangestellt wird, optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_temp DOIF ##<br />
attr di_uiTable_temp uiTable {\<br />
package ui_Table;; ## Package für uiTable-Funktionen\<br />
$TC{0..2}="align='center'";; ## zentrierte Darstellung aller Tabellenspalten\<br />
}\<br />
## Tabellendefinition\<br />
\<br />
"Aussen"|"Bad"|"Warmwasser" ## mit | werden Tabellenzellen voneinander getrennt \<br />
temp([Aussensensor:temperature])| ## Anzeige des Readings 'temperature' des Gerätes 'Aussensensor' \<br />
temp([TH_Bad_HM:measured-temp],24,"temp_temperature")| ## Schriftgröße 24pt, mit Icon namens temp_temperature\<br />
temp([T_Warmwasserspeicher:temperature:d1],20) ## Schriftgröße 20pt<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Temp.png|ohne|mini]]<br />
<br />
=== Farbskalierte Feuchtigkeitsanzeige mit Hilfe der Funktion '''hum''' ===<br />
Die Farbe der dargestellten Feuchtigkeit ist abhängig vom Feuchtigkeitswert:<br />
[[Datei:Farbskalierung hum.png|350px|ohne]]<br />
{{Randnotiz|RNText=uiTable-Funktion '''hum'''<br />
<syntaxhighlight lang="perl"><br />
hum ($hum,$size,$icon)<br />
<br />
$hum # Feuchtigkeit<br />
$size # Schriftgröße in Pixel (pt), optional<br />
$icon # Icon, welches vorangestellt wird, optional<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_hum DOIF ##<br />
attr di_uiTable_hum uiTable {\<br />
package ui_Table;;\<br />
$TC{1}="align='center'";; ## zweite Spalte der Tabelle zentriert\<br />
}\<br />
## Tabellendefinition \<br />
\<br />
## Anzeige des Readings 'humidity' des Thermostats 'TH_Bad_HM' \<br />
"Bad"|hum ([TH_Bad_HM:humidity])\<br />
\<br />
## Feuchtigkeit in Größe 10pt mit Temperatur in einer Tabellenzelle\<br />
"Aussen"|temp ([Aussensensor:temperature]),hum ([Aussensensor:humidity],10)\<br />
\<br />
## Feuchtigkeit in Größe 26pt mit Icon namens 'temperature_humidity'\<br />
"Keller"|hum ([TH_Keller_HM:humidity],26,"temperature_humidity")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable Funktion hum.png|ohne|mini]]<br />
<br />
=== Textformatierungen mit Hilfe der Funktion '''style''' ===<br />
Texte werden in Farbe, Größe und Schriftart statisch oder dynamisch formatiert.<br />
{{Randnotiz|RNText=uiTable-Funktion '''style'''<br />
<syntaxhighlight lang="perl"><br />
style ($text,$color,$font_size,$font_weight)<br />
<br />
$text # anzuzeigender Text<br />
$color # CSS color, optional<br />
$font_size # Schriftgröße in Pixel (pt), optional<br />
$font_weight # CSS Schriftart, optional<br />
</syntaxhighlight><br />
Mögliche Werte für '''''color''''' und '''''font_weight''''' können in einschlägiger Dokumentation zu CSS nachgeschlagen werden<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_style DOIF ##<br />
attr di_uiTable_style uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## Tabellendefinition\<br />
\<br />
## statische Farbgebung, Größe, Schriftart \<br />
style("Montag","orange")\<br />
style("Dienstag","red",14)\<br />
style("Mittwoch","#00FFFF",20)\<br />
style("Donnerstag","blue",23,"bold")\<br />
\<br />
## dynamische Farbgebung abhängig vom Zustand des Gerätes 'Alarm'\<br />
style("Alarm",([Alarm:state] eq "on" ? "red":"green"))\<br />
\<br />
## dynamische Farbgebung des Zustands des Gerätes 'Alarm'\<br />
style([Alarm:state],([Alarm:state] eq "on" ? "red":"green"))\<br />
\<br />
## variabler Text abhängig vom Zustand des Gerätes 'Alarm'\<br />
style(([Alarm:state] eq "on" ? "Alarm aktiv":"Alarm deaktiviert"),"red")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Style.png|ohne|mini]]<br />
<br />
=== Icon-Darstellung mit Hilfe der Funktion '''ICON''' ===<br />
Mit Hilfe der Funktion '''ICON''' kann ein FHEM-Icon dargestellt werden<br />
{{Randnotiz|RNText=uiTable-Funktion '''ICON'''<br />
<syntaxhighlight lang="perl"><br />
ICON ($icon)<br />
<br />
$icon # Icon mit Farbgebung<br />
</syntaxhighlight><br />
<br />
'''ICON''' benutzt die Funktion [[DevelopmentFHEMWEB-API#FW_makeImage|FW_makeImage]]<br />
<br />
'''nützliche Links'''<br />
* [[DOIF/uiTable Schnelleinstieg#hsv-Funktion für Farbskalierungen|hsv-Funktion]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_Table_ICON DOIF ##<br />
attr di_Table_ICON uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## Tabellendefinition\<br />
ICON("temp_frost") | ## Icon ohne Einfärbung\<br />
ICON("temp_frost\@blue") | ## Icon in CSS-Farbe blau\<br />
ICON("temp_frost\@#8A2BE2") | ## Icon in CSS-Farbe #8A2BE2\<br />
ICON("temp_frost\@".([Aussensensor:temperature] > 0 ? "orange":"blue"))| ## Icon in CSS-Farbe orange über Null Grad, sonst in CSS-Farbe blau\<br />
ICON("temp_frost\@".hsv ([Aussensensor:temperature],-20,40,320,0)) ## Icon in Farbskalierung von violett (-20 °C) bis rot (40 °C) mit Hilfe der Funktion hsv<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable_IC.png|mini|ohne]]<br />
<br />
=== Icon-Darstellung mit Text mit Hilfe der Funktion '''icon_label''' ===<br />
Mit Hilfe der Funktion '''icon_label''' kann ein FHEM-Icon mit einem angehängten Text/Wert dargestellt werden.<br />
{{Randnotiz|RNText=uiTable-Funktion '''icon_label'''<br />
<syntaxhighlight lang="perl"><br />
icon_label ($icon,$text,$color,$color_bg,$pos_left,$pos_top)<br />
$icon # FHEM-Icon mit Farboption<br />
$text # dargestellter Text<br />
$color # Farbe des Textes, optional<br />
$color # Hintergrundfarbe des Textes, optional<br />
$pos_left # horizontale Position des Textes in px, default -5, optional<br />
$pos_top # vertikale Position des Textes in px, default -8, optional<br />
</syntaxhighlight><br />
<br />
'''Anwendungsbeispiele'''<br />
* [[DOIF/uiTable Schnelleinstieg#Anzahl der Tage bis zur Abfall-Entsorgung|Abfall]]<br />
* [[DOIF/uiTable Schnelleinstieg#Visualisierung: aktueller Spritpreis|Sprit]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_icon_label DOIF ##<br />
attr di_uiTable_icon_label uiTable { package ui_Table;;\<br />
}\<br />
\<br />
icon_label("fuel",[Tankstelle:Diesel])|\<br />
icon_label("fuel",[Tankstelle:Diesel],"red")|\<br />
icon_label("fuel\@blue",[Tankstelle:Diesel],"blue","#999999")|\<br />
icon_label("fuel\@red",[Tankstelle:Diesel],"red","white",-10)|\<br />
icon_label("fuel",[Tankstelle:Diesel],"white","red",-5,8)\<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable_icon_label.png|mini|ohne]]<br />
<br />
=== Visualisierung eines Gerätes mit Hilfe der Funktion '''icon''' ===<br />
Der Zustand eines Gerätes/Readings wird mit Hilfe eines Icons dargestellt.<br />
{{Randnotiz|RNText=uiTable-Funktion '''icon'''<br />
<syntaxhighlight lang="perl"><br />
icon ($value,$icon_off,$icon_on,$state_off,$state_on)<br />
<br />
$value # Wert <br />
$icon_off # Icon für den Wert off, default "off"<br />
$icon_on # Icon für den Wert on, default Icon für Wert 'off' in Farbe 'DarkOrange', sonst Icon 'on', wenn $icon_off nicht definiert ist<br />
$state_off # Wert zugehörig zum Icon off, default "off"<br />
$state_on # Wert zugehörig zum Icon on, default "on"<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_icon DOIF ##<br />
attr di_uiTable_icon uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## Tabellendefinition\<br />
\<br />
## Standard-Icon off/on für Standardwert off/on \<br />
"Lampe"|icon([Lampe:state]) ## entspricht icon([Lampe:state],"off","on","off","on")\<br />
\<br />
## Icon für Zustand 'off' ist 'hue_room_hallway', für Zustand 'on' 'hue_room_hallway\@DarkOrange'\<br />
"Flur"|icon([Lampeflur:state],"hue_room_hallway") ## entspricht icon([Lampeflur:state],"hue_room_hallway","hue_room_hallway\DarkOrange","off","on")\<br />
\<br />
## Icon für Zustand 'off' ist 'status_away_2', für Zustand 'on' 'status_available\@DarkOrange'\<br />
"Anwesenheit"|icon([Anwesenheit:state],"status_away_2","status_available\@DarkOrange") \<br />
\<br />
## Icon für Zustand 'closed' ist "status_locked", für Zustand 'open' 'status_open\@DarkOrange'\<br />
"Haus"|icon([Schloss:state],"status_locked","status_open\@DarkOrange","closed","open") <br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable icon.png|mini|ohne]]<br />
<br />
=== Schaltbares Icon mit Hilfe der Funktion '''switch''' ===<br />
Der Zustand eines Gerätes/Readings wird mit Hilfe eines Icons dargestellt, er kann über die WEB-Oberfläche durch Anklicken geschaltet werden. Damit der Zustand des Gerätes geschaltet werden kann, muss das Gerät den set-Befehl unterstützen.<br />
<br />
{{Randnotiz|RNText=uiTable-Funktion '''switch'''<br />
<syntaxhighlight lang="perl"><br />
switch ($value,$icon_off,$icon_on,$state_off,$state_on)<br />
<br />
$value # [<device>:<reading>] <br />
$icon_off # Icon für den Wert off, default "off"<br />
$icon_on # Icon für den Wert on, default Icon für Wert 'off' in Farbe 'DarkOrange', sonst Icon 'on', wenn $icon_off nicht definiert ist<br />
$state_off # Wert zugehörig zum Icon off, default "off"<br />
$state_on # Wert zugehörig zum Icon on, default "on"<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_switch DOIF ##<br />
attr di_uiTable_switch uiTable {\<br />
package ui_Table;;\<br />
}\<br />
## schaltbares Icons in der Webansicht \<br />
switch([Lampe:state]) | \<br />
switch([Lampeflur:state],"hue_room_hallway") |\<br />
switch([Anwesenheit:state],"status_away_2","status_available\@DarkOrange")|\<br />
switch([Haus:state],"status_locked","status_open\@DarkOrange","closed","open")\<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable switch.png|mini|ohne]]<br />
<br />
=== Rollladen: Visualisierung und Steuerung mit Hilfe der Funktion '''shutter''' ===<br />
Die aktuelle Position des Rollladens (0 % - 100 %) wird über Icons visualisiert. Das Anklicken eines Symbols steuert den Rollladen auf die entsprechende Position. Prozentwerte zwischen zwei Icon-Werten werden dem nächsthöheren Icon-Wert zugeordnet.<br />
{{Randnotiz|RNText=uiTable-Funktion '''shutter'''<br />
<syntaxhighlight lang="perl"><br />
shutter ($value,$color,$type)<br />
<br />
$value # [<device>:<reading>] <br />
$color # Farbe der aktuellen Rollladenposition, vorangestelltes @ verändert die Farbe des Icons, ohne @ wird der Hintergrund des Icons eingefärbt, default ist @DarkOrange<br />
$type # optional, Anzahl der Symbole 2 bis 6, 3 ist default<br />
</syntaxhighlight><br />
<br />
* [[DOIF/uiTable Schnelleinstieg#Visualisierung und Steuerung von Rollläden|Anwendungsbeispiel]]<br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_shutter DOIF ##<br />
attr ui_Table_shutter uiTable {\<br />
package ui_Table;;\<br />
}\<br />
shutter([R_Keller:pct],"\@yellow",2) ## zwei Symbole für 0 % und 100 %\<br />
shutter([R_Wohnzimmer_S:pct]) ## entspricht shutter ([R_Wohnzimmer_S:pct],"\@DarkOrange",3) \<br />
shutter([R_Wohnzimmer_W1:pct],"blue",4) ## vier Symbole \<br />
shutter([R_Wohnzimmer_W2:pct],"\@red",5) ## fünf Symbole\<br />
shutter([R_Wohnzimmer_W3:pct],"red",6 ## sechs Symbole)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable shutter.png|mini|ohne]]<br />
<br />
=== Helligkeit: Visualisierung und Steuerung mit Hilfe der Funktion '''dimmer''' ===<br />
Die aktuelle Helligkeit (0 % - 100 %) wird über Icons visualisiert. Das Anklicken eines Icons bestimmt die Helligkeit der Leuchte. Prozentwerte zwischen zwei Icon-Werten werden dem nächsthöheren Icon-Wert zugeordnet.<br />
{{Randnotiz|RNText=uiTable-Funktion '''dimmer'''<br />
<syntaxhighlight lang="perl"><br />
dimmer ($value,$color,$type)<br />
<br />
$value # [<device>:<reading>] <br />
$color # Farbe der aktuellen Helligkeit, vorangestelltes @ verändert die Farbe des Icons, ohne @ wird der Hintergrund des Icons eingefärbt, default ist @DarkOrange<br />
$type # Anzahl der Symbole 2 bis 7, 3 ist default<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_dimmer DOIF ##<br />
attr di_uiTable_dimmer uiTable {\<br />
package ui_Table;;\<br />
}\<br />
dimmer([Strauch3:pct],"\@yellow",2)\<br />
dimmer([Strauch3:pct]) ## entspricht dimmer([Strauch3:pct],"\@DarkOrange",3) \<br />
dimmer([Strauch3:pct],"blue",4)\<br />
dimmer([Strauch3:pct],"\@red",5)\<br />
dimmer([Strauch3:pct],"red",6)\<br />
dimmer([Strauch3:pct],"DarkOrange",7)<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable dimmer.png|mini|ohne]]<br />
<br />
=== Vorgabetemperatur eines Thermostats mit Hilfe der Funktion '''temp_knob''' ===<br />
Die aktuelle Vorgabetemperatur eines Thermostats wird über ein Icons visualisiert. Durch Anklicken des Ringes wird die Vorgabetemperatur verändert.<br />
{{Randnotiz|RNText=uiTable-Funktion '''temp_knob'''<br />
<syntaxhighlight lang="perl"><br />
temp_knob ($value,$color,$set)<br />
<br />
$value # [<device>:<reading>] <br />
$color # Farbe der voreingestellten Temperatur, default "Darkorange"<br />
$set # set-Befehl, default "set", sonst muss "set <Readingname>" angegeben werden, falls sich das Reading vom set-Befehl vom angezeigten Reading unterscheidet, wie beim THRESHOLD-Modul<br />
</syntaxhighlight><br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_temp_knob DOIF ##<br />
attr ui_Table_temp_knob uiTable {\<br />
package ui_Table;;\<br />
}\<br />
\<br />
## HM-EU-Thermostat, angezeigt wird das Reading "desired-temp", geschaltet wird über "set desired-temp" \<br />
"Dachgeschoss"|temp_knob([TH_DG_HM:desired-temp]) ## entspricht temp_knob([TH_DG_HM:desired-temp],"Darkorange","set") \<br />
\<br />
## HM-EU-Thermostat Temperaturanzeige in gelb \ <br />
"Wohnzimmer"|temp_knob([TH_WZ_HM:desired-temp],"yellow") \<br />
\<br />
## Beim THRESHOLD-Modul wird das Reading "desired_value" angezeigt, geändert wird die Temperatur per "set desired" \<br />
"Küche"|temp_knob([TH_Kueche:desired_value],"red","set desired")<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable temp knob.png|mini|ohne]]<br />
<br />
== uiTable-'''Templates''' ==<br />
Die Definition einer oder mehrere Zellen kann zu einem Template zusammengefasst werden. Durch die Nutzung von Templates kann die Definition einer Tabelle erheblich vereinfacht werden. Insb. bei gleichartigen Zellen/Zeilen für verschiedene Geräte/Readings braucht eine aufwendige Definition nicht immer wieder wiederholt werden, sondern kann jeweils mit dem Aufruf eines zuvor definierten Templates realisiert werden.<br />
{{Randnotiz|RNText='''Templates'''<br />
* Die Definition von Templates muss vor der Tabellendefinition vorgenommen werden<br />
* Eine Template-Definition beginnt mit dem Schlüsselwort '''DEF'''<br />
* Der Template-Name muss mit '''TPL_''' beginnen<br />
* '''Template-Definition'''-Syntax<br />
<syntaxhighlight lang="perl"><br />
DEF TPL_<Template-Name>(<Zellendefinition mit Platzhaltern: $1,$2,...>)<br />
</syntaxhighlight><br />
* Templates-Definitionen können in externe Dateien ausgelagert werden<br />
* Templates-Definitionen können per IMPORT-Befehl aus externen Dateien importiert werden<br />
* '''Template-Import'''-Syntax<br />
<syntaxhighlight lang="perl"><br />
IMPORT <Pfad mit Dateinamen><br />
</syntaxhighlight><br />
* Innerhalb einer Tabellendefinition können zuvor definierte oder importierte Templates mehrfach genutzt werden<br />
* '''Template-Aufruf'''-Syntax<br />
<syntaxhighlight lang="perl"><br />
TPL_<Template-Name>(<Übergabeparameter für $1>,<Übergabeparameter für $2>,...)<br />
</syntaxhighlight><br />
}}<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod ui_Table_Template DOIF ##<br />
attr ui_Table_Template uiTable {\<br />
package ui_Table;;\<br />
$TC{1..3}="align='center'";; ## Spalten 1 bis 3 werden zentriert\<br />
}\<br />
\<br />
## Template-Definitionen beginnen vor der Tabellendefinition\<br />
\<br />
## Das Template TPL_raum stellt eine Tabellenzeile dar, die mit Hilfe von uiTable-Funktionen mehrere Tabellenzellen definiert\<br />
DEF TPL_raum ("$1" | temp([TH_$2_HM:measured-temp]),hum([TH_$2_HM:humidity]) | switch([H_$2:state],"fa_off") | temp_knob([TH_$2_HM:desired-temp]))\<br />
\<br />
## Tabellendefinition\<br />
\<br />
## pro Tabellenzeile wird ein Raum mit Hilfe des oben definierten Templates "TPL_raum" dargestellt\<br />
"Raum"|"Temp./Feuchte"|"Ventil"|"Vorgabetemp."\<br />
TPL_raum (Dachgeschoss,DG) ## der Übergabeparameter "Dachgeschoss" wird im Template "TPL_raum" anstelle von $1 eingesetzt, "DG" wird anstelle von $2 eingesetzt\<br />
TPL_raum (Bad,Bad)\<br />
TPL_raum (Kinderzimmer ost,Kz_o)\<br />
TPL_raum (Kinderzimmer west,Kz_w)\<br />
TPL_raum (Wohnzimmer,WZ)\<br />
TPL_raum (Keller,Keller)<br />
<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable Templates.png|mini|ohne]]<br />
<br />
== Eigene uiTable-Funktionen programmieren ==<br />
Für die eigenen Bedürfnisse können eigene uiTable-Funktionen programmiert werden. In der Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DOIF/uiTable.tpl contrib/DOIF/uiTable.tpl] befinden sich alle intern definierten uiTable-Funktion aus dem package ui_Table als Kopie. Diese Funktionen können als Inspiration für eigene Entwicklung dienen. <br />
{{Randnotiz|RNText='''uiTable-Funktionen'''<br />
* Es gibt drei Arten von uiTable-Funktionen, sie werden intern anhand der Rückgabewerte unterschieden<br />
* uiTable-Funktionen vom Typ 1: '''HTML''', ein Rückgabewert<br />
<syntaxhighlight lang="perl"><br />
return(<HTML-code>)<br />
</syntaxhighlight><br />
* uiTable-Funktionen vom Typ 2: '''Style''' (entspricht der '''STY'''-Funktion), zwei Rückgabewerte<br />
<syntaxhighlight lang="perl"><br />
return(<value>,<CSS-style>)<br />
</syntaxhighlight><br />
* uiTable-Funktionen vom Typ 3: '''Widget''' (entspricht der '''WID'''-Funktion), vier Rückgabewerte<br />
<syntaxhighlight lang="perl"><br />
return (<value>,<>,<FHEM-widget>,<set-command: "" or "set" or "set <Readingname>">)<br />
</syntaxhighlight><br />
* uiTable-Funktionen sind reine Perlfunktionen<br />
* uiTable-Funktionen sollten im eigenen Package definiert werden, sonst könnten bestehende Perlfunktionen im System überschrieben werden<br />
* uiTable-Funktionen können in Template-Dateien ausgelagert werden und über IMPORT-Befehl importiert werden, siehe Templates<br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_function DOIF ##<br />
attr di_uiTable_function uiTable {\<br />
package my_uiTable;; ## eigenes Package mit selbstdefinierten Funktionen\<br />
\<br />
## uiTable-Funktion vom Typ "HTML", Rückgabewert: (HTML-code)\<br />
\<br />
sub clock { ## Anzeige aktueller Uhrzeit mit Datum\<br />
## Voraussetzung: contrib/DOIF/doifclock.js muss ins www/pgm2-Verzeichnis kopiert werden\<br />
## Attribut setzen in der Webinstanz: attr <WEB-Instanz> JavaScripts pgm2/doifclock.js \<br />
my ($color,$size)=@_;;\<br />
$color="darkorange" if (!defined ($color));; ## $color ist optional, default Darkorange\<br />
$size="20" if (!defined ($size));; ## $size ist optional, default 20pt\<br />
return("<div class='doifclock'style='font-weight:bold;;font-size:".$size."pt;;color:".$color.";;'>error</div>")\<br />
}\<br />
\<br />
## uiTable-Funktion vom Typ Style, Rückgabewerte (Wert,CSS-style)\<br />
\<br />
sub red_green { ## Farbige Skalierung von Zahlen mit Hilfe der DOIF_hsv-Funktion: von 0 - rot bis 10 - grün\<br />
my ($value)=@_;;\<br />
return ($value." KW", ## Wert/Text\<br />
"font-weight:bold;;color:".::DOIF_hsv ($value,0,10,0,120,70,100) ## CSS-Style\<br />
);;\<br />
} \<br />
\<br />
## uiTable-Funktion vom Typ Widget, Rückgabewerte (Wert,Leer,FHEM-Widget,set-Befehl)\<br />
\<br />
sub slider { ## FHEM-Widget Slider, weitere FHEM-Widgets siehe: https://wiki.fhem.de/wiki/FHEMWEB/Widgets\<br />
my ($value,$set)=@_;;\<br />
$set="" if (!defined $set);;\<br />
return ($value, ## Zahlenwert\<br />
"", ## leer\<br />
"slider,0,0.5,100,1", ## FHEM-Widget\<br />
$set ## set-Befehl des FHEM-Widgets\<br />
) \<br />
}\<br />
\<br />
}\<br />
\<br />
## Tabellendefinition\<br />
\<br />
"Uhrzeit/Datum"\<br />
clock("yellow",30) ## obige Funktion clock\<br />
"Dimmer"\<br />
slider([Wohnzimmer:pct]) ## obige Funktion slider\<br />
"Leistung"\<br />
red_green([Leistung:state]) ## obige Funktion red_green<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-functions.png|mini|ohne]]<br />
<br />
== Package-Konzept, Auslagerung eigener Funktionen, der '''IMPORT'''-Befehl==<br />
uiTable arbeitet mit Packages. In einem Package sind definierte Funktionen gekapselt, sie kollidieren nicht mit bereits definierten Funktionen in FHEM.<br />
{{Randnotiz|RNText='''Package'''<br />
* das für die Definition der Tabelle gültige Package wird im Perlblock des uiTable-Attributes angegeben<br />
* interne uiTable-Funktionen befinden sich im Package '''ui_Table'''<br />
* ohne eine Angabe eines Package befindet man sich im Package '''main'''<br />
* Funktionen außerhalb des gültigen Package müssen mit <package-Name>::<Funktion> angegeben werden<br />
* externe uiTable-Funktionen können per IMPORT-Befehl importiert werden<br />
}} <br />
=== Tabellendefinition im Package main ===<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel1 DOIF ##<br />
attr beispiel1 uiTable ## keine Package-Definition im Perlblock\<br />
\<br />
## Tabellendefinition befindet sich im Package main\<br />
\<br />
## Funktionen aus dem main-Package können unmittelbar angegeben werden\<br />
FW_makeImage("scene_day")\<br />
\<br />
## Funktionen aus dem ui_Table-Package müssen mit vorangestelltem Package angegeben werden\<br />
ui_Table::temp ([Aussensensor:tempaerature])<br />
</syntaxhighlight><br />
<br />
=== Tabellendefinition im Package ui_Table ===<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel2 DOIF ##<br />
attr beispiel2 uiTable {\<br />
package ui_Table; ## Package-Angabe im Perlblock\<br />
}\<br />
\<br />
## Tabellendefinition befindet sich im Package ui_Table\<br />
\<br />
## Funktionen aus dem main-Package müssen mit vorangestelltem package angegeben werden, der Name main kann weggelassen werden\<br />
::FW_makeImage("scene_day")\<br />
\<br />
## Funktionen aus dem ui_Table-Package können direkt angegeben werden\<br />
temp ([Aussensensor:temperature])<br />
</syntaxhighlight><br />
<br />
=== Eigene uiTable-Funktionen im eigenen Package ===<br />
Diese Art der Definition bietet sich dann an, wenn man eine eigene uiTable-Funktion nur in einem DOIF nutzen möchte.<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel3 DOIF ##<br />
attr beispiel3 uiTable {\<br />
package $SELF;; ## Package-Name ist der Name des DOIF-Moduls, dadurch ist der Package-Name eindeutig\<br />
sub scene_day { ## eigene Funktion befindet sich im eigenen Package beispiel3\<br />
return (::FW_makeImage("scene_day"));;\<br />
}\<br />
}\<br />
## Tabellendefinition befindet sich im Package beispiel3\<br />
\<br />
## Funktionen aus dem main-Package müssen mit vorangestelltem Package angegeben werden (der Name main kann weggelassen werden)\<br />
::FW_makeImage("scene_day")\<br />
\<br />
## interne Funktionen aus dem ui_Table-Package müssen mit vorangestelltem Package ui_Table angegeben werden\<br />
ui_Table::temp ([Aussensensor:temperature])\<br />
\<br />
## eigene Funktionen können direkt angegeben werden\<br />
scene_day()<br />
</syntaxhighlight><br />
<br />
=== Eigene ausgelagerte uiTable-Funktionen ===<br />
Möchte man das ui_Table-Package um eigene Funktionen erweitern, die man in verschiedenen DOIFs nutzen möchte, so sollte man diese in eine eigene Datei auslagern, die man mit dem IMPORT-Befehl vor der Definition der Tabelle importieren kann.<br />
<br />
Ausgelagerte Funktion in einer eigenen Datei z. B. my_uiTable.tpl:<br />
<br />
<syntaxhighlight lang="perl"><br />
{ ## Inhalt der Datei my_uiTable.tpl<br />
package ui_Table; ## das aktuelle Package ist ui_Table<br />
sub scene_day { ## eigene Funktion wird zum Package ui_Table hinzugefügt <br />
return (::FW_makeImage("scene_day"));<br />
}<br />
## die Datei kann alle Funktionen beinhalten, die man in diversen DOIFs nutzen möchte<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight lang="perl"><br />
defmod beispiel4 DOIF ##<br />
attr beispiel4 uiTable ##\<br />
\<br />
IMPORT ./contrib/DOIF/my_uiTable.tpl ## nach dem Import befindet man sich in Package ui_Table erweitert um eigene Funktionen\<br />
\<br />
## Tabellendefinition befindet sich im Package ui_Table\<br />
\<br />
## Funktionen aus dem main-Package müssen mit vorangestelltem Package angegeben werden (der Name main kann weggelassen werden)\<br />
::FW_makeImage("scene_day")\<br />
\<br />
## interne uiTable-Funktionen aus dem ui_Table-Package können direkt angegeben werden\<br />
temp ([Aussensensor:temperature])\<br />
\<br />
## eigene Funktionen können direkt angegeben werden, da man sich bereits im Package uiTable befinden\<br />
scene_day()\<br />
</syntaxhighlight><br />
<br />
== '''hsv'''-Funktion für Farbskalierungen==<br />
Mit Hilfe der hsv-Funktion können Texte, Werte oder Icons abhängig vom Wert eingefärbt werden. Es wird durch Vorgabe von Farbsättigung (saturation) und Helligkeit (lightness), linear ein Farbton für einen bestimmten Wert errechnet. Den Farbwert HUE (0 - 360) für den kleinsten sowie größten Wert kann man mit Hilfe eines Color-Pickers bestimmen. Der Rückgabewert ist ein Farbwert in der CSS-Notation.<br />
{{Randnotiz|RNText='''hsv-Funktion für Farbskalierungen'''<br />
<syntaxhighlight lang="perl"><br />
hsv ($value,$min_value,$max_value,$min_hue,$max_hue,$saturation,$lightness)<br />
$value # Wert, Reading<br />
$min_value # der kleinste Wert, dieser entspricht dem Farbwert $min_hue<br />
$max_value # der größte Wert, dieser entspricht dem Farbwert $max_hue<br />
$min_hue # Farbwert für den kleinsten Wert $min_value<br />
$max_hue # Farbwert für den größten Wert $max_value<br />
$saturation # Farbsättigung, default 100, optional<br />
$lightness # Farbhelligkeit, default 100, optional<br />
</syntaxhighlight><br />
Die Funktion befindet sich im ui_Table-Package<br />
}}<br />
<br />
'''<big>Beispieldefinition</big>'''<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_hsv DOIF ##<br />
attr di_uiTable_hsv uiTable {\<br />
package ui_Table;;\<br />
## eigene uiTable-Funktionen vom Typ 1 mit einem Rückgabewert als HTML-Code\<br />
\<br />
sub bat_icon { ## färbt das Icon 'measure_battery_100' abhängig vom Wert mit Hilfe der Funktion hsv \<br />
my ($value)=@_;;\<br />
return(ICON("measure_battery_100\@".hsv($value,0,100,0,120,100,100)))\<br />
}\<br />
\<br />
sub bat_icon2 {## zusätzlich zum Farbwert wird ein entsprechendes Icon bestimmt\<br />
my($val)=@_;;\<br />
my $icon;;\<br />
if ($val==0) {\<br />
$icon="measure_battery_0";;\<br />
} elsif ($val<=25) {\<br />
$icon="measure_battery_25";;\<br />
} elsif ($val<=50) {\<br />
$icon="measure_battery_50";;\<br />
} elsif ($val<=75) {\<br />
$icon="measure_battery_75";;\<br />
} else {\<br />
$icon="measure_battery_100";;\<br />
}\<br />
\<br />
my $output=ICON("$icon\@".hsv ($val,0,100,0,120,90,100));;\<br />
return($output);;\<br />
}\<br />
}\<br />
\<br />
## Tabellendefinition\<br />
\<br />
## eingefärbtes Icon 0 % entspricht rot (HSV-Wert 0), 100 % entspricht grün (HSV-Wert 120) mit Direktangabe\<br />
1|ICON("measure_battery_100\@".hsv([bat:level],0,100,0,120,100,100))\<br />
\<br />
## gleiche Funktionalität mit Hilfe der oben definierten Funktion bat_icon \<br />
2|bat_icon([bat:level])\<br />
\<br />
## Icon mit Hilfe der oben definierten Funktion bat_icon2\<br />
3|bat_icon2([bat:level])\<br />
\<br />
## Beispiel für die Farbskaliereung von 0 bis 100 % mit der obigen Funktion bat_icon\<br />
4|bat_icon(0)|bat_icon(10)|bat_icon(20)|bat_icon(30)|bat_icon(40)|bat_icon(50)|bat_icon(60)|bat_icon(70)|bat_icon(80)|bat_icon(90)|bat_icon(100)\<br />
\<br />
## Beispiel für die Farbskaliereung von 0 bis 100 % mit der obigen Funktion bat_icon2\<br />
5|bat_icon2(0)|bat_icon2(10)|bat_icon2(20)|bat_icon2(30)|bat_icon2(40)|bat_icon2(50)|bat_icon2(60)|bat_icon2(70)|bat_icon2(80)|bat_icon2(90)|bat_icon2(100)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable DOIF hsv.png|mini|ohne]]<br />
<br />
== Eine for-Schleife mit Hilfe des '''FOR'''-Befehls ==<br />
Mit Hilfe des '''FOR'''-Befehls können über eine Schleife aus einer Liste mit Elementen mehrere Tabellenzellen definiert werden. Die Elementenliste (Array) kann über eine Funktion bestimmt werden. Auf diese Weise kann z. B. eine Tabelle für mehrere Geräte einfach definiert werden.<br />
{{Randnotiz|RNText='''FOR-Befehl'''<br />
* Der FOR-Befehl entspricht einer foreach-Schleife in Perl<br />
* Syntax: '''FOR (<Array>,<Zellendefinitionen>)'''<br>'''<Array>''' eine gültige Angabe eines Arrays oder eine Perlfunktion, die ein Array liefert<br>'''<Zellendefinitionen>''' Definition einer oder mehrerer Zellen, die Angabe $_ wird durch das jeweilige Element des Arrays ersetzt<br />
*'''nützliche Links'''<br />
**{{Link2CmdRef|Anker=DOIF_aggregation|Lang=de|Label=DOIF Aggregationsfunktionen mit Perlfunktion AggrDoIf}}<br />
**[[DevelopmentModuleAPI#devspec2array|devspec2array]]<br />
}}<br />
'''<big>Beispieldefinitionen</big>'''<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Temperaturen aller Geräte, die mit 'T' beginnen und ein Reading 'temperature' haben, sollen in einer Tabelle visualisiert werden\<br />
FOR(::AggrDoIf('@','^T_','temperature'),"$_"|temp([$_:temperature:d2]))<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-temperature.png|200px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Anzeige des Batteriestatus aller Geräte, bei denen das Wort 'Fenster' vorkommt, die das Readings 'battery' haben\ <br />
FOR(::AggrDoIf('@','Fenster','battery'),"$_"|bat([$_:battery]))<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-battery.png|200px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Anzeige des Status aller Geräte im System vom Typ 'HMS'\<br />
FOR(::devspec2array("TYPE=HMS"),"$_"|[$_])<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-HMS.png|300px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Elemente einer kommagetrennten Liste sollen jeweils in einer Tabellenzelle in einer Tabellenzeile angezeigt werden\<br />
FOR(split(",","Mo,Di,Mi,Do,Fr,Sa,So"),ui_Table::style("$_","Darkorange")|)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-split.png|300px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## Durch Leerzeichen getrennte Zeichenketten sollen jeweils in einer Tabellenzelle in einer Tabellenzeile angezeigt werden\<br />
FOR(qw/Montag Dienstag Mittwoch Donnerstag Freitag/,"$_"|)<br />
</syntaxhighlight><br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR-qw.png|300px|ohne]]<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_for DOIF ##<br />
attr di_for uiTable \<br />
## das Templates TPL_raum, soll vier mal aufgerufen werden: TPL_raum(1), TPL_raum(2)...\<br />
## das Templates TPL_raum muss vorher definiert worden sein\<br />
FOR(1..4,TPL_raum($_))<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable-FOR TPL raum.png|600px|ohne]]<br />
<br />
== '''Anwendungsbeispiele''' ==<br />
=== '' Visualisierung und Steuerung von '''Rollläden''''' ===<br />
Im folgenden Beispiel werden Rollläden morgens hochgefahren, ebenso wird die Position aller Rollläden visualisiert. Durch Anklicken eines Icons wird der Rollladen auf die entsprechende Position bewegt. <br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* {{Link2CmdRef|Anker=DOIF_Zeitsteuerung_mit_Zeitintervallen|Lang=de|Label=Zeitsteuerung}}<br />
* uiTable-Funktion [[DOIF/uiTable Schnelleinstieg#Rollladen: Visualisierung und Steuerung mit Hilfe der Funktion shutter|shutter]]<br />
* uiTable-Funktion [[DOIF/uiTable Schnelleinstieg#Textformatierungen mit Hilfe der Funktion style|style]]<br />
* [[DOIF/uiTable Schnelleinstieg#uiTable-Templates|Templates]]<br />
}}<br />
<syntaxhighlight lang="perl"><br />
defmod DI_Rollladen DOIF (([Dunkelheit] eq "off" and [06:25-09:00|8]) or [09:00|7]) \<br />
((set R_W_S,R_W_W[1-3] on)) ## Hochfahren der Rollläden im Erdgeschoss morgens\<br />
DOELSEIF ([Dunkelheit] eq "on")<br />
attr DI_Rollladen cmdState oben|unten<br />
attr DI_Rollladen devStateIcon unten:status_night oben:scene_day<br />
attr DI_Rollladen icon fts_shutter_automatic<br />
attr DI_Rollladen uiTable {\<br />
package ui_Table;;\<br />
}\<br />
\<br />
## Template für ein Fenster\<br />
DEF TPL_shutter("$1"|shutter([$1:pct]))\<br />
\<br />
## Tabellendefinition\<br />
\<br />
style("Dachgeschoss","Darkorange")|""\<br />
TPL_shutter(R_Dachboden)\<br />
style("erstes Geschoss","Darkorange")|""\<br />
TPL_shutter(R_Bad)\<br />
TPL_shutter(R_Kinderzimmer1_O)\<br />
TPL_shutter(R_Kinderzimmer1_S)\<br />
TPL_shutter(R_Kinderzimmer2_S)\<br />
TPL_shutter(R_Kinderzimmer2_W1)\<br />
TPL_shutter(R_Kinderzimmer2_W2)\<br />
style("Erdgeschoss","Darkorange")|""\<br />
TPL_shutter(R_Kueche)\<br />
TPL_shutter(R_W_S)\<br />
TPL_shutter(R_W_W1)\<br />
TPL_shutter(R_W_W2)\<br />
TPL_shutter(R_W_W3)\<br />
style("Keller","Darkorange")|""\<br />
TPL_shutter(R_Keller)\<br />
</syntaxhighlight><br />
''Ergebnis des Anwendungsbeispiels in der Webansicht:''<br />
[[Datei:UiTable Rollladen.png|mini|ohne]]<br />
<br />
=== ''Anzahl der Tage bis zur '''Abfall-Entsorgung''''' ===<br />
Mit Hilfe des Kalender-Moduls werden die verbleibenden Tage bis zur Abfall-Entsorgung der jeweiligen Tonne berechnet und mit Hilfe von uiTable visualisiert. Wenn der Tag der Entsorgung bevorsteht, wird er farbig gekennzeichnet. Vorausgesetzt wird die Definition des Kalenders namens 'cal' mit Hilfe des Moduls [[Calendar]]. Dieser muss die Termine der Abfallentsorgung der Tonnen beinhalten. Im Beispiel wird nach Stichwörtern: "Altpapier", "Restmüll", "Bio", "Gelber" und "Grünschnitt" im Kalender gesucht. <br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* FHEM-Modul [[Calendar]]<br />
* ui_Table Funktion [[DOIF/uiTable Schnelleinstieg#Icon-Darstellung mit Text mit Hilfe der Funktion icon_label|icon_label]]<br />
}}<br />
<syntaxhighlight lang="perl"><br />
defmod Abfall DOIF subs {\<br />
## Die Funktion 'days' sucht nach dem Ereignis $event im Kalender und berechnet die Anzahl der verbleibenden Tage und legt sie im entsprechendem Reading $reading des DOIF-Moduls ab\<br />
sub days \<br />
{\<br />
my ($event,$reading)=@_;;\<br />
set_Reading($reading,fhem('get cal events timeFormat:"%j" filter:field(summary)=~"'.$event.'" limit:count=1,from=0 format:custom="$T1"')-::strftime ('%j', localtime()),1)\<br />
}\<br />
## Die Funktion 'update' bestimmt die verbleibenden Tage mit Hilfe der obigen Funktion 'days' für die jeweiligen Tonnen\<br />
sub update\<br />
{\<br />
days("Altpapier","altpapier");;days("Restmüll","restmuell");;days("Bio","bio");;days("Gelber","gelbe_tonne");;days("Grünschnitt","gruenschnitt");;\<br />
}\<br />
}\<br />
## Beim Start, um 02:00 Uhr und 08:00 Uhr wird zeitverzögert die obige Funktion 'update' aufgerufen\<br />
init {[02:00];;[08:00];;set_Exec("Timer",60,'update()');;\<br />
}<br />
attr Abfall uiTable {\<br />
package ui_Table;;\<br />
$TC{0..4}="align='center'";;\<br />
$SHOWNOSTATE=1;;\<br />
\<br />
## die Funktion 'ic' benutzt die Funktion 'icon_label' für die Darstellung des Icons, abhängig von der Anzahl der Tage wird die Anzahl in grün bzw. rot eingefärbt \<br />
sub ic\<br />
{\<br />
my ($icon,$days)=@_;;\<br />
icon_label($icon,$days,"white",$days > 1 ? "green":"red")\<br />
}\<br />
}\<br />
## Tabellendefinition, die einzelnen Tonnen werden mit Hilfe der obigen Funkton 'ic' dargestellt\<br />
\<br />
ic ("Abfalltonne-Recycling-Logo\@yellow",[$SELF:gelbe_tonne])|\<br />
ic ("Abfalltonne-Recycling-Logo\@blue",[$SELF:altpapier])|\<br />
ic ("Abfalltonne\@gray",[$SELF:restmuell])|\<br />
ic ("Abfalltonne-Recycling-Logo\@green",[$SELF:bio])|\<br />
ic ("Gartenabfall\@green",[$SELF:gruenschnitt])<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Anwendungsbeispiel Abfall.png|mini|ohne]]<br />
<br />
=== ''Visualisierung: '''offene Fenster''''' ===<br />
Alle offenen Fenster werden aufgelistet und mit entsprechendem Icon visualisiert.<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* Attribut {{Link2CmdRef|Anker=DOIF_DOIF_Readings|Lang=de|Label=DOIF_Readings}}<br />
* DOIF-{{Link2CmdRef|Anker=DOIF_aggregation|Lang=de|Label=Aggregationsfunktionen}}<br />
* uiTable-Funktion [[DOIF/uiTable Schnelleinstieg#Icon-Darstellung mit Hilfe der Funktion icon|icon]]<br />
}}<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_windows DOIF ## Visualisierung offener Fenster, Fenster-Devices enden mit "Fenster" im Namen<br />
attr di_uiTable_windows DOIF_Readings windows:[@as(<br>)"Fenster$":state:"open","keine"]<br />
attr di_uiTable_windows uiTable {package ui_Table;;}\<br />
icon([$SELF:windows],"fts_window_1w_open\@DarkOrange","fts_window_1w",".*","keine")|[$SELF:windows]<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable windows closed.png|mini|ohne]]<br />
[[Datei:UiTable windows open.png|mini|ohne]]<br />
<br />
=== ''Visualisierung: '''aktuelle Wetterlage''''' ===<br />
Regenrader animiert, aktuelle Temperatur und Feuchte vom Sensor, aktuelle Wetterlage sowie Wettervorhersage der nächsten Tage. Über entsprechende Weblinks werden Bilder aus dem WWW in der Tabelle visualisiert. Im Gegensatz zu lokalen Sensoren, muss für die Aktualisierung der WWW-Elemente in der jeweiligen Webinstanz (FHEMWEB) das refresh-Attribut gesetzt werden. <br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* DWD [https://www.dwd.de/DE/Home/home_node.html Homepage]<br />
* Regenradar [https://www.dwd.de/DE/wetter/wetterundklima_vorort/_node.html Radarfilm BRD]<br />
* aktuelles Wetter [https://www.dwd.de/DE/wetter/wetterundklima_vorort/nordrhein-westfalen/nrw_node.html NRW]<br />
* Wetteronline [https://www.wetteronline.de/wetter-widget eignes Widget]<br />
* <br />
}}<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_uiTable_wetter DOIF ##<br />
attr di_uiTable_wetter uiTable {\<br />
package ui_Table;;\<br />
$TC{1}="align='center'";;\<br />
}\<br />
## das Attribut 'refresh' der Webinstanz für ein Wandtablet wurde auf 900 gesetzt, damit die Bilder alle 15 Minuten aktualisiert werden \<br />
## Tabellendefinition\<br />
\<br />
## Regenradar BRD\<br />
'<img src="https://www.dwd.de/DWD/wetter/radar/radfilm_brd_akt.gif" height="365px" width="365px">'|\<br />
\<br />
## Aktuelle Temperatur und Feuchtigkeit vom lokalen sensor\<br />
temp([Aussensensor:temperature],40),hum ([Aussensensor:humidity],30),\<br />
\<br />
## aktuelle Wetterlage NRW\<br />
"<img src ='https://www.dwd.de/DE/wetter/wetterundklima_vorort/nordrhein-westfalen/_functions/bildgalerie/wetter_aktuell.jpg?view=nasImage&nn=561200' height='255px' width='255px'>"|\<br />
\<br />
## Wettervorhersage\<br />
"<iframe marginheight='0' marginwidth='0' scrolling='no' width='300' height='365' name='FC3' style='border:1px solid;;border-color:#00537f;;' src='https://api.wetteronline.de/wetterwidget?gid=x0677&modeid=FC3&seourl=juelich&locationname=Jülich&lang=de'></iframe>"\<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable wetter.png|600px|links]]<br />
<br clear="all"><br />
<br />
=== ''Visualisierung: '''Wetterstation''''' ===<br />
Die vorgestellte Lösung funktioniert ohne Anmeldung beim Wetterdienst und ohne Nutzung von API.<br />
Über den Wetterdienst: https://www.wunderground.com/ werden sehr viele private Wifi-Wetterstationen eingebunden. Das kann man sich zunutze machen, indem man zunächst in seiner Umgebung nach Wetterstationen des Dienstes sucht - oft findet man im Umkreis von wenigen Kilometern schon einige Stationen, die rege Wetterdaten liefern. Danach definiert man über HTTPMOD seine Station und visualisiert diese anschließend.<br />
<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* Wunderground [https://wunderground.com/ Homepage]<br />
* svg-Funktion [https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card card]<br />
* svg-Funktionen [https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#icon_ring-Funktionen icon_ring]<br />
}}<br />
Definition einer Station in der Nachbarschaft. <StationsID> muss gegen die korrekte Stationsnummer ersetzt werden.<br />
<syntaxhighlight lang="perl"><br />
defmod Wetter HTTPMOD https://www.wunderground.com/dashboard/pws/<StationsID><br />
attr Wetter enableControlSet 1<br />
attr Wetter reading01Name Wind<br />
attr Wetter reading01Regex wu-unit .{109}>(\d+\.\d)<br />
attr Wetter reading02Name Windboeen<br />
attr Wetter reading02Regex wu-unit-speed .{109}>(\d+\.\d)<br />
attr Wetter reading03Name Windrichtung<br />
attr Wetter reading03Regex (\d+)deg\).{84}Wind-Marker<br />
attr Wetter reading04Name Regen<br />
attr Wetter reading04Regex wu-unit-rainRate .{109}>(\d+\.\d\d)<br />
attr Wetter reading05Name RegenGesamt<br />
attr Wetter reading05Regex wu-unit-rain .{109}>(\d+\.\d\d)<br />
attr Wetter reading06Name Temperatur<br />
attr Wetter reading06Regex wu-unit-temperature .{127}>(\d+.\d)<br />
attr Wetter reading07Name Feuchtigkeit<br />
attr Wetter reading07Regex wu-unit-humidity .{109}>(\d\d)<br />
attr Wetter reading08Name UV<br />
attr Wetter reading08Regex UV<.{268}>(\d)<br />
attr Wetter reading09Name Luftdruck<br />
attr Wetter reading09Regex PRESSURE<.{285}>(\d+.\d+)<br />
attr Wetter reading10Name TemperaturGefuehlt<br />
attr Wetter reading10Regex wu-unit is-degree-visible .{109}>(\d+.\d)<br />
attr Wetter reading11Name TaupunktTemp<br />
attr Wetter reading11Regex DEWPOINT.{306}>(\d+.\d)<br />
attr Wetter reading12Name Sonnenstrahlung<br />
attr Wetter reading12Regex Solar radiation<.{549}>(\d+.\d+)<br />
attr Wetter timeout 10<br />
attr Wetter userReadings WindKm {sprintf("%1.1f",ReadingsVal($name,"Wind",0)*1.60934)},\<br />
WindboeenKm {sprintf("%1.1f",ReadingsVal($name,"Windboeen",0)*1.60934)},\<br />
WindrichtungGrad {ReadingsVal($name,"Windrichtung",0)-180},\<br />
RegenMm {ReadingsVal($name,"Regen",0)*25.4},\<br />
RegenGesamtMm {ReadingsVal($name,"RegenGesamt",0)*25.4},\<br />
TemperaturC {sprintf("%1.1f",(ReadingsVal($name,"Temperatur",0)-32)*5/9)},\<br />
TaupunktTempC {sprintf("%1.1f",(ReadingsVal($name,"TaupunktTemp",0)-32)*5/9)},\<br />
LuftdruckHpa {sprintf("%d",ReadingsVal($name,"Luftdruck",0)*33.8639)},\<br />
TemperaturGefuehltC {sprintf("%1.1f",(ReadingsVal($name,"TemperaturGefuehlt",0)-32)*5/9)}<br />
</syntaxhighlight><br />
<br />
Nun erfolgt die Visualisierung der Daten.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_Wetter_ring DOIF ##<br />
attr di_Wetter_ring uiTable {package ui_Table;;}\<br />
\<br />
icon_temp_hum_ring("temp_outside",[Wetter:TemperaturC],[Wetter:Feuchtigkeit],undef,undef,150)|\<br />
icon_temp_ring ("temp_windchill",[Wetter:TemperaturGefuehltC],undef,undef,150) |\<br />
icon_temp_ring ("temperature_humidity",[Wetter:TaupunktTempC],undef,undef,150) |\<br />
icon_ring2([Wetter:WindKm] > 0 ? "wind".",1,0,0,".[Wetter:WindrichtungGrad]:"no_wind",[Wetter:WindKm],0,50,120,0,"km/h",150,undef,1,[Wetter:WindboeenKm],0,50,120,0,"km/h",undef,1) |\<br />
icon_ring2("weather_rain_gauge",[Wetter:RegenMm],0,10,180,270,"mm/h",150,undef,1,[Wetter:RegenGesamtMm],0,50,180,270,"mm",undef,1)|\<br />
icon_ring2("sani_solar",[Wetter:UV],0,10,100,30,"UV",150,undef,0,[Wetter:Sonnenstrahlung],0,1000,100,30,"Watt/m²",undef,0)|\<br />
icon_ring ("weather_barometric_pressure",[Wetter:LuftdruckHpa],980,1047,0,120,"hPa",0,150)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable ringwetter.png|600px|links]]<br />
<br clear="all"><br />
<br />
Hier ein Beispiel der Visualisierung mit Verlauf der letzten drei Tage mit Hilfe der svg-Funktion '''card''':<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_Wetter DOIF ##<br />
attr di_Wetter icon weather_wind<br />
attr di_Wetter uiTable {package ui_Table;;}\<br />
## card ($collect,$header,$icon,$min,$max,$minColor,$maxColor,$unit,$func,$decfont,$size,$model,$lightness)\<br />
\<br />
card([Wetter:TemperaturC:col3d],"Außentemperatur","temp_outside",-10,60,undef,undef,"°C",\&temp_hue)|\<br />
card([Wetter:TemperaturGefuehltC:col3d],"gefühlte Temperatur","temp_windchill",-10,60,undef,undef,"°C",\&temp_hue)|\<br />
card([Wetter:TaupunktTempC:col3d],"Taupunkttemperatur","temperature_humidity",-10,60,undef,undef,"°C",\&temp_hue)|\<br />
card([Wetter:Feuchtigkeit:col3d],"Außenfeuchtigkeit","temperature_humidity",0,100,undef,undef,"%",\&hum_hue)|\<br />
card([Wetter:WindKm:col3d],"Wind",[Wetter:WindKm] > 0 ? "wind".",1,0,0,".[Wetter:WindrichtungGrad]:"no_wind",0,30,90,30,"km/h",undef,1)\<br />
card([Wetter:WindboeenKm:col3d],"Windböen","weather_wind",0,30,90,30,"km/h",undef,1)|\<br />
card([Wetter:RegenMm:col3d],"Regen","weather_rain_gauge",0,10,180,270,"mm/h")|\<br />
card([Wetter:RegenGesamtMm:col3d],"Regengesamt","weather_rain_gauge",0,50,180,270,"mm")|\<br />
##card([Wetter:UV:col3d],"UV-Strahlung","sani_solar",0,7,100,30,"UV",undef,0)|\<br />
card([Wetter:Sonnenstrahlung:col3d],"Sonnenstrahlung","sani_solar",0,1000,30,90,"Watt/m²",undef,0)|\<br />
card([Wetter:LuftdruckHpa:col3d],"Luftdruck","weather_barometric_pressure",980,1047,30,90,"hPa",undef,0)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable svgwetter.png|600px|links]]<br />
<br clear="all"><br />
<br />
Ohne Angabe der Überschrift (undef für $header setzen) lässt sich eine kompaktere Darstellung erzielen:<br />
<br />
[[Datei:UiTable svgwetteroh.png|600px|links]]<br />
<br />
<br clear="all"><br />
<br />
=== ''Visualisierung: '''aktueller Spritpreis''''' ===<br />
Der aktuelle Spritpreis einer Tankstelle wird ermittelt und mit seinem zeitlichen Verlauf visualisiert.<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#ring-Funktionen|ring]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card|card]]<br />
* Tankstelle bestimmen [https://www.clever-tanken.de/ Clever tanken]<br />
* Modul [[HTTPMOD]]<br />
}}<br />
<br />
Zunächst wird ein HTTPMOD-Modul für den aktuellen Spritpreis definiert, dabei ist <Stations-ID> durch die ID der Tankstelle zu ersetzen.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod Tankstelle HTTPMOD http://www.clever-tanken.de/tankstelle_details/<Stations-ID> 300<br />
attr Tankstelle devStateIcon {ui_Table::ring(ReadingsVal("$name","Diesel",0),1.00,1.40,120,0,"Diesel",90,undef,2)." ".ui_Table::ring(ReadingsVal("$name","SuperE5",0),1.10,1.60,120,0,"E5",90,undef,2)}<br />
attr Tankstelle enableControlSet 1<br />
attr Tankstelle event-on-change-reading .*<br />
attr Tankstelle group Spritpreise<br />
attr Tankstelle reading01Name Diesel<br />
attr Tankstelle reading01Regex "current-price-1">(\d.\d{2})<br />
attr Tankstelle reading02Name SuperE5<br />
attr Tankstelle reading02Regex "current-price-2">(\d.\d{2})<br />
attr Tankstelle room Spritpreise<br />
attr Tankstelle timeout 10<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Di uiTable Tankstelle.png|ohne|mini]]<br />
<br />
Visualisierung der Preisentwicklung der letzten 24 Stunden: <br />
<br />
<syntaxhighlight lang="perl"><br />
defmod sprit DOIF ##<br />
attr sprit uiTable {package ui_Table;;}\<br />
card([Tankstelle:Diesel:col24],"Diesel","fuel","1.00","1.40",120,0,"Diesel €",undef,"2",",,1")\<br />
card([Tankstelle:SuperE5:col24],"Super E5","fuel","1.10","1.60",120,0,"Super €",undef,"2",",,1")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Di uiTable sprit.png|ohne|mini]]<br />
<br />
=== ''Visualisierung: '''aktuelle Corona-7-Tage-Inzidenz''''' ===<br />
Die aktuellen Inzidenzwerte werden vom RKI ausgelesen und deren Verlauf visualisiert.<br />
<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#ring-Funktionen|ring]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card|card]]<br />
* Modul [[JsonMod]]<br />
}}<br />
<br />
Zunächst wird ein JsonMod Device für das Auslesen der Inzidenzzahlen definiert. Die gewünschten Regionen müssen für eigene Bedürfnisse angepasst werden.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod RKI7 JsonMod https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=last_update,cases7_per_100k,BEZ,BEM,GEN,BL,county&returnGeometry=false&outSR=4326&f=json<br />
attr RKI7 readingList multi(jsonPath("\$.features[?(\@.attributes.GEN in ['Städteregion Aachen', 'Düren', 'Heinsberg'])]"), property('attributes.GEN'), sprintf('%.1f', property('attributes.cases7_per_100k')));;<br />
</syntaxhighlight><br />
<br />
Visualisierung der Inzidenzzahlen der letzten sieben Tage: <br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_corona DOIF ##<br />
attr di_corona uiTable {package ui_Table}\<br />
card([RKI7:Duren:col1w],"Düren","coronavirus",0,200,120,0,"Fälle")|\<br />
card([RKI7:Heinsberg:col1w],"Heinsberg","coronavirus",0,200,120,0,"Fälle")|\<br />
card([RKI7:Stadteregion_Aachen:col1w],"Aachen","coronavirus",0,200,120,0,"Fälle")<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:uiTable_Inzidenz.png|600px|links]]<br />
<br />
<br clear="all"><br />
<br />
=== '' Visualisierung und Steuerung: '''Heiztherme''''' ===<br />
Im folgenden Beispiel wurde eine Heiztherme über einen ebus-Adapter in FHEM eingebunden. Die Heizungsdaten werden über MQTT ausgelesen und anschließend visualisiert. Die vorgestellten Visualisierungsbeispiele können ebenso im funktionslosen DOIF mit Hilfe des uiTable-Attriutes auf bereits existierende Readings des eigenen Systems angewendet werden. <br />
<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#icon_ring-Funktionen|icon_ring]]<br />
* svg-Funktion [[DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card|card]]<br />
* Commandref [https://fhem.de/commandref_DE.html#DOIF_Perl_Modus DOIF Perl-Modus]<br />
* ebus-Adapter [https://ebusd.de/ ebusd]<br />
* ebus-Wiki [[EBUS|ebus]]<br />
}}<br />
<br />
Definition eines MQTT2-Devices für die Kommunikation mit der Therme über einen ebus-Adapter.<br />
<br />
Im diesem Fall wurde eine Vaillanttherme eingebunden, die meisten Readings wurden automatisch vom MQTT2-Server angelegt. Die Anbindung ist gerätespezifisch und unterscheidet sich je nach Gerättyp.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod vaillant MQTT2_DEVICE ebusd_bai<br />
attr vaillant IODev MQTT2_FHEM_Server<br />
attr vaillant devStateStyle style="text-align:left"<br />
attr vaillant event-on-change-reading .*<br />
attr vaillant group Ebus<br />
attr vaillant icon sani_boiler_temp<br />
attr vaillant jsonMap Status01_0_value:Vorlauf Status01_0_name:0\<br />
Status01_1_value:Ruecklauf Status01_1_name:0\<br />
Status01_2_value:Aussentemp Status01_2_name:0\<br />
Status01_3_value:Warmwasser Status01_3_name:0\<br />
Status01_4_value:WWSpeicher Status01_4_name:0\<br />
Status01_5_value:Pumpenstatus Status01_5_name:0\<br />
Flame_0_value:Flame Flame_0_name:0\<br />
Storageloadpump_percent0_value:Storageloadpump\<br />
FlowTempDesired_temp_value:VorlaufSoll\<br />
Hc1HeatCurve_0_value:HeizKennlinie Hc1HeatCurve_0_name:0\<br />
HolidayEndPeriod_hto_value:FerienEnde\<br />
HolidayStartPeriod_hfrom_value:FerienBeginn\<br />
PumpPower_0_value:PumpenLeistung PumpPower_0_name:0\<br />
PrimaryCircuitFlowrate_uin100_value:Umlaufmenge\<br />
z1DayTemp_tempv_value:TagSolltemp\<br />
z1NightTemp_tempv_value:NachtSolltemp\<br />
FanSpeed_0_value:LuefterDrehzahl FanSpeed_0_name:0\<br />
WaterPressure_pressv_value:Wasserdruck\<br />
z1OpMode_opmode_value:Heizmodus<br />
attr vaillant model eBus_bai_jsonmap<br />
attr vaillant readingList ebusd/bai/PumpHours:.* { json2nameValue($EVENT, 'PumpHours_', $JSONMAP) }\<br />
ebusd/bai/WPPostrunTime:.* { json2nameValue($EVENT, 'WPPostrunTime_', $JSONMAP) }\<br />
ebusd/bai/PowerValue:.* { json2nameValue($EVENT, 'PowerValue_', $JSONMAP) }\<br />
ebusd/bai/StorageExitTemp:.* { json2nameValue($EVENT, 'StorageExitTemp_', $JSONMAP) }\<br />
ebusd/global/version:.* version\<br />
ebusd/global/running:.* running\<br />
ebusd/scan\x5c\x2e08/:.* { json2nameValue($EVENT, 'scan.08_', $JSONMAP) }\<br />
ebusd/scan\x5c\x2e08/id:.* { json2nameValue($EVENT, 'id_', $JSONMAP) }\<br />
ebusd/global/uptime:.* uptime\<br />
ebusd/global/signal:.* signal\<br />
ebusd/scan\x5c\x2e15/:.* { json2nameValue($EVENT, 'scan.15_', $JSONMAP) }\<br />
ebusd/scan\x5c\x2e15/id:.* { json2nameValue($EVENT, 'id_', $JSONMAP) }\<br />
ebusd/bai/FanSpeed:.* { json2nameValue($EVENT, 'FanSpeed_', $JSONMAP) }\<br />
ebusd/bai/PumpPower:.* { json2nameValue($EVENT, 'PumpPower_', $JSONMAP) }\<br />
ebusd/broadcast/vdatetime:.* { json2nameValue($EVENT, 'vdatetime_', $JSONMAP) }\<br />
ebusd/broadcast/outsidetemp:.* { json2nameValue($EVENT, 'outsidetemp_', $JSONMAP) }\<br />
ebusd/bai/DateTime:.* { json2nameValue($EVENT, 'DateTime_', $JSONMAP) }\<br />
ebusd/global/updatecheck:.* updatecheck\<br />
ebusd/bai/DCFTimeDate:.* { json2nameValue($EVENT, 'DCFTimeDate_', $JSONMAP) }\<br />
ebusd/bai/PumpPowerDesired:.* { json2nameValue($EVENT, 'PumpPowerDesired_', $JSONMAP) }\<br />
ebusd/bai/HwcImpellorSwitch:.* { json2nameValue($EVENT, 'HwcImpellorSwitch_', $JSONMAP) }\<br />
ebusd/bai/ReturnTemp:.* { json2nameValue($EVENT, 'ReturnTemp_', $JSONMAP) }\<br />
ebusd/700/HwcStorageTempBottom:.* { json2nameValue($EVENT, 'HwcStorageTempBottom_', $JSONMAP) }\<br />
ebusd/700/HwcTempDesired:.* { json2nameValue($EVENT, 'HwcTempDesired_', $JSONMAP) }\<br />
ebusd/bai/FanPWMSum:.* { json2nameValue($EVENT, 'FanPWMSum_', $JSONMAP) }\<br />
ebusd/bai/HcHours:.* { json2nameValue($EVENT, 'HcHours_', $JSONMAP) }\<br />
ebusd/bai/HoursTillService:.* { json2nameValue($EVENT, 'HoursTillService_', $JSONMAP) }\<br />
ebusd/bai/PumpHwcFlowNumber:.* { json2nameValue($EVENT, 'PumpHwcFlowNumber_', $JSONMAP) }\<br />
ebusd/bai/WP:.* { json2nameValue($EVENT, 'WP_', $JSONMAP) }\<br />
ebusd/700/WaterPressure:.* { json2nameValue($EVENT, 'WaterPressure_', $JSONMAP) }\<br />
ebusd/bai/PrimaryCircuitFlowrate:.* { json2nameValue($EVENT, 'PrimaryCircuitFlowrate_', $JSONMAP) }\<br />
ebusd/bai/Flame:.* { json2nameValue($EVENT, 'Flame_', $JSONMAP) }\<br />
ebusd/bai/Storageloadpump:.* { json2nameValue($EVENT, 'Storageloadpump_', $JSONMAP) }\<br />
ebusd/bai/Status01:.* { json2nameValue($EVENT, 'Status01_', $JSONMAP) }\<br />
ebusd/bai/FlowTempDesired:.* { json2nameValue($EVENT, 'FlowTempDesired_', $JSONMAP) }\<br />
ebusd/700/FrostOverRideTime:.* { json2nameValue($EVENT, 'FrostOverRideTime_', $JSONMAP) }\<br />
ebusd/700/Hc1ActualFlowTempDesired:.* { json2nameValue($EVENT, 'Hc1ActualFlowTempDesired_', $JSONMAP) }\<br />
ebusd/700/Hc1AutoOffMode:.* { json2nameValue($EVENT, 'Hc1AutoOffMode_', $JSONMAP) }\<br />
ebusd/700/Hc1CircuitType:.* { json2nameValue($EVENT, 'Hc1CircuitType_', $JSONMAP) }\<br />
ebusd/700/Hc1HeatCurve:.* { json2nameValue($EVENT, 'Hc1HeatCurve_', $JSONMAP) }\<br />
ebusd/700/HcStorageTempBottom:.* { json2nameValue($EVENT, 'HcStorageTempBottom_', $JSONMAP) }\<br />
ebusd/700/HcStorageTempTop:.* { json2nameValue($EVENT, 'HcStorageTempTop_', $JSONMAP) }\<br />
ebusd/700/HolidayTemp:.* { json2nameValue($EVENT, 'HolidayTemp_', $JSONMAP) }\<br />
ebusd/700/OpMode:.* { json2nameValue($EVENT, 'OpMode_', $JSONMAP) }\<br />
ebusd/700/z1RoomTemp:.* { json2nameValue($EVENT, 'z1RoomTemp_', $JSONMAP) }\<br />
ebusd/700/z1SFMode:.* { json2nameValue($EVENT, 'z1SFMode_', $JSONMAP) }\<br />
ebusd/700/z1OpMode:.* { json2nameValue($EVENT, 'z1OpMode_', $JSONMAP) }\<br />
ebusd/700/Time:.* { json2nameValue($EVENT, 'Time_', $JSONMAP) }\<br />
ebusd/bai/EbusVoltage:.* { json2nameValue($EVENT, 'EbusVoltage_', $JSONMAP) }\<br />
ebusd/bai/extWP:.* { json2nameValue($EVENT, 'extWP_', $JSONMAP) }\<br />
ebusd/bai/FanStarts:.* { json2nameValue($EVENT, 'FanStarts_', $JSONMAP) }\<br />
ebusd/700/z1NightTemp:.* { json2nameValue($EVENT, 'z1NightTemp_', $JSONMAP) }\<br />
ebusd/700/z1DayTemp:.* { json2nameValue($EVENT, 'z1DayTemp_', $JSONMAP) }\<br />
ebusd/700/HolidayStartPeriod:.* { json2nameValue($EVENT, 'HolidayStartPeriod_', $JSONMAP) }\<br />
ebusd/700/HolidayEndPeriod:.* { json2nameValue($EVENT, 'HolidayEndPeriod_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Monday:.* { json2nameValue($EVENT, 'z1Timer.Monday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Tuesday:.* { json2nameValue($EVENT, 'z1Timer.Tuesday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Wednesday:.* { json2nameValue($EVENT, 'z1Timer.Wednesday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Thursday:.* { json2nameValue($EVENT, 'z1Timer.Thursday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Friday:.* { json2nameValue($EVENT, 'z1Timer.Friday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Sunday:.* { json2nameValue($EVENT, 'z1Timer.Sunday_', $JSONMAP) }\<br />
ebusd/700/z1Timer.Saturday:.* { json2nameValue($EVENT, 'z1Timer.Saturday_', $JSONMAP) }\<br />
ebusd/bai/PrEnergyCountHc1:.* { json2nameValue($EVENT, 'PrEnergyCountHc1_', $JSONMAP) }\<br />
ebusd/bai/PrEnergyCountHwc1:.* { json2nameValue($EVENT, 'PrEnergyCountHwc1_', $JSONMAP) }\<br />
ebusd/bai/PrEnergySumHc1:.* { json2nameValue($EVENT, 'PrEnergySumHc1_', $JSONMAP) }\<br />
ebusd/bai/PrEnergySumHwc1:.* { json2nameValue($EVENT, 'PrEnergySumHwc1_', $JSONMAP) }\<br />
ebusd/bai/FanHours:.* { json2nameValue($EVENT, 'FanHours_', $JSONMAP) }\<br />
ebusd/bai/HcHours:.* { json2nameValue($EVENT, 'HcHours_', $JSONMAP) }\<br />
ebusd/bai/HwcHours:.* { json2nameValue($EVENT, 'HwcHours_', $JSONMAP) }\<br />
ebusd/bai/HcStarts:.* { json2nameValue($EVENT, 'HcStarts_', $JSONMAP) }\<br />
ebusd/bai/HwcStarts:.* { json2nameValue($EVENT, 'HwcStarts_', $JSONMAP) }<br />
attr vaillant setList HeizKennlinie:selectnumbers,0,.1,2,1,lin ebusd/700/Hc1HeatCurve/set $EVTPART1\<br />
TagSolltemp:selectnumbers,15,1,25,1,lin ebusd/700/z1DayTemp/set $EVTPART1\<br />
NachtSolltemp:selectnumbers,15,1,25,1,lin ebusd/700/z1NightTemp/set $EVTPART1<br />
</syntaxhighlight><br />
<br />
Definition eines DOIF-Devices zur Steuerung der Therme und Visualisierung der Daten. Es werden Readings und Befehle genutzt, die durch den MQTT2-Server der obigen Definition zur Verfügung gestellt werden. Einzelne Heizungswerte werden in bestimmten Intervallen über den publish-Befehl ausgelesen. Die Temperaturen der Zirkulation, des Vorlaufs und des Rücklaufs werden außerhalb der Therme mit 1-wire-Temperatursensoren über WLAN-ESP-Easy ausgelesen. Die Definition des Layouts über das Attribut uiTable ist unabhängig vom Auslesen der Werte, sie bezieht sich lediglich auf vorhandene Readings, die visualisiert werden sollen. Das Layout kann ebenso auf Readings aus anderen Devices der eigenen FHEM-Umgebung anpasst werden.<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod di_vaillant DOIF ##{[+00:01];;foreach (qw(FanSpeed Flame PumpPower Storageloadpump PrimaryCircuitFlowrate FlowTempDesired PumpHours HcHours HcPumpStarts)) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}}\<br />
\<br />
{[+[1]:01];;foreach (qw(PrEnergySumHc1 PrEnergySumHwc1 HcHours HwcHours z1OpMode WaterPressure z1NightTemp z1DayTemp Hc1HeatCurve HwcLockTime HolidayStartPeriod HolidayEndPeriod)) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}\<br />
}\<br />
\<br />
{[+00:00:30];;foreach (qw(Flame PrimaryCircuitFlowrate)) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}}\<br />
\<br />
{[00:01];;foreach (qw(FanHours HcStarts HwcStarts )) {fhem_set("MQTT2_FHEM_Server publish ebusd/bai/$_/get")}\<br />
set_Reading("gesamt_hc",int([?vaillant:PrEnergySumHc1_0_value]/10000)/10,0);;\<br />
set_Reading("gesamt_hwc",int([?vaillant:PrEnergySumHwc1_0_value]/10000)/10,0);;\<br />
set_Reading("diff_hc",0,1);;\<br />
set_Reading("diff_hwc",0,1);;\<br />
set_Reading("diff_h",0,1)\<br />
}\<br />
\<br />
{if ([00:05|WE]) {fhem_set("MQTT2_FHEM_Server publish ebusd/700/BankHolidayStartPeriod/set $mday.$month.$year");;fhem_set("MQTT2_FHEM_Server publish ebusd/700/BankHolidayEndPeriod/set $mday.$month.$year")}}\<br />
\<br />
Timer {\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Monday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Tuesday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Wednesday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Thursday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Friday/set 04:00;;09:00;;13:00;;22:00;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Sunday/set 05:00;;10:00;;12:00;;22:30;;-:-;;-:-"\<br />
fhem_set "MQTT2_FHEM_Server publish ebusd/700/z1Timer.Saturday/set 05:00;;10:00;;12:00;;22:30;;-:-;;-:-"\<br />
}\<br />
\<br />
diff {\<br />
set_Reading("diff_hc",int(([vaillant:PrEnergySumHc1_0_value]/100000-get_Reading("gesamt_hc",0))*10)/10,1);;\<br />
set_Reading("diff_hwc",int(([vaillant:PrEnergySumHwc1_0_value]/100000-get_Reading("gesamt_hwc",0))*10)/10,1);;\<br />
set_Reading("diff_h",get_Reading("diff_hc")+get_Reading("diff_hwc"),1);;\<br />
}\<br />
\<br />
<br />
attr di_vaillant event-on-change-reading .*<br />
attr di_vaillant room Ebus<br />
attr di_vaillant uiTable {\<br />
package ui_Table;;\<br />
$TABLE='text-align:center;;';;\<br />
$SHOWNODEVICELINE = "test9|Damian";;\<br />
}\<br />
icon_temp_ring("temp_outside",[vaillant:Aussentemp],-15,40,130)|\<br />
icon_temp_mring(([vaillant:Flame] eq "off"?"sani_boiler_temp\@white":"sani_boiler_temp\@Darkorange"),[vaillant:Vorlauf],15,70,130)|\<br />
icon_temp_mring(([vaillant:Pumpenstatus] eq "4" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),[vaillant:WWSpeicher],15,70,130)|\<br />
icon_uring("0,0,1","weather_barometric_pressure",[vaillant:Wasserdruck],0,3,undef,undef,"bar",1,130,[(0.8,0,1,60,1.5,120,1.7,60,3,0)],"50,35")|\<br />
icon_ring("sani_floor_heating_neutral",[vaillant:HcHours_hoursum2_value],0,10000,120,0,"h",0,130)|\<br />
icon_ring("sani_water_tap",[vaillant:HwcHours_hoursum2_value],0,2000,120,0,"h",0,130)|\<br />
\<br />
icon_ring("time_graph",[vaillant:HeizKennlinie],0.4,1,120,0,"HK",1,130)|\<br />
icon_temp_mring("scene_day\@yellow",[vaillant:TagSolltemp],undef,undef,130)|\<br />
icon_temp_mring("scene_night\@#3464eb",[vaillant:NachtSolltemp],undef,undef,130)\<br />
""|""|""|""|""|""|widget([vaillant:HeizKennlinie],"selectnumbers,0.4,.1,1,1,lin","set")|widget([vaillant:TagSolltemp],"selectnumbers,15,1,25,1,lin","set")|widget([vaillant:NachtSolltemp],"selectnumbers,15,1,25,1,lin","set")<\<br />
\<br />
card([vaillant:Aussentemp:col],"Außentemperatur","temp_outside",-15,35,undef,undef,"°C",\&temp_hue)|\<br />
card([vaillant:WWSpeicher:col],"WW-Speicher",([vaillant:Pumpenstatus] eq "4" ? "sani_buffer_temp_down\@Darkorange" : "sani_buffer_temp_down\@white"),15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([ESPEasy_ESP_Temp_Vorlauf:Temperature:col],"Vorlauf",([vaillant:Pumpenstatus] eq "on" ? "sani_floor_heating\@Darkorange" : "sani_floor_heating_neutral\@white"),15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([$SELF:diff_hc:col],"Energie Heizung","sani_floor_heating_neutral",0,100,120,0,"kWh",undef,1)\<br />
card([vaillant:Umlaufmenge:col],"Umlaufmenge","sani_pump",0,20,120,0,"l/min")|\<br />
card([ESPEasy_ESP_Temp_Zirkulation:Temperature:col],"Zirkulation",([Zirk] eq "off"?"sani_pump\@white":"sani_pump\@Darkorange"),15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([ESPEasy_ESP_Temp_Keller_Ruecklauf:Temperature:col],"Rücklauf","sani_floor_heating_neutral\@wite",15,70,undef,undef,"°C",\&temp_hue)|\<br />
card([$SELF:diff_hwc:col],"Energie Warmwasser","sani_water_tap",0,15,120,0,"kWh",undef,1)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:Di uiTable Heizung.png|600px|links]]<br />
<br />
<br clear="all"><br />
<br />
=== ''Visualisierung: '''Anwesenheitsstatus''''' ===<br />
Die aktuelle Anwesenheit von Heimbewohnern wird visualisiert.<br><br><br />
Zunächst wird mit Hilfe des Moduls [[FRITZBOX]] ein Device namens ''FritzBox'' erstellt. Dort werden die eingebuchten Smartphones der Bewohner mit Ihren MAC-Adressen in Readings abgelegt. Die folgende Definition wertet aus, ob die angegebenen MAC-Adressen als Readings vorhanden sind und erstellt für jeden Bewohner ein Reading mit den Zuständen on/off. Diese Readings werden dann über das Attribut uiTable visualisiert. Die anwesenden Personen werden farblich markiert. Die Namen der Personen sowie die MAC-Adressen sind fiktiv und müssen den eigenen Angaben entsprechend angepasst werden.<br />
{{Randnotiz|RNText='''nützliche Links'''<br />
* [[FRITZBOX|FritzBox-Modul]]<br />
* ui_Table Funktion [[DOIF/uiTable Schnelleinstieg#Icon-Darstellung mit Text mit Hilfe der Funktion icon_label|icon_label]]<br />
*[[DOIF/uiTable Schnelleinstieg#uiTable-Templates|uiTable-Templates]]<br />
}}<br />
<br />
<syntaxhighlight lang="perl"><br />
defmod myHome DOIF {\<br />
set_Reading_Begin;;\<br />
set_Reading_Update("Ernie",[FritzBox:mac_12_34_E0_00_CD_E4] ? "on":"off");;\<br />
set_Reading_Update("Bert", [FritzBox:mac_02_08_02_07_30_E3] ? "on":"off");;\<br />
set_Reading_Update("Grobi", [FritzBox:mac_00_08_01_0B_00_E7] ? "on":"off");; \<br />
set_Reading_Update("Kermit", [FritzBox:mac_01_30_A9_72_02_E3] ? "on":"off");; \<br />
set_Reading_End(1);;\<br />
}<br />
attr myHome checkReadingEvent 0<br />
attr myHome uiTable {\<br />
package ui_Table;;\<br />
$SHOWNOSTATE=1;;\<br />
$TC{0..4}="align='center'";;\<br />
}\<br />
## Template-Definition für die Visualisierung eines Bewohners mit Hilfe des Icons fa__508\<br />
DEF TPL_person (icon_label([$SELF:$1] eq "on" ? "fa__508\@DarkOrange":"fa__508","$1","#e67e00","white",-10))\<br />
\<br />
## Darstellung der Bewohner mit Hilfe des obigen Templates\<br />
TPL_person(Ernie)|TPL_person(Bert)|TPL_person(Grobi)|TPL_person(Kermit)<br />
</syntaxhighlight><br />
<br />
''Ergebnis der Beispieldefinition in der Webansicht:''<br />
[[Datei:UiTable myHome.png|ohne|mini]]<br />
<br />
=== Weitere Anwendungsbeispiele zur Automatisierung ===<br />
* siehe [[DOIF/Automatisierung]]<br />
<br />
== Weiterführende Links ==<br />
* Weitere Beispiele für Fortgeschrittene, siehe "[[DOIF/uiTable|uiTable mit FHEM-Widgets und Styles]]"<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Code Snippets]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=HourCounter&diff=37165HourCounter2022-01-28T19:31:15Z<p>Maista: URL nicht mehr erreichbar</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=HourCounter dient zum Zählen von Ereignissen und zur Erfassung von Betriebs-/Ruhe-Zeiten<br />
|ModType=h<br />
<!-- |ModCmdRef=LightScene -- nicht erforderlich, da Modultyp x --><br />
|ModForumArea=MAX<br />
|ModTechName=98_HourCounter.pm<br />
|ModOwner=John ([http://forum.fhem.de/index.php?action=profile;u=806 Forum] / [[Benutzer Diskussion:John|Wiki]])}}<br />
<br />
<br />
[[HourCounter]] ist ein Perl-Modul, das die Anzahl von Ereignissen erfasst. Bei bipolaren Ereignissen wird zusätzlich die Puls- sowie die Pausendauer ermittelt. Im vorliegenden Beispiel wird ein Betriebsstundenzähler mit einem MAX-Fensterkontakt realisiert.<br />
<br />
== Features ==<br />
* Ermittlung von Betriebsstunden, Auslastung, Verbräuchen, Schalthäufigkeiten<br />
* Ermittlung der Häufigkeit, Puls- Pausendauer pro Tag<br />
* Ermittlung der Puls-/Pausendauer der letzten Schaltperiode<br />
* Bereitstellung von Ereignissen zur Fortführung der Kumulation für Tages-, Wochen- und Monatswerte<br />
* unterstützende Funktionen zur Ablage von Tages-, Wochen- und Monatswerten<br />
<br />
== Zielsetzung des WIKI-Artikels ==<br />
Erläuterung der Funktionalität zur weiterführenden Diskussion im {{Link2Forum|Topic=12216|Message=72596|LinkText=Forum}}.<br />
<br />
== Aktuelle Version ==<br />
Das Modul ist seit dem 24.10.2014 Bestandteil von FHEM.<br />
<br />
== Definition ==<br />
=== Abstrakt ===<br />
<pre>define <name> HourCounter <regexp_for_ON> [<regexp_for_Off>]</pre><br />
<br />
<regexp_for_ON> ist ein regulärer Ausdruck der das Ereignis beschreibt.<br />
<br />
Wenn auch [<regexp_for_Off>] definiert ist, so sprechen wir von einem bipolarem Ereignis, das einen <br />
EIN- sowie einen AUS-Zustand aufweist.<br />
<br />
<regexp_for_ON> beschreibt in diesem Fall die positive Flanke,[<regexp_for_Off>] die negative Flanke. Die Struktur des regexp-Ausdruckes ist analog zu jener beim Notify aufgebaut.<br />
<br />
===Konkret===<br />
<pre>define CN.Test HourCounter SHUTTER.JOHN:onoff:.1 SHUTTER.JOHN:onoff:.0</pre><br />
Hier wird der HourCounter CN.TEST definiert.<br />
Ein MAX-Fensterkontakt mit Namen SHUTTER.JOHN wird als Ereignis-Geber verwendet.<br />
Das Reading "onoff" wird als Trigger für unserem Zähler genutzt.<br />
Bei den Fensterkontakten sehen diese Ereignisse wie folgt aus:<br />
<pre><br />
2013-11-15 23:19:12 MAX SHUTTER.JOHN onoff: 1<br />
....<br />
2013-11-15 23:19:24 MAX SHUTTER.JOHN onoff: 0<br />
</pre><br />
<br />
Soll ein Dummy als Ereignis-Geber verwendet werden, lautet die Definition wie folgt:<br />
<pre> define CN.Test HourCounter myDummy:1 myDummy:0</pre><br />
<br />
Die neue Instanz weist folgende Struktur auf:<br />
<br />
<pre><br />
Internals:<br />
CFGFN <br />
DEF SHUTTER.JOHN:onoff:.1 SHUTTER.JOHN:onoff:.0<br />
NAME CN.Test<br />
NR 738<br />
NTFY_ORDER 50-CN.Test<br />
STATE 1<br />
TYPE HourCounter<br />
Readings:<br />
2014-02-04 20:59:22 clearDate 2014-02-04 20:59:22<br />
2014-02-04 20:59:57 countsOverall 1<br />
2014-02-04 20:59:57 countsPerDay 1<br />
2014-02-04 20:59:57 pauseTimeIncrement 35<br />
2014-02-04 20:59:57 pauseTimeOverall 35<br />
2014-02-04 20:59:57 pauseTimePerDay 35<br />
2014-02-04 21:00:01 pulseTimeIncrement 4<br />
2014-02-04 21:00:01 pulseTimeOverall 4<br />
2014-02-04 21:00:01 pulseTimePerDay 4<br />
2014-02-04 20:59:57 state 1<br />
2014-02-04 21:00:00 tickHour 1<br />
2014-02-04 21:00:01 value 0<br />
Helper:<br />
OFF_Regexp SHUTTER.JOHN:onoff:.0<br />
ON_Regexp SHUTTER.JOHN:onoff:.1<br />
calledByEvent <br />
changedTimestamp 2014-02-04 21:00:01<br />
forceClear <br />
forceDayChange <br />
forceHourChange <br />
forceMonthChange <br />
forceWeekChange <br />
isFirstRun <br />
sdRoundHourLast 1391544000<br />
value 0<br />
cmdQueue:<br />
</pre><br />
<br />
Damit nicht zu viele Ereignisse in den Log-Dateien landen, kann man diese sinnvoll einschränken, so daß<br />
nur Änderungen das Feuern von Events auslösen<br />
<pre><br />
attr CN.BRENNER event-on-change-reading .*<br />
</pre><br />
Wenn sich nun jedoch über Stunden und Tage nichts ändert, sieht man in den Charts keine Daten mehr.<br />
Mit dieser Anweisung wird erreicht, daß alle Readings nach Aktualisierung spätesten nach 1 Stunden einen Event feuern, auch wenn sich der Wert nicht ändert.<br />
Eine Ausnahme hiervon sollen machen die tick*-Readings, deren Events sollen immer sofort gefeuert werden, <br />
wenn sie aktualisiert werden.<br />
<pre><br />
attr CN.BRENNER event-min-interval tick.*:0,.*:3600<br />
</pre><br />
<br />
== Readings ==<br />
{| class="wikitable sortable"<br />
|-<br />
! Reading !! class="unsortable" | Beschreibung <br />
|-<br />
| clearDate || Datum, zu dem alle kumulativen Readings über set .. clear gelöscht wurden<br />
|-<br />
| countsOverall || Absolutzähler für das Auftreten des ON-Ereignisses<br />
|-<br />
| countsPerDay || Tageszähler für das Auftreten des ON-Ereignisses<br />
|-<br />
| pauseTimeIncrement || Zeitdauer der Pausen-Phase in Sekunden ; wird zyklisch aktualisiert<br />
|-<br />
| pauseTimeEdge || Zeitdauer der letzten komplettierten Pausen-Phase<br />
|-<br />
| pauseTimeOverall || Zeitdauer in Sekunden über alle aufgetretenen Pause-Phasen<br />
|-<br />
| pauseTimePerDay || Zeitdauer in Sekunden über alle aufgetretenen Pause-Phasen des akt. Tages<br />
|-<br />
| pulseTimeIncrement || Zeitdauer der Puls-Phase in Sekunden ; wird zyklisch aktualisiert<br />
|-<br />
| pulseTimeEdge || Zeitdauer der letzten komplettierten Pulse-Phase<br />
|-<br />
| pulseTimeOverall || Zeitdauer in Sekunden über alle aufgetretenen Puls-Phasen<br />
|-<br />
| pulseTimePerDay || Zeitdauer in Sekunden über alle aufgetretenen Puls-Phasen des akt. Tages<br />
|-<br />
| value || Aktueller Schaltzustand gemäss ON/OFF Ereignis,<br /><br />
mit 1=letztes Ereignis war ON-Ereignis <br /><br />
und 0=letztes Ereignis war OFF-Ereignis<br />
|-<br />
| tickUpdated || Event wird gefeuert, wenn die operativen Readings beschrieben worden sind (nicht unbedingt gändert)<br />
|-<br />
| tickChanged || Event wird nach Änderung von value gefeuert<br />
|-<br />
| tickDay || Event wird nach Tageswechsel gefeuert bevor die Tageszähler resettiert werden<br />
|-<br />
| tickHour || Event wird nach Stundenwechsel gefeuert<br />
|-<br />
| tickWeek || Event wird nach Wochenwechsel gefeuert<br />
|-<br />
| tickMonth || Event wird nach Monatswechsel gefeuert<br />
|-<br />
| tickYear || Event wird nach Jahreswechsel gefeuert<br />
|-<br />
| forceHourChange || simuliert einen Stundenwechsel<br />
|-<br />
| forceDayChange || simuliert einen Tageswechsel<br />
|-<br />
| forceWeekChange || simuliert einen Wochenwechsel<br />
|-<br />
| forceMonthChange || simuliert einen Monatswechsel<br />
|-<br />
| forceYearChange || simuliert einen Jahreswechsel<br />
|}<br />
<br />
== Web-Oberfläche ==<br />
[[Datei:13_11_15_HourCounter_Face.png|HourCounter]]<br />
<br />
== Anwendung ==<br />
Nachfolgende Darstellung zeigt das Einschaltverhalten eines Heizungskessels zusammen mit den <br />
abgeleiteten Werten.<br />
<br />
[[Datei:13_11_15_HourCounter_Chart.png]]<br />
<br />
* die Kurve "Brenner EIN" zeigt die Trigger-Signale des ON/OFF Filters, also das Ein-/Ausschalten des Brenners<br />
* die Kurve "Brenner-Starts" zeigt die über den Tag aufgelaufenen Starts, also chronologisch das Anwachsen von Reading countsPerDay<br />
* die Kurve "Betriebsstunden" zeigt die aufgelaufene Zeit aus dem Reading pulseTimePerDay umgerechnet zu Stunden<br />
* die Kurve "Dauer" zeigt die Dauer des letzten Pulses in Sekunden<br />
* die Kurve Auslastung zeigt das Verhältnis des Readings pulseTimePerDay zur seit Tagesbeginn vergangenen Zeit.<br />
<br />
=== Chart der Aktualwerte ===<br />
Wir benötigen hierzu ein File-Archiv für die aufgelaufenen Daten.<br />
<pre>define CN.Test.File FileLog ./log/CN.Test-%Y.log (CN\.Test:.*)</pre><br />
Man erhält nach den ersten Ereignissen Einträge in folgender Form:<br />
<pre><br />
2013-11-16_12:45:40 CN.Test value: 1<br />
2013-11-16_12:45:40 CN.Test 1<br />
2013-11-16_12:46:21 CN.Test pulseTimeIncrement: 41 <br />
2013-11-16_12:46:21 CN.Test pulseTimePerDay: 41<br />
2013-11-16_12:46:21 CN.Test pulseTimeOverall: 41<br />
2013-11-16_12:46:21 CN.Test value: 0<br />
2013-11-16_12:50:38 CN.Test countsPerDay: 2<br />
2013-11-16_12:50:38 CN.Test countsOverall: 2<br />
2013-11-16_12:50:38 CN.Test pauseTimeIncrement: 257<br />
2013-11-16_12:50:38 CN.Test pauseTimePerDay: 756<br />
2013-11-16_12:50:38 CN.Test pauseTimeOverall: 756<br />
2013-11-16_12:50:38 CN.Test value: 1<br />
2013-11-16_12:50:38 CN.Test 2<br />
</pre><br />
<br />
Nun kann man den Chart definieren:<br />
[[Datei:13_11_16_HourCounter_ChartBuild_01.png]]<br />
<br />
Für die Kurve "Brenner EIN" verwenden wir CN.Test.value. Damit diese als unterste Kurve dargestellt wird transformieren wir den Wert 1 auf -2 und alle anderen (also die 0) auf -21 mit folgender Funktion:<br />
<pre>$fld[3]=~"1"?-2:-19</pre><br />
Die "Brenner Starts" können wir direkt von countsPerDay ableiten.<br /><br /><br />
Für die "Betriebsstunden" verwenden wir pulseTimePerDay. Da diese in Sekunden vorliegen teilen wir den Wert durch 3600, um Stunden zu erhalten.<br />
<pre>$fld[3]/=3600</pre><br />
Als letzten versorgen wir noch die Kurve "Dauer" mit pulseTimeIncrement. Da wir diese in Minuten haben wollen ist ebenfalls eine Umformung nötig.<br />
<pre>$fld[3]/=60</pre><br />
<br />
Somit sind die Basis-Kurven angelegt.<br />
<br />
=== Erweiterungen ===<br />
Es wurden im Forum viele Wünsche formuliert, weitere Funktionalitäten für den HourCounter einzuführen.<br />
<br />
* Aggregation über bestimmte oder ganz freie Zeiträume<br />
* komplexe Berechnungen, die zum Verbrauch führen<br />
* Zuordnung von Verbräuchen zu unterschiedlichen Countern nach bestimmten Bedingungen<br />
<br />
Vor allem die Aggregation erfasster Werte in Stunden-, Tages-, Wochen- und Monatswerten ist eine sinnvolle<br />
Erweiterung bei der Verbrauchserfassung.<br />
<br />
HourCounter bietet Schnittstellen an, die es ermöglichen, das Modul selbst mit neuen Eigenschaften zu erweitern.<br />
<br />
Die Referenz-Implementierung in 99_UtilsHourCounter.pm zeigt, wie dies skript-technisch zu realisieren ist.<br />
<br />
==== Installation ====<br />
Die jeweils aktuelle Version von 99_UtilsHourCounter kann über diesen <br />
[https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/99_UtilsHourCounter.pm Link] bezogen werden.<br />
<br /><br /><br />
Die Datei ist in da Unterverzeichnis FHEM vom FHEM-Homverzeichnis zu kopieren.<br />
<br /><br />
z.B. bei Raspberry Pi: /opt/fhem/FHEM<br />
<br /><br /><br />
Nach dem Kopieren und einen Neustart von FHEM kann man überprüfen, ob FHEM diese Datei findet.<br />
Wenn man das Menü "Edit Files " anwählt, wird auch 99_UtilsHourCounter angezeigt.<br />
<br />
==== Readings ====<br />
99_UtilsHourCounter aus dem contrib-Verzeichnis der FHEM-Installation erweitert den HourCounter um folgende Funktionen:<br />
{| class="wikitable sortable"<br />
|-<br />
! Reading !! class="unsortable" | Beschreibung<br />
|-<br />
| appCountsPerHour || Stundenzähler, wird bei Stundenwechsel aktualisiert<br />
|-<br />
| appCountsPerHourTemp || Arbeitszähler zu appCountsPerHour<br />
|-<br />
| appCountsPerDay || Tageszähler, wird bei Tageswechsel aktualisiert (Arbeitszähler ist countsPerDay)<br />
|-<br />
| appCountsPerWeek || Wochenzähler, wird bei Wochenwechsel aktualisiert<br />
|-<br />
| appCountsPerWeekTemp || Arbeitszähler zu appCountsPerWeek<br />
|-<br />
| appCountsPerMonth || Monatszähler, wird bei Monatswechsel aktualisiert<br />
|-<br />
| appCountsPerMonthTemp || Arbeitszähler zu appCountsPerMonth<br />
|-<br />
| appCountsPerYear || Jahreszähler, wird bei Jahreswechsel aktualisiert<br />
|-<br />
| appCountsPerYearTemp || Arbeitszähler zu appCountsPerYear<br />
|-<br />
| appOpHoursPerDay || Betriebsstunden des Tages<br />
|-<br />
| appOpHoursPerDayTemp || Arbeitszähler zu appOpHoursPerDay<br />
|-<br />
| appOpHoursPerWeek || Betriebsstunden der Woche<br />
|-<br />
| appOpHoursPerWeekTemp || Arbeitszähler zu appOpHoursPerWeek<br />
|-<br />
| appOpHoursPerMonth || Betriebsstunden des Monats<br />
|-<br />
| appOpHoursPerMonthTemp || Arbeitszähler appOpHoursPerMonth<br />
|-<br />
| appOpHoursPerYear || Betriebsstunden des Jahres<br />
|-<br />
| appOpHoursPerYearTemp || Arbeitszähler appOpHoursPerYear<br />
|-<br />
| appUtilization || Auslastung = pulseTimePerDay /(vergangene Sekunden seit Tagesbeginn) * 100<br />
|-<br />
| appUtilizationTemp || Arbeitsvariable zu appUtilization<br />
|}<br />
Beginn der Woche ist jeweils der Sonntag.<br /><br />
<br />
Mit folgender Anweisung aktivieren wir die Erweiterungen: <br />
:<code>define CN.EVENT notify CN\..*:tick.* { appHCNotify("$NAME","$EVTPART0","$EVTPART1");;}</code><br />
<br />
Spätestens nach einer steigenden und einer fallenden Flanke sind die zuvor genannten app*-Readings zu sehen.<br />
{{Randnotiz|RNTyp=Info|RNText=Die gezeigten define-Anweisungen müssen jeweils in einer Zeile stehen (keine Zeilenumbrüche!).}}<br />
<br />
Die neuen Readings werden automatisch in den "Setter" der Web-Oberflächen aufgenommen. Dies gilt für alle Readings, die mit "app" beginnen.<br />
<br />
Somit können die neuen Readings beliebig manipuliert werden.<br />
<br />
<br />
===== Für Anfänger die noch keine Erfahrungen mit Regular Expressions haben:=====<br />
Benennt eure Hourcounter nach dem Muster CN.<euer Wunschname>. Dann wird der notify immer funktionieren.<br /><br />
<br />
Beispiel: statt "PelletsCounter" wählt den Namen "CN.PelletsCounter"<br />
<br />
==== Archiv für Tages-/Wochen-/Monats-/Jahreswerte anlegen ====<br />
Nun wollen wir die aggregierten Werte in eine eigene Datei speichern. Dies gelingt mit <br />
:<code>define CN.Test.FileDay FileLog ./log/CN.Test-Day-%Y.log CN.Test:app\w*(Utilization|PerHour|PerDay|PerWeek|PerMonth|PerYear)(?!Temp).* </code><br />
<br />
<br />
Im Klartext:<br />
* verwende alle Werte des Counters CN.Test, deren Reading mit "app" beginnt<br />
* und die einen der Terme appUtilization|PerHour|PerDay|PerWeek|PerMonth|PerYear beinhalten<br />
* und die danach nicht dem Term "Temp" beinhalten<br />
<br />
== Fragen und Antworten ==<br />
==== Betriebsstundenzähler über Leistungsmessung ableiten ====<br />
'''Frage:'''<br />
Ich würde gerne zählen, wenn ich mehr Strom als Standy verbrauche (also mehr als 2Watt)<br />
und keine Betriebsstunden zählen, wenn der Verbrauch unter 2 Watt ist. Ist das möglich?<br />
<br />
<u>Beispiel für die Events</u><br />
<pre><br />
013-11-18_19:40:32 XXX power: 1.9<br />
2013-11-18_19:40:32 XXX consumption: 2<br />
2013-11-18_19:40:32 XXX consumptionTotal: 2<br />
2013-11-18_19:40:36 XXX power: 27<br />
2013-11-18_19:40:36 XXX consumption: 2<br />
2013-11-18_19:40:36 XXX consumptionTotal: 2<br />
2013-11-18_19:40:42 XXX power: 34.6<br />
2013-11-18_19:40:42 XXX consumption: 2 <br />
</pre><br />
<br />
'''Antwort'''<br />
Die hier vorgestellte Lösung überprüft ob der Wert des Events power eine oder zwei Ziffern vor dem Komma hat.<br />
Deshalb wir hier erst gezählt, wenn die Schwelle von 10Watt überschritten wird. <br />
<pre><br />
define CN.Test HourCounter XXX:power:\s[0-9]{2,}(\.[0-9]{1,3})*$ XXX:power:\s[0-9]{1}(\.[0-9]{1,3})*$<br />
</pre><br />
Erläuterung zu <regexp_for_ON> = XXX:power:\s[0-9]{2,}(\.[0-9]{1,3})*$<br />
* "XXX" bezeichnet das Device, der Term danach ist der regexp-Filte für das On-Ereignis<br />
* "power:" das Ereignis muss mit diesem Term beginnen<br />
* "\s" es muss ein Leerzeichen folgen<br />
* "[0-9]{2,}" es müssen mindestens 2 Ziffern folgen<br />
* "(\.[0-9]{1,3})*" wenn ein Punkt folgt, dann müssen auf diesen mindestens 1..3 Ziffern folgen<br />
* "$" danach darf kein weiteres Zeichen mehr folgen<br />
<br />
'''Antwort Möglichkeit 2'''<br />
In dieser Lösung bekommt das entsprechende Device was mit HourCounter überwacht werden soll ein userReadings "onoff". Dieses Reading wird dann zum Schalten von Hour Counter verwendet:<br />
<pre><br />
define GPIO4_DS18B20_Waermepumpe_Vorlauf GPIO4 28-000005956079<br />
attr GPIO4_DS18B20_Waermepumpe_Vorlauf alias Wärmepumpe Vorlauf<br />
attr GPIO4_DS18B20_Waermepumpe_Vorlauf model DS18B20<br />
attr GPIO4_DS18B20_Waermepumpe_Vorlauf room GPIO4<br />
attr GPIO4_DS18B20_Waermepumpe_Vorlauf userReadings onoff {(ReadingsVal("GPIO4_DS18B20_Waermepumpe_Vorlauf","temperature",0) >28)?1:0;;}<br />
<br />
define Waermepumpe_HourCounter HourCounter GPIO4_DS18B20_Waermepumpe_Vorlauf:onoff:.1 GPIO4_DS18B20_Waermepumpe_Vorlauf:onoff:.0<br />
attr Waermepumpe_HourCounter room 2_Fussbodenheizung<br />
</pre><br />
Erläuterungen zu dem Code: "{(ReadingsVal("GPIO4_DS18B20_Waermepumpe_Vorlauf","temperature",0) >28)?1:0;;}"<br />
* "(ReadingsVal("GPIO4_DS18B20_Waermepumpe_Vorlauf","temperature",0) >28)" Diese Bedingung für das userReadings onoff prüft bei jedem Event, ob der Wert von temperature größer als 28 ist. <br />
* "?1:0" Ist dies der Fall wird das userReading onoff auf 1 gesetzt andernfalls auf 0.<br />
Auf Basis deses UserReadings wird dann der HourCounter definiert:<br />
* "GPIO4_DS18B20_Waermepumpe_Vorlauf:onoff:.1" Einschaltbedingung für HourCounter<br />
* "GPIO4_DS18B20_Waermepumpe_Vorlauf:onoff:.0" Abschaltbedingung für Hour Counter<br />
<br />
==== Welche Anwendungsfälle sind denkbar ? ====<br />
{{Link2Forum|Topic=12216|Message=175163|LinkText=Aus dem Forum}}<br />
* Betriebsstundenzähler für meine "Fliegenkiller-Steckdose"<br />
* Nutzungsdauer beschränken für TV,Internet oder Spielkonsolen für entnervte Eltern<br />
* Nutzungsdauer ermitteln zur Energieeinsparung (Klimageräte, Ventilatoren, Dunstabzugshauben etc.)<br />
* Lüftungsverhalten ermitteln (wie lange Fenster pro Tag geöffnet)<br />
<br />
{{Link2Forum|Topic=12216|Message=195358|LinkText=Brenner Starts/Verbrauch + akkumulierte Werte}}<br />
<br />
{{Link2Forum|Topic=12216|Message=196358|LinkText=Ölverbrauch+Solar-Ladung}}<br />
<br />
[http://voizchat.de/gaszaehler-verbrauch-erfassen-mit-fhem-und-raspberry-gpio/ Gaszähler mit HourCounter realisieren] (URL tot)<br />
<br />
==== Seltene Schaltvorgänge ====<br />
Die Schaltvorgänge sind über den Tag sehr wenige. Die Aktualisierung erfolgt immer erst<br />
bei der negativen Flanke. Wie kann man eine häufigere Aktualisierung erreichen ?<br />
<br />
'''Antwort'''<br />
<br />
Ab Version 1.0.0.6 ist wurde das Attribut "interval" eingeführt; es ist auf 60 Minuten voreingestellt und kann von 5..60 im 5 Minuten-Raster festgelegt werden.<br />
Es bestimmt, nach welcher Zeit Puls-/Pausendauer aktualisiert werden sollen, unabhängig vom Auftreten einer Schaltflanke.<br />
<br />
==== Korrekte Darstellung der akkumulierten Daten im Chart ====<br />
'''Frage'''<br />
<br />
"appCountsPerDay: 4" bezieht sich auf die Counts des Tages 2014-06-16, trägt aber selbst den Zeitstempel 2014-06-17 und wird demnach in einem Chart auch über den Tag " 2014-06-17" dargestellt.<br />
Das Problem betrifft alle akkumulierten Daten des HourCounters.<br />
Wie erreicht man im Chart die korrekte Darstellung ?<br />
<br />
<br />
'''Antwort'''<br />
<br />
Das Thema wurde {{Link2Forum|Topic=12216|Message=239929|LinkText=hier}} disktuiert.<br />
Eine Lösung findet man mit [[LogProxy]].<br />
Damit läßt sich ein negativer Offset für die X-Achse definieren, so daß die Daten wieder korrekt dargestellt werden.<br />
<br />
[[Kategorie:MAX]]<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Heizungssteuerung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Synology_Diskstation&diff=36167Synology Diskstation2021-11-01T14:58:40Z<p>Maista: Fhem > FHEM</p>
<hr />
<div>== FHEM Installation auf der Synology Diskstation (ab DSM 5)==<br />
<br />
FHEM auf einer Synology Diskstation (DS) zu installieren ist grundsätzlich nicht schwierig. Wichtig ist zunächst eine aktuelle DSM - also Systemupdates auf der DS installieren.<br />
<br />
* Zunächst installiert ihr Euch über das Paket-Zentrum der DS das Programm "Perl". <br />
* Dann besorgt ihr Euch von Martin Fischer ein kompiliertes FHEM [https://www.fischer-net.de/hausautomation/downloads/category/11-fhem.html SPK]. Mehr Infos s. {{Link2Forum|Topic=51265}}<br />
* Dann wieder den Paket-Zentrum der DS aufrufen und "Manuelle Installation" -> entsprechende Datei auswählen -> weiter. Wenn es Mecker gibt wegen Signierung o.ä., dann Paket-Zentrum -> Einstellungen -> Vertrauensebene auf "Jeder Herausgeber".<br />
<br />
Danach ist FHEM installiert und ihr könnt es über das Paket-Zentrum starten. Dann einfach FHEM aufrufen und als erstes mal ein Update durchführen. <br />
Nach dem Update die Datei 99_update.pm löschen, siehe {{Link2Forum|Topic=36249|Message=285521|LinkText=hier}}<br />
<br />
Um einen CUL damit zu betreiben oder HUEs anzusteuern müssen noch weitere Schritte unternommen werden. (siehe weiter unten)<br />
<br />
<i>Hinweis:</i> Falls man eine neuere Version von Perl benötigt bzw. Probleme auftreten, dann kann auf x86_64-Architekturen (s. [http://www.synology-wiki.de/index.php/Welchen_Prozessortyp_besitzt_mein_System%3F]) auch ActivePerl eingesetzt werden. Dazu muss man nur das Startskript von FHEM anpassen. Dann kann man beide Versionen auch parallel betreiben. Nur bei CPAN/PPM darauf achten, in welchem Verzeichnis man das aufruft.<br />
<br />
Hier noch Links zu Wiki-Einträgen für ältere DSM-Versionen / Modelle:<br />
[[FHEM auf dem Synology DS408]]<br />
<br />
== CUL zum laufen bringen | IPKG installieren ==<br />
A.) Zunächst braucht ihr die USB-Treiber: http://forum.synology.com/enu/viewtopic.php?f=155&t=82843&hilit=usbserial - diese einfach über das Paket-Zentrum installieren. Die Zusatzkonfigurationen, die vom Wizard nach der Installation gefragt werden, müssen nicht ausgewählt werden.<br />
<br />
B.) Dann braucht ihr das IPKG, damit ihr verschiedene Programme nachladen könnt, die ihr für den Betrieb des CUL benötigt:<br />
1. Prozessor (CPU) Architektur heraussuchen - http://forum.synology.com/wiki/index.php/What_kind_of_CPU_does_my_NAS_have<br />
2. Der Prozessor (CPU) Architektur entsprechendes Shell-Script herunterladen und in einem beliebigen Ordner auf der DiskStation speichern - http://forum.synology.com/wiki/index.php/Overview_on_modifying_the_Synology_Server,_bootstrap,_ipkg_etc#Bootstrap<br />
Wenn ihr den Prozessor Marvel Armada XP oder Marvel Armada 370 habt (z.B. DS 214+), dann schaut hier: https://gist.github.com/marlun78/9349792<br />
3. Dieses How-to durch arbeiten - http://forum.synology.com/wiki/index.php/How_to_Install_Bootstrap (für den Armada nicht - da steht alles im o.g. Link)<br />
4. DiskStation neustarten<br />
<br />
C) Jetzt braucht ihr die SerialPort Modul.<br />
Das kann funktionieren mit:<br />
<br />
<code>"ipkg install gcc"<br />
<br />
"/usr/local/perl/bin/perl -MCPAN -e shell") / je nachdem wo Eure perl Installation liegt - bei mir war es "/usr/bin/perl -MCPAN -e shell" <br />
<br />
"cpan install Device::SerialPort"</code><br />
<br />
Hat es bei mir nicht - ich habe es so geschafft:<br />
<br />
<code>"ipkg install perl-device-serialport"<br />
<br />
"cp /opt/lib/perl5/site_perl/5.10.0/arm-linux/Device/SerialPort.pm /volume1/@appstore/Perl/lib/perl5/site_perl/Device/"<br />
<br />
"cp /opt/lib/perl5/site_perl/5.10.0/arm-linux/auto/Device/SerialPort/SerialPort.bs /volume1/@appstore/Perl/lib/perl5/site_perl/auto/Device/SerialPort/"<br />
<br />
"cp /opt/lib/perl5/site_perl/5.10.0/arm-linux/auto/Device/SerialPort/SerialPort.so /volume1/@appstore/Perl/lib/perl5/site_perl/auto/Device/SerialPort/"</code><br />
<br />
Keine der beiden Varianten funktioniert für DS213+ (Stand: Juni 2015). Alternative für DS213+ siehe [[Synology Diskstation DS213+|hier]].<br />
<br />
<br />
D) ganz wichtig - sonst schmiert Euch der CUL immer wieder ab - synousbmdemd deaktivieren - das habe ich wie folgt gemacht:<br />
<br />
<code>mv /usr/syno/sbin/synousbmodemd /usr/syno/sbin/synousbmodemd_bkp</code><br />
<br />
Bei einem DSM update wird dieser Dienst vermutlich wieder installiert - daher nach einem Update same procedure as every year.<br />
<br />
Der "Security Advisor" erkennt diese Änderung und glaubt, dass sich eine Malware auf dem NAS breitgemacht hätte. Man erhält deswegen eine entsprechende Warnung.<br />
<br />
== Wichtig: Logfile auf USB auslagern ==<br />
Damit die DS auch ab und zu mal die Platten zum schlafen schicken kann, solltet ihr die Logfiles auf ein USB-Laufwerk auslagern. Dazu einfach eines an die DS anschließen und im File-Explorer nachschauen, wie das Laufwerk benannt wurde (z.B. volumeUSB1). Dann FHEM runterfahren ("shutdown"), anschließend als root über z.B. putty mit der DS verbinden, das Log-Verzeichnis auf den Stick verschieben und einen Link anlegen - z.B. so:<br />
<br />
<code>mv /usr/local/FHEM/var/log /volumeUSB1/usbshare/fhem/log<br />
<br />
ln -s /volumeUSB1/usbshare/fhem/log /usr/local/FHEM/var/log</code><br />
<br />
Dann Fhem wieder starten und es sollte klappen.<br />
<br />
== Inhalt von Fhem-Verzeichnissen aus Windows direkt bearbeiten ==<br />
Hier gibt es mehrere Möglichkeiten. Entweder ihr verbindet Euch über WinSCP mit der DS. Oder aber ihr verschiebt und verknüpft noch weitere Teile der FHEM Installation auf den Stick (siehe Logfile auf USB auslagern). Hier wäre ich allerdings vorsichtig, da kann FHEM zickig werden. Ich persönlich habe mir die fhem.cfg auf diese Weise noch auf den Stick geschoben - also das /usr/local/FHEM/etc Verzeichnis analog obiger Beschreibung zum Logfile. Darüber hinaus könnt ihr auch einfach Dateien auf Eurem Stick ablegen und im entsprechenden FHEM-Verzeichnis einen Link dazu erstellen - so habe ich das z.B. mit meinen pm-Files gemacht - z.B.<br />
<br />
<code>ln -s /volumeUSB1/usbshare/fhem/99_myUtils.pm /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm</code><br />
<br />
== HUE auf der Synology Diskstation ==<br />
Da auf der DS standardmäßig kein JSON installiert ist, muss dies nachinstalliert werden (Danke an Patlinger für die Anleitung). Wichtig - ihr braucht IPKG (siehe CUL zum Laufen bringen):<br />
<br />
1. Per SSH verbinden (Befehl "ssh <ip-adresse> -l root")<br />
<br />
2. Superuser aktivieren (Befehl "su")<br />
<br />
3. "make" installieren (Befehl "ipkg install make")<br />
<br />
4. PERL und CPAN starten (Befehl "/usr/local/perl/bin/perl -MCPAN -e shell") / je nachdem wo Eure perl Installation liegt - bei mir war es "/usr/bin/perl -MCPAN -e shell"<br />
<br />
5. CPAN updaten (Befehl "install CPAN")<br />
<br />
6. JSON installieren (Befehl "install JSON")<br />
<br />
7. Per telnet verbinden (Befehl "telnet <ip-adresse> <port (7072)>")<br />
<br />
8. FHEM Update durchführen (Befehl "update")<br />
<br />
9. FHEM Neustart (Befehl "shutdown restart")<br />
<br />
10. Hue Bridge hinzufügen (Befehl "define <Name-für-die-Bridge> HUEBridge <ip-adresse-der-Hue-Bridge>")<br />
<br />
11. Taste an der Hue Bridge drücken um das "Pairing" zu bestätigen.<br />
<br />
12. GANZ WICHTIG - Wenn's jetzt einmal läuft, dann nicht vergessen die Konfiguration zu speichern! (Befehl "save")<br />
<br />
== Net::Telnet installieren ==<br />
Net::Telnet benötigt ihr beispielsweises für das geniale Modul FRITZBOX, dass Euch viele Möglichkeiten eröffnet, wenn ihr einen solchen Router besitzt.<br />
<br />
Los gehts wie üblich mit <br />
<code>"/usr/bin/perl -MCPAN -e shell"</code><br />
Der Pfad zu perl kann bei Euch auch anders lauten, siehe oben. Dann seid ihr fast fertig, nur noch folgendes eingeben - und fertig:<br />
<code>install Net::Telnet</code><br />
<br />
== JeeLink ==<br />
<br />
Für den JeeLink werden zwei Kernelmodule gebraucht, die seit DSM 5.2 dabei sind und nicht mehr separat installiert werden müssen. Jedoch müssen sie nach jedem Update wieder neu aktiviert werden (kann auch bei laufendem Betrieb von FHEM passieren):<br />
<br />
* <code>cd /lib/modules</code><br />
* <code>insmod usbserial.ko</code><br />
* <code>insmod ftdi_sio.ko</code><br />
<br />
Ansonsten wird wie oben beschrieben das <code>Device::SerialPort</code>-Modul benötigt.<br />
<br />
Getestet auf DSM415+<br />
<br />
== Automatischer Neustart == <br />
<br />
Script anlegen:<br />
<br />
<syntaxhighlight lang="bash"><br />
#!/bin/sh<br />
cnt=$(ps -A -f | grep "fhem\.pl" | grep -v grep | wc -l)<br />
if [ "$cnt" -eq "0" ] ; then<br />
/var/packages/FHEM/scripts/start-stop-status restart<br />
else<br />
echo "FHEM still running.";<br />
return 1;<br />
fi<br />
</syntaxhighlight><br />
<br />
Dann kann man entweder über cron das Skript regelmäßíg (z.B. alle 15min) oder man nutzt hierfür die in DSM eingebaute Aufgabenverwaltung (einfach vollständigen Pfad zum Skript eingeben). Letzteres ist für den Überblick auf praktischer.<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Synology]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=At&diff=35973At2021-08-24T17:03:31Z<p>Maista: </p>
<hr />
<div>{{SEITENTITEL:at}}<br />
{{Infobox Modul<br />
|ModPurpose=Setzt einen Fhem-Befehl zu einem späteren Zeitpunkt ab.<br />
|ModType=h<br />
<!-- |ModCategory= (noch?) nicht verwendet --><br />
|ModCmdRef=at<br />
|ModTechName=90_at.pm<br />
|ModOwner=rudolfkoenig / [http://forum.fhem.de/index.php?action=profile;u=8 rudolfkoenig]<br />
}}<br />
<br />
[[at]] ist ein Erweiterungsmodul, mit dessen Hilfe FHEM-Befehle/-Aktionen zu einem späteren Zeitpunkt ausgeführt werden können. Es läßt sich sowohl einmalige Ausführung, als auch regelmäßige Wiederholung erzielen, Zeitangaben können relativ oder absolut erfolgen.<br />
<br />
== Voraussetzungen ==<br />
<!-- AUSKOMMENTIERT wegen derzeitiger Funktionsproblemen iZm codemirror {{Randnotiz|RNTyp=[g|Info|RNText=FHEM enthält für at eine eingebaute Perl-Syntax-Prüfung. Diese ist nach [http://fhem.de/commandref.html#perlSyntaxCheck Aktivierung] aber nur aktiv, wenn die [[Konfiguration]] -wie empfohlen- nicht direkt bearbeitet wird. ({{Link2Forum|Topic=51744}}) }} --><br />
Keine.<br />
<br />
== Anwendung ==<br />
=== Define ===<br />
<code>define <name> at <timespec|datespec> <command></code><br />
=== Besonderheit ===<br />
*timespec - '''nur Zeit''' im Format HH:MM:SS '''kann eine''' Perlfunktion sein. <br />
*datespec - '''Datum und Zeit''' ISO 8601 oder "number of sec since 1970" '''darf keine''' Perlfunktion sein.<br />
Siehe {{Link2Forum|Topic=91625|Message=168475}} <br />
<br />
=== Beispiele ===<br />
*<code>define MeineAktion at 02:02:00 set lamp on</code> → das nächste Mal um zwei Minuten nach 2 Uhr "lamp" einschalten<br />
*<code>define MeineAktion at *02:02:00 set lamp on</code> → jeden Tag um zwei Minuten nach 2 Uhr "lamp" einschalten<br />
*<code>define MeineAktion at {ReadingsVal("Dummy","Zeit","")} set lamp on</code> → das nächste Mal um (Perlfunktion liest Zeit aus dem Dummy) "lamp" einschalten<br />
*<code>define MeineAktion at 2016-01-25T02:02:00 set lamp on</code> → das nächste Mal am 25.01.2016 um zwei Minuten nach 2 Uhr "lamp" einschalten (ISO 8601)<br />
*<code>define MeineAktion at 1453683720 set lamp on</code> → das nächste Mal am 25.01.2016 um zwei Minuten nach 2 Uhr "lamp" einschalten (number of sec since 1970)<br />
*<code>define MeineAktion at +02:02:00 set lamp on</code> → in zwei Stunden und 2 Minuten "lamp" einschalten<br />
*<code>define MeineAktion at +*02:02:00 set lamp on</code> → alle zwei Stunden und 2 Minuten "lamp" einschalten<br />
Um datespec auch variabel mit setzen zu können gibt es einen Workaround: Perlebene, Perlfunktion und Übergabe in Variable. <br />
<br />
Beispiele für "number of seconds since 1970"<br />
<syntaxhighlight lang="perl"><br />
{my $time=time_str2num("2019-09-14 23:00:00");;fhem("define MeineAktion at $time set lamp on")}<br />
{my $time=1568494800;;fhem("define MeineAktion at $time set lamp on")}<br />
</syntaxhighlight><br />
Beispiel im ISO 8601 Format<br />
<syntaxhighlight lang="perl">{my $time="2019-09-14T23:00:00";;fhem("define MeineAktion at $time set lamp on")}</syntaxhighlight><br />
<br />
=== Mehrere Aktionen ausführen ===<br />
Die Verwendung der Semikolon erfordert immer besondere Aufmerksamkeit!<br />
*<code>set lampe1 on ; set lampe2 on </code> → Schaltet sofort beide Lampen ein ( ein bisschen OT, weil kein at)<br />
*<code>define morgens at *7:00:00 set lampe1 on ; set lampe2 on</code> → schaltet lampe 1 immer um 7 an, aber lampe2 sofort. Der erste Befehl landet in der config (im at) der zweite Befehl wird genau wie der define Befehl einfach sofort ausgeführt. <br />
*<code>define morgens at *7:00:00 set lampe1 on ;; set lampe2 on</code> → schaltet BEIDE Lampen immer um 7 an. Beide Befehle landen in der config (im at), nur der define Befehl wird ausgeführt<br />
*<code>define morgens at *7:00:00 set lampe1,lampe2 on</code> → schaltet BEIDE Lampen immer um 7 an. Geht nur wenn der gleiche Befehl an 2 oder mehr Geräte gesendet werden soll<br />
<br />
=== Attribute ===<br />
...<br />
<br />
=== Testen ===<br />
{{Randnotiz|RNText='''Versionsspezifisch:''' Der Befehl ''execNow'' ist in FHEM 5.7/90_at.pm ab 30.4.2016 verfügbar.}}<br />
Mit dem Befehl <br />
:<code>set <devspec> execNow</code><br />
lässt sich eine ''at''-Definition (einmalig, beispielsweise zu Testzwecken) unabhängig vom Erreichen der angegebenen Zeitspezifikation ausführen.<br />
<br />
== Anwendungsbeispiele ==<br />
* [[AT an einem bestimmten Wochentag ausführen|at an einem bestimmten Wochentag ausführen]]<br />
* [[AT um eine Temperaturabhängige Nachtabsenkung zu realisieren|at um eine Temperaturabhängige Nachtabsenkung zu realisieren]]<br />
* [[AT zu einem absoluten Datum ausführen|at zu einem absoluten Datum ausführen]]<br />
* [[SUNRISE_EL|at in Verbindung mit SUNRISE_EL]] <br />
<br />
== Links ==<br />
* Abfrage, ob at definiert ist: {{Link2Forum|Topic=23584|Message=841269}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=Qnap_NAS&diff=35799Qnap NAS2021-06-06T20:27:46Z<p>Maista: /* FHEM Installieren */</p>
<hr />
<div>{{Randnotiz|RNTyp=Info|RNText=Ergänzungen und Aktualisierungen in {{Link2Forum|Topic=60300}} bitte beachten!}}<br />
= Installation von FHEM auf einem QNAP NAS =<br />
Diese Anleitung beschreibt detailiert, wie FHEM auf einer<br />
QNAP Turbo Station TS-109 II pro installiert werden kann.<br />
Im wesentlichen wird die Vorgehensweise auch für weitere QNAP NAS<br />
gelten.<br />
<br />
<br />
<br />
== Überblick ==<br />
Die aktuelle QNAP Firmware 3.1.0 Build 0708 unterstützt die<br />
Installation von IPKG Paketen. Sämtliche für FHEM benötigte<br />
Software ist auf diese Weise verfügbar, so dass die Installation<br />
eigentlich sehr einfach vonstatten gehen könnte. Leider hat QNAP<br />
an einigen Stellen geschlampt und man muss von Hand etwas nachhelfen. <br />
Desweiteren ist Handarbeit gefragt für folgende Zusatzfunktionen<br />
<br />
* Auslagerung der FHEM Logfiles auf einen Speicherstick. Somit kann die interne Festplatte weiterhin in den Spin Down gehen.<br />
* Autostart von FHEM bein Booten des NAS<br />
* Geordnetes Runterfahren von FHEM beim Herunterfahren des NAS<br />
= Installation des QPKG Paketes Optware IPKG =<br />
Über die NAS Web-Administration kann das Optware IPKG Paket<br />
Optware_0.99.163_arm-x09.qpkg Installiert werden. <br />
In dem Paket für die TS-109 sind leider einige Fehler enthalten, die<br />
im folgenden korrigiert werden. Diese und alle weiteren Eingaben<br />
sind auf der [[Kommandozeilentools|Kommandozeile]] durchzuführen.<br />
<br />
== Anpassen der ipkg Konfiguration ==<br />
=== Namen der Konfigurationsfiles korrigieren ===<br />
<nowiki># cd /share/HDA_DATA/.qpkg/Optware/etc/ipkg<br />
# mv tsx19-kmod.conf tsx09-kmod.conf<br />
# mv tsx19.conf tsx09.conf</nowiki><br />
=== Repository für ipkg Pakete korrigieren ===<br />
<nowiki># vi tsx09-kmod.conf<br />
Ändern von<br />
src tsx19 http://ipkg.nslu2-linux.org/feeds/optware/tsx19/cross/unstable<br />
in<br />
src tsx09 http://ipkg.nslu2-linux.org/feeds/optware/tsx09/cross/stable</nowiki><br />
=== Repository für die ipkg Kernel Module korrigieren ===<br />
<nowiki># vi tsx09.conf<br />
Ändern von<br />
src cs08q1armel http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable<br />
in<br />
src cs05q3armel http://ipkg.nslu2-linux.org/feeds/optware/cs05q3armel/cross/unstable</nowiki><br />
=== Zusätzliches Installationsziel für ipkg in die Config aufnehmen ===<br />
Die Kernel Module werden sonst nach /lib/modules installiert, und das wird bei jedem reboot überschrieben. Also müssen sie explizit nach /opt/lib/modules installiert werden.<br />
<br />
<nowiki># cd /share/HDA_DATA/.qpkg/Optware/etc<br />
# vi ipkg.conf<br />
Hinzufügen von <br />
dest opt /opt</nowiki><br />
=== Anpassen des Paketnamens ===<br />
Es muss überall Optware-ipkg heissen.<br />
<br />
<nowiki># cd /share/HDA_DATA/.qpkg/Optware<br />
# mv Optware.sh Optware-ipkg.sh<br />
# vi Optware-ipkg.sh<br />
Ändern von<br />
QPKG_NAME=“Optware“<br />
in<br />
QPKG_NAME=“Optware-ipkg“</nowiki><br />
=== Optware „mounten“ ===<br />
<nowiki># /share/HDA_DATA/.qpkg/Optware/Optware-ipkg.sh restart</nowiki><br />
<br />
= Zusätzliche Software installieren =<br />
Nun können die für FHEM benötigten Pakete per ipkg installiert werden.<br />
<br />
== Paketliste aktualisieren ==<br />
<nowiki># ipkg update</nowiki><br />
== Kernel Module für USB-Serial Hardware ==<br />
Das usbserial Modul unterstützt diverse USB nach seriell Wandler.<br />
Für ein CUL sind keine weiteren Kernel Module nötig.<br />
Ein FHT-1000 benötigt zusätzlich des ftdi-sio Modul.<br />
Eine Reihe von günstigen USB nach seriell Adapterkabel benutzen den<br />
Proliftic PL-2303 Chip. Hierfür ist ebenfalls ein weiteres Modul nötig.<br />
Über ein solches Kabel ist dann Beispielsweise ein ELV M232 Modul anzuschliessen.<br />
Neben den Kernel Modulen habe ich noch die libusb installiert. <br />
Die benötige ich später einmal um einen IOWarrior anzusprechen.<br />
<br />
'''Bei den Kernel Modulen beachten, dass diese nach /opt installiert werden.'''Sonst sind sie nach dem nächsten Reboot weg.<br />
<br />
<nowiki># ipkg -d opt install ts209-kernel-module-usbserial<br />
# ipkg install -d opt ts209-kernel-module-ftdi-sio<br />
# ipkg install -d opt ts209-kernel-module-pl2303<br />
# ipkg install libusb</nowiki><br />
=== Kernel Module linken ===<br />
<nowiki># ln -s /opt/lib/modules/2.6.12.6-arm1/kernel /lib/modules</nowiki><br />
=== Module laden mit Vendor und Product ID für CUL ===<br />
<nowiki># insmod /lib/modules/kernel/drivers/usb/serial/usbserial.ko vendor=0x03eb product=0x204b<br />
# insmod /lib/modules/kernel/drivers/usb/serial/ftdi_sio.ko<br />
# insmod /lib/modules/kernel/drivers/usb/serial/pl2303.ko</nowiki><br />
Nun kann man den CUL anstöpseln und prüfen, ob er erkannt wurde<br />
<br />
<nowiki># cd /usr/local/share # hier liegt usb.ids<br />
# lsusb<br />
Sollte u.A. folgendes ausgeben ... <br />
ID 03eb:204b Atmel Corp.<br />
# dmesg<br />
Sollte folgendes ausgeben ...<br />
usbserial_generic 2-1.4:1.1 Generic converter detected<br />
usb 2-1.4: Generic converter now attached to ttyUSB0</nowiki><br />
== Benötigte Pakete für FHEM installieren ==<br />
<nowiki># ipkg install perl perl-device-serialport<br />
# ipkg install make # für die fhem Installation<br />
# ipkg install gcc # richtige libgcc für perl<br />
# ipkg install gnuplot # optional, falls lediglich plotmode SVG verwendet</nowiki><br />
= FHEM installieren =<br />
FHEM am PC downloaden und in ein QNAP Public Verzeichnis auspacken z.B.<br />
<br />
<nowiki>/share/HDA_DATA/Public/TS109/fhem-4.8</nowiki><br />
== Ins Download Verzeichnis wechseln ==<br />
<nowiki># cd /share/HDA_DATA/Public/TS109/fhem-4.8</nowiki><br />
== Pfade im Makefile auf /opt/ .... ändern ==<br />
<nowiki># vi Makefile<br />
BINDIR=/opt/bin<br />
MODDIR=/opt/lib<br />
VARDIR=/opt/var/log/fhem</nowiki><br />
== Logverzeichnis anlegen ==<br />
Dieses Verzeichnis wird später auf einen Speicherstick ausgelagert.<br />
<br />
<nowiki># mkdir -p /opt/var/log/fhem</nowiki><br />
== Installieren ==<br />
<nowiki># make install-pgm2</nowiki><br />
== Pfad von Perl in fhem.pl anpassen ==<br />
<nowiki># vi /opt/bin/fhem.pl<br />
#!/opt/bin/perl</nowiki><br />
== Configfile nach /opt/etc kopieren und editieren ==<br />
<nowiki># cp /opt/var/log/fhem/fhem.cfg /opt/etc/fhem.cfg<br />
#vi /opt/etc/fhem.cfg<br />
attr global logfile /opt/var/log/fhem/fhem-%Y-%V.log<br />
attr global statefile /opt/var/log/fhem/fhem.savestate<br />
define CUL CUL /dev/usb/ttyUSB0 &lt;Hauscode&gt;</nowiki><br />
== Probeweise starten ==<br />
<nowiki># /opt/bin/fhem.pl /opt/etc/fhem.cfg</nowiki><br />
== Stoppen ==<br />
<nowiki># killall fhem.pl</nowiki><br />
= Logfiles auf USB-Stick auslagern =<br />
== Stick einstecken und prüfen, wo er gemounted wurde ==<br />
<nowiki># mount|grep vfat<br />
/dev/sdu on /share/external/sdu type vfat</nowiki><br />
== Lokale Logfiles verschieben und verlinken ==<br />
<nowiki># cd /opt/var/log<br />
# cp -r fhem /share/external/sdu<br />
# mv fhem fhem.local<br />
# ln -s /share/external/sdu/fhem</nowiki><br />
= Autostart und Stop einrichten =<br />
== Startskript anlegen ==<br />
# vi /share/HDA_DATA/.qpkg/Optware/optstart.sh<br />
<br />
<pre>#!/bin/sh<br />
# wait for optware init<br />
while ( test -z &quot;$(grep /opt/bin /etc/profile)&quot; ); do sleep 10; done<br />
# get new PATH<br />
source /etc/profile<br />
# Execute all start scripts in /opt/etc/init.d<br />
# executing them in numerical order.<br />
#<br />
for i in /opt/etc/init.d/S??*&#160;;do<br />
# Ignore dangling symlinks (if any).<br />
#[&#160;! -f &quot;$i&quot; ] &amp;&amp; continue<br />
case &quot;$i&quot; in<br />
*.sh)<br />
# Source shell script for speed.<br />
(<br />
trap - INT QUIT TSTP<br />
set start<br />
. $i<br />
)<br />
&#160;;;<br />
*)<br />
# No sh extension, so fork subprocess.<br />
$i start<br />
&#160;;;<br />
esac<br />
done</pre><br />
=== Startskript ausführbar machen ===<br />
# chmod a+x optstart.sh<br />
<br />
== Und noch einmal als Stop-Skript mit kleinen Änderungen ==<br />
# cp optstart.sh optstop.sh<br />
# chmod a+x optstop.sh<br />
<br />
<pre>#!/bin/sh<br />
# Execute all kill scripts in /opt/etc/init.d<br />
# executing them in numerical order.<br />
#<br />
for i in /opt/etc/init.d/K??*&#160;;do<br />
# Ignore dangling symlinks (if any).<br />
#[&#160;! -f &quot;$i&quot; ] &amp;&amp; continue<br />
case &quot;$i&quot; in<br />
*.sh)<br />
# Source shell script for speed.<br />
(<br />
trap - INT QUIT TSTP<br />
set stop<br />
. $i<br />
)<br />
&#160;;;<br />
*)<br />
# No sh extension, so fork subprocess.<br />
$i stop<br />
&#160;;;<br />
esac<br />
done</pre><br />
<br />
== Start- und Stop-Skript aus Optware-ipkg.sh heraus aufrufen ==<br />
<nowiki># cd /etc/init.d<br />
# vi Optware-ipkg.sh<br />
Die Sektion in start/stop folgendermassen anpassen<br />
<br />
case &quot;$1&quot; in<br />
start)<br />
/bin/echo &quot;Enable Optware/ipkg&quot;<br />
# sym-link $QPKG_DIR to /opt<br />
/bin/rm -rf /opt<br />
/bin/ln -sf $QPKG_DIR /opt<br />
# adding Ipkg apps into system path ...<br />
/bin/cat /etc/profile | /bin/grep &quot;PATH&quot; | /bin/grep &quot;/opt/bin&quot; \<br />
1&gt;&gt;/dev/null 2&gt;&gt;/dev/null<br />
[ $? -ne 0 ] &amp;&amp; /bin/echo &quot;export PATH=$PATH&quot;:/opt/bin:/opt/sbin \<br />
&gt;&gt; /etc/profile<br />
if [ -x /opt/optstart.sh ]; then<br />
/opt/optstart.sh<br />
fi<br />
&#160;;;<br />
stop)<br />
/bin/echo &quot;Disable Optware/ipkg&quot;<br />
if [ -x /opt/optstop.sh ]; then<br />
/opt/optstop.sh<br />
fi<br />
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin<br />
/bin/sync<br />
/bin/sleep 1<br />
&#160;;;</nowiki><br />
== FHEM Init-Skript anlegen ==<br />
<nowiki># cp /share/HDA_DATA/Public/TS109/fhem-4.8/contrib/init-skripts/fhem.2 \<br />
/opt/etc/init.s/init_fhem<br />
# vi /opt/etc/init.d/init_fhem<br />
#!/bin/sh<br />
# by Matthias Bauer<br />
case &quot;$1&quot; in<br />
start)<br />
echo &quot;Starting $0&quot;<br />
/opt/bin/fhem.pl /opt/etc/fhem.cfg<br />
&#160;;;<br />
stop)<br />
echo &quot;Stopping $0&quot;<br />
/opt/bin/fhem.pl 7072 shutdown<br />
&#160;;;<br />
status)<br />
cnt=`ps -ef | grep &quot;fhem.pl&quot; | grep -v grep | wc -l`<br />
if [ &quot;$cnt&quot; -eq &quot;0&quot; ]&#160;; then<br />
echo &quot;$0 is not running&quot;<br />
else<br />
echo &quot;$0 is running&quot;<br />
fi<br />
&#160;;;<br />
*)<br />
echo &quot;Usage: $0 {start|stop|status}&quot;<br />
exit 1<br />
esac<br />
exit 0</nowiki><br />
=== Ausführbar machen und Links anlegen ===<br />
<nowiki># chmod u+x init_fhem<br />
# ln -s init_fhem S30fhem<br />
# ln -s init_fhem K10fhem</nowiki><br />
== Startskript zum Laden der USB-Serial Kernel Module anlegen ==<br />
<nowiki># vi S01kernel-modules<br />
#!/bin/sh<br />
ln -s /opt/lib/modules/2.6.12.6-arm1/kernel /lib/modules<br />
insmod /lib/modules/kernel/drivers/usb/serial/usbserial.ko vendor=0x03eb product=0x204b<br />
insmod /lib/modules/kernel/drivers/usb/serial/ftdi_sio.ko<br />
insmod /lib/modules/kernel/drivers/usb/serial/pl2303.ko</nowiki><br />
=== Ausführbar machen ===<br />
<nowiki># chmod u+x S01kernel-modules</nowiki><br />
= Reboot und Test =<br />
Viel Spass<br />
<br />
TorstenS 06.03.2010<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Server Hardware]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Qnap_NAS&diff=35798Qnap NAS2021-06-06T20:25:12Z<p>Maista: /* Benötigte Pakete für fhem insatllieren */</p>
<hr />
<div>{{Randnotiz|RNTyp=Info|RNText=Ergänzungen und Aktualisierungen in {{Link2Forum|Topic=60300}} bitte beachten!}}<br />
= Installation von FHEM auf einem QNAP NAS =<br />
Diese Anleitung beschreibt detailiert, wie FHEM auf einer<br />
QNAP Turbo Station TS-109 II pro installiert werden kann.<br />
Im wesentlichen wird die Vorgehensweise auch für weitere QNAP NAS<br />
gelten.<br />
<br />
<br />
<br />
== Überblick ==<br />
Die aktuelle QNAP Firmware 3.1.0 Build 0708 unterstützt die<br />
Installation von IPKG Paketen. Sämtliche für FHEM benötigte<br />
Software ist auf diese Weise verfügbar, so dass die Installation<br />
eigentlich sehr einfach vonstatten gehen könnte. Leider hat QNAP<br />
an einigen Stellen geschlampt und man muss von Hand etwas nachhelfen. <br />
Desweiteren ist Handarbeit gefragt für folgende Zusatzfunktionen<br />
<br />
* Auslagerung der FHEM Logfiles auf einen Speicherstick. Somit kann die interne Festplatte weiterhin in den Spin Down gehen.<br />
* Autostart von FHEM bein Booten des NAS<br />
* Geordnetes Runterfahren von FHEM beim Herunterfahren des NAS<br />
= Installation des QPKG Paketes Optware IPKG =<br />
Über die NAS Web-Administration kann das Optware IPKG Paket<br />
Optware_0.99.163_arm-x09.qpkg Installiert werden. <br />
In dem Paket für die TS-109 sind leider einige Fehler enthalten, die<br />
im folgenden korrigiert werden. Diese und alle weiteren Eingaben<br />
sind auf der [[Kommandozeilentools|Kommandozeile]] durchzuführen.<br />
<br />
== Anpassen der ipkg Konfiguration ==<br />
=== Namen der Konfigurationsfiles korrigieren ===<br />
<nowiki># cd /share/HDA_DATA/.qpkg/Optware/etc/ipkg<br />
# mv tsx19-kmod.conf tsx09-kmod.conf<br />
# mv tsx19.conf tsx09.conf</nowiki><br />
=== Repository für ipkg Pakete korrigieren ===<br />
<nowiki># vi tsx09-kmod.conf<br />
Ändern von<br />
src tsx19 http://ipkg.nslu2-linux.org/feeds/optware/tsx19/cross/unstable<br />
in<br />
src tsx09 http://ipkg.nslu2-linux.org/feeds/optware/tsx09/cross/stable</nowiki><br />
=== Repository für die ipkg Kernel Module korrigieren ===<br />
<nowiki># vi tsx09.conf<br />
Ändern von<br />
src cs08q1armel http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable<br />
in<br />
src cs05q3armel http://ipkg.nslu2-linux.org/feeds/optware/cs05q3armel/cross/unstable</nowiki><br />
=== Zusätzliches Installationsziel für ipkg in die Config aufnehmen ===<br />
Die Kernel Module werden sonst nach /lib/modules installiert, und das wird bei jedem reboot überschrieben. Also müssen sie explizit nach /opt/lib/modules installiert werden.<br />
<br />
<nowiki># cd /share/HDA_DATA/.qpkg/Optware/etc<br />
# vi ipkg.conf<br />
Hinzufügen von <br />
dest opt /opt</nowiki><br />
=== Anpassen des Paketnamens ===<br />
Es muss überall Optware-ipkg heissen.<br />
<br />
<nowiki># cd /share/HDA_DATA/.qpkg/Optware<br />
# mv Optware.sh Optware-ipkg.sh<br />
# vi Optware-ipkg.sh<br />
Ändern von<br />
QPKG_NAME=“Optware“<br />
in<br />
QPKG_NAME=“Optware-ipkg“</nowiki><br />
=== Optware „mounten“ ===<br />
<nowiki># /share/HDA_DATA/.qpkg/Optware/Optware-ipkg.sh restart</nowiki><br />
<br />
= Zusätzliche Software installieren =<br />
Nun können die für FHEM benötigten Pakete per ipkg installiert werden.<br />
<br />
== Paketliste aktualisieren ==<br />
<nowiki># ipkg update</nowiki><br />
== Kernel Module für USB-Serial Hardware ==<br />
Das usbserial Modul unterstützt diverse USB nach seriell Wandler.<br />
Für ein CUL sind keine weiteren Kernel Module nötig.<br />
Ein FHT-1000 benötigt zusätzlich des ftdi-sio Modul.<br />
Eine Reihe von günstigen USB nach seriell Adapterkabel benutzen den<br />
Proliftic PL-2303 Chip. Hierfür ist ebenfalls ein weiteres Modul nötig.<br />
Über ein solches Kabel ist dann Beispielsweise ein ELV M232 Modul anzuschliessen.<br />
Neben den Kernel Modulen habe ich noch die libusb installiert. <br />
Die benötige ich später einmal um einen IOWarrior anzusprechen.<br />
<br />
'''Bei den Kernel Modulen beachten, dass diese nach /opt installiert werden.'''Sonst sind sie nach dem nächsten Reboot weg.<br />
<br />
<nowiki># ipkg -d opt install ts209-kernel-module-usbserial<br />
# ipkg install -d opt ts209-kernel-module-ftdi-sio<br />
# ipkg install -d opt ts209-kernel-module-pl2303<br />
# ipkg install libusb</nowiki><br />
=== Kernel Module linken ===<br />
<nowiki># ln -s /opt/lib/modules/2.6.12.6-arm1/kernel /lib/modules</nowiki><br />
=== Module laden mit Vendor und Product ID für CUL ===<br />
<nowiki># insmod /lib/modules/kernel/drivers/usb/serial/usbserial.ko vendor=0x03eb product=0x204b<br />
# insmod /lib/modules/kernel/drivers/usb/serial/ftdi_sio.ko<br />
# insmod /lib/modules/kernel/drivers/usb/serial/pl2303.ko</nowiki><br />
Nun kann man den CUL anstöpseln und prüfen, ob er erkannt wurde<br />
<br />
<nowiki># cd /usr/local/share # hier liegt usb.ids<br />
# lsusb<br />
Sollte u.A. folgendes ausgeben ... <br />
ID 03eb:204b Atmel Corp.<br />
# dmesg<br />
Sollte folgendes ausgeben ...<br />
usbserial_generic 2-1.4:1.1 Generic converter detected<br />
usb 2-1.4: Generic converter now attached to ttyUSB0</nowiki><br />
== Benötigte Pakete für FHEM installieren ==<br />
<nowiki># ipkg install perl perl-device-serialport<br />
# ipkg install make # für die fhem Installation<br />
# ipkg install gcc # richtige libgcc für perl<br />
# ipkg install gnuplot # optional, falls lediglich plotmode SVG verwendet</nowiki><br />
= FHEM Installieren =<br />
FHEM am PC downloaden und in ein QNAP Public Verzeichniss auspacken z.B.<br />
<br />
<nowiki>/share/HDA_DATA/Public/TS109/fhem-4.8</nowiki><br />
== Ins Download Verzeichniss wechseln ==<br />
<nowiki># cd /share/HDA_DATA/Public/TS109/fhem-4.8</nowiki><br />
== Pfade im Makefile auf /opt/ .... ändern ==<br />
<nowiki># vi Makefile<br />
BINDIR=/opt/bin<br />
MODDIR=/opt/lib<br />
VARDIR=/opt/var/log/fhem</nowiki><br />
== Logverzeichniss anlegen ==<br />
Dieses Verzeichniss wird später auf einen Speicherstick ausgelagert.<br />
<br />
<nowiki># mkdir -p /opt/var/log/fhem</nowiki><br />
== Installieren ==<br />
<nowiki># make install-pgm2</nowiki><br />
== Pfad von perl in fhem.pl anpassen ==<br />
<nowiki># vi /opt/bin/fhem.pl<br />
#!/opt/bin/perl</nowiki><br />
== Konfigfile nach /opt/etc kopieren und editieren ==<br />
<nowiki># cp /opt/var/log/fhem/fhem.cfg /opt/etc/fhem.cfg<br />
#vi /opt/etc/fhem.cfg<br />
attr global logfile /opt/var/log/fhem/fhem-%Y-%V.log<br />
attr global statefile /opt/var/log/fhem/fhem.savestate<br />
define CUL CUL /dev/usb/ttyUSB0 &lt;Hauscode&gt;</nowiki><br />
== Probeweise starten ==<br />
<nowiki># /opt/bin/fhem.pl /opt/etc/fhem.cfg</nowiki><br />
== Stoppen ==<br />
<nowiki># killall fhem.pl</nowiki><br />
= Logfiles auf USB-Stick auslagern =<br />
== Stick anstöpseln und prüfen, wo er gemounted wurde ==<br />
<nowiki># mount|grep vfat<br />
/dev/sdu on /share/external/sdu type vfat</nowiki><br />
== Lokale Logfiles verschieben und verlinken ==<br />
<nowiki># cd /opt/var/log<br />
# cp -r fhem /share/external/sdu<br />
# mv fhem fhem.local<br />
# ln -s /share/external/sdu/fhem</nowiki><br />
= Autostart und Stop einrichten =<br />
== Startskript anlegen ==<br />
# vi /share/HDA_DATA/.qpkg/Optware/optstart.sh<br />
<br />
<pre>#!/bin/sh<br />
# wait for optware init<br />
while ( test -z &quot;$(grep /opt/bin /etc/profile)&quot; ); do sleep 10; done<br />
# get new PATH<br />
source /etc/profile<br />
# Execute all start scripts in /opt/etc/init.d<br />
# executing them in numerical order.<br />
#<br />
for i in /opt/etc/init.d/S??*&#160;;do<br />
# Ignore dangling symlinks (if any).<br />
#[&#160;! -f &quot;$i&quot; ] &amp;&amp; continue<br />
case &quot;$i&quot; in<br />
*.sh)<br />
# Source shell script for speed.<br />
(<br />
trap - INT QUIT TSTP<br />
set start<br />
. $i<br />
)<br />
&#160;;;<br />
*)<br />
# No sh extension, so fork subprocess.<br />
$i start<br />
&#160;;;<br />
esac<br />
done</pre><br />
=== Startskript ausführbar machen ===<br />
# chmod a+x optstart.sh<br />
<br />
== Und noch einmal als Stopskript mit kleinen Änderungen ==<br />
# cp optstart.sh optstop.sh<br />
# chmod a+x optstop.sh<br />
<br />
<pre>#!/bin/sh<br />
# Execute all kill scripts in /opt/etc/init.d<br />
# executing them in numerical order.<br />
#<br />
for i in /opt/etc/init.d/K??*&#160;;do<br />
# Ignore dangling symlinks (if any).<br />
#[&#160;! -f &quot;$i&quot; ] &amp;&amp; continue<br />
case &quot;$i&quot; in<br />
*.sh)<br />
# Source shell script for speed.<br />
(<br />
trap - INT QUIT TSTP<br />
set stop<br />
. $i<br />
)<br />
&#160;;;<br />
*)<br />
# No sh extension, so fork subprocess.<br />
$i stop<br />
&#160;;;<br />
esac<br />
done</pre><br />
<br />
== Start- und Stopskript aus Optware-ipkg.sh heraus aufrufen ==<br />
<nowiki># cd /etc/init.d<br />
# vi Optware-ipkg.sh<br />
Die Sektion in start/stop folgendermassen anpassen<br />
<br />
case &quot;$1&quot; in<br />
start)<br />
/bin/echo &quot;Enable Optware/ipkg&quot;<br />
# sym-link $QPKG_DIR to /opt<br />
/bin/rm -rf /opt<br />
/bin/ln -sf $QPKG_DIR /opt<br />
# adding Ipkg apps into system path ...<br />
/bin/cat /etc/profile | /bin/grep &quot;PATH&quot; | /bin/grep &quot;/opt/bin&quot; \<br />
1&gt;&gt;/dev/null 2&gt;&gt;/dev/null<br />
[ $? -ne 0 ] &amp;&amp; /bin/echo &quot;export PATH=$PATH&quot;:/opt/bin:/opt/sbin \<br />
&gt;&gt; /etc/profile<br />
if [ -x /opt/optstart.sh ]; then<br />
/opt/optstart.sh<br />
fi<br />
&#160;;;<br />
stop)<br />
/bin/echo &quot;Disable Optware/ipkg&quot;<br />
if [ -x /opt/optstop.sh ]; then<br />
/opt/optstop.sh<br />
fi<br />
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin<br />
/bin/sync<br />
/bin/sleep 1<br />
&#160;;;</nowiki><br />
== FHEM Initskript anlegen ==<br />
<nowiki># cp /share/HDA_DATA/Public/TS109/fhem-4.8/contrib/init-skripts/fhem.2 \<br />
/opt/etc/init.s/init_fhem<br />
# vi /opt/etc/init.d/init_fhem<br />
#!/bin/sh<br />
# by Matthias Bauer<br />
case &quot;$1&quot; in<br />
start)<br />
echo &quot;Starting $0&quot;<br />
/opt/bin/fhem.pl /opt/etc/fhem.cfg<br />
&#160;;;<br />
stop)<br />
echo &quot;Stopping $0&quot;<br />
/opt/bin/fhem.pl 7072 shutdown<br />
&#160;;;<br />
status)<br />
cnt=`ps -ef | grep &quot;fhem.pl&quot; | grep -v grep | wc -l`<br />
if [ &quot;$cnt&quot; -eq &quot;0&quot; ]&#160;; then<br />
echo &quot;$0 is not running&quot;<br />
else<br />
echo &quot;$0 is running&quot;<br />
fi<br />
&#160;;;<br />
*)<br />
echo &quot;Usage: $0 {start|stop|status}&quot;<br />
exit 1<br />
esac<br />
exit 0</nowiki><br />
=== Ausführbar machen und Links anlegen ===<br />
<nowiki># chmod u+x init_fhem<br />
# ln -s init_fhem S30fhem<br />
# ln -s init_fhem K10fhem</nowiki><br />
== Startskript zum Laden der Usb-serial Kernel Module anlegen ==<br />
<nowiki># vi S01kernel-modules<br />
#!/bin/sh<br />
ln -s /opt/lib/modules/2.6.12.6-arm1/kernel /lib/modules<br />
insmod /lib/modules/kernel/drivers/usb/serial/usbserial.ko vendor=0x03eb product=0x204b<br />
insmod /lib/modules/kernel/drivers/usb/serial/ftdi_sio.ko<br />
insmod /lib/modules/kernel/drivers/usb/serial/pl2303.ko</nowiki><br />
=== Ausführbar machen ===<br />
<nowiki># chmod u+x S01kernel-modules</nowiki><br />
= Reboot und Test =<br />
Viel Spass<br />
<br />
TorstenS 06.03.2010<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Server Hardware]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=VALVES&diff=35708VALVES2021-05-10T18:13:22Z<p>Maista: /* Auch hier nur Schreibfehler bereinigt */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Durchschnitt mit individueller Gewichtung und Ignore<br />
<!-- |ModCategory= (noch?) nicht verwendet --><br />
|ModType=x<br />
<!-- |ModCmdRef= ---- noch nicht Teil von FHEM --><br />
|ModForumArea=Codeschnipsel<br />
|ModTechName=39_VALVES.pm<br />
|ModOwner=epsrw1,cwagner}}<br />
[[VALVES]] bietet eine einfache Möglichkeit, den nach flexibel konfigurierbaren Regeln gewichteten Durchschnittswert einer Gruppe von Werten zu berechnen.<br />
<br />
== Features ==<br />
<u>Diese Wiki-Seite beschreibt den Versionsstand 1.0 des VALVES-Moduls.</u> <br />
<br />
Die Namensgebung beruht auf der primären Anwendung des Moduls auf Valve-Position-Readings von Heizungsthermostaten.<br />
<br />
Thread im Forum:{{Link2Forum|Topic=24658|Message=177528}}<br />
<br />
== Beschreibung ==<br />
[[Datei:dok39_VALVES.jpg|mini|Funktionsweise]]<br />
<br />
VALVES bietet als kleines Helferlein die Möglichkeit, einen halbwegs sinnvollen und individuell gewichteten Durchschnittswert der Readings mehrerer verschiedener Devices zu berechnen.<br />
<br />
Für jeden Wert einzeln kann ein Offset definiert werden. Es können dynamisch jeweils die höchsten/niedrigsten 0 bis 3 Werte ignoriert werden. Eine weitere Einstellung ermöglicht, bestimmte Werte doppelt zu zählen.<br />
<br />
''Im Anwendungsbeispiel [[Raumbedarfsabhängige Heizungssteuerung]] wird das Modul zum Beispiel verwendet, um den Durchschnittswert der Ventilöffnungen aller Heizkörper zu berechnen. Die individuelle Gewichtung über Attr ermöglicht hierbei einen virtuellen hydraulischen Abgleich.''<br />
<br />
Die Liste aller auszulesenden Devices wird in einem ATTR eingestellt, der Name des Readings in einem weiteren. Das Modul prüft dann regelmäßig (attr: poll interval) die Daten der FHEM-Devices und berechnet neu, wenn ein Änderung festgestellt wird.<br />
<br />
Für die Beeinflussung des Durchschnittes hat man folgende Attribute:<br />
<br />
* ignoriere niedrigste 0...3 Positionen<br />
<br />
* ignoriere höchste 0...3 Positionen<br />
<br />
* ignoriere namentlich genannte Devices<br />
<br />
* priority-device Liste (zählen doppelt)<br />
<br />
* valves<Devicename>Gewichtung optionale Einzeleinstellung für jedes Reading, multipliziere mit Attr-Wert (zB:0,95 um 5% abzuziehen). Damit können Unterschiede bekannte gleichbleibende Meßungenauigkeiten kompensiert werden, oder verschieden große Geräte in vergleichbare Rechengrößen konvertiert werden.<br />
<br />
== Define ==<br />
:<code>define <name> VALVES </code><br />
<br />
== Attribute ==<br />
Alle Attribute sind auch in FHEM durch das Kommando get attrHelp <varname> erklärt, fürs "schnelle Nachschauen zwischendurch".<br />
<br />
valvesInitialDelay -> Startverzögerung<br />
<br />
valvesPollInterval -> Berechnungsfrequenz<br />
<br />
valvesDeviceList -> '''Pflicht-Attr''', Liste Thermostate mit valve-pos Readings<br />
<br />
valvesDeviceReading -> '''Pflicht-Attr''', Bezeichnung valve-pos Reading<br />
<br />
valvesIgnoreLowest -> Niedrigste N Werte ignorieren<br />
<br />
valvesIgnoreHighest -> Höchste N Werte ignorieren<br />
<br />
valvesIgnoreDeviceList -> Device(s) die komplett ignoriert werden, z.B. temporärer Eintrag für Gästezimmer<br />
<br />
valvesPriorityDeviceList -> Devices, die doppelt gezählt werden<br />
<br />
valves<Devicename> Gewichtung -> Faktor für einzelnes Device für individuelle Gewichtung<br />
<br />
== Settings ==<br />
reset -> Alle Readings zurücksetzen<br />
<br />
== Readings ==<br />
state -> Fehlermeldung oder Mittelwert nach oben beschriebener Berechnung<br />
<br />
valve_<Devicename> -> Berechnete virtuelle Ventilstellung pro Gerät<br />
<br />
valveDetail_<Devicename> -> Debug-Info mit Details<br />
<br />
raw_average -> Simpler Mittelwert ohne Berücksichtigung der Gewichtungen (ignores werden auch hier ignoriert)<br />
<br />
valve_average -> Mittelwert nach oben beschriebener Berechnung<br />
<br />
valve_max -> Größte aktuelle Ventilöffnung seit letztem Reset<br />
<br />
valve_min -> Kleinste aktuelle Ventilöffnung seit letztem Reset<br />
<br />
== Weblinks ==<br />
* {{Link2Forum|Topic=24658|Message=177528}} Thread im Forum, in dem dieses Modul vorgestellt wurde<br />
* ...<br />
<br />
[[Kategorie:Regelungstechnik]]<br />
[[Kategorie:Heizungssteuerung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Raumbedarfsabh%C3%A4ngige_Heizungssteuerung&diff=35707Raumbedarfsabhängige Heizungssteuerung2021-05-10T18:07:46Z<p>Maista: /* Schreibfehler bereinigt */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Dieses Modul ist noch Entwicklung<br />
|ModType=x<br />
<!-- |ModCategory= (noch?) nicht verwendet --><br />
<!-- |ModCmdRef= ---- noch nicht Teil von FHEM --><br />
|ModForumArea=Codeschnipsel<br />
|ModTechName=39_VALVES.pm<br />
|ModOwner=epsrw1,cwagner}}<br />
<br />
Das FHEM-[[:Kategorie:Hilfsmodul|Hilfsmodul]] [[VALVES]] bietet eine einfache Möglichkeit, eine raumbedarfsabhängige Steuerung des Vorlaufes (Brenner oder Mischer, dazu siehe auch [[Mischersteuerung]]) einer Zentralheizung umzusetzen. Diese berücksichtigt besser als eine Außentemperatursteuerung interne und externe Wärmequellen. <br />
<br />
== Features ==<br />
<br />
<u>Diese Wiki-Seite beschreibt den derzeitigen Stand des VALVES-Moduls.</u><br />
<br />
----<br />
<br />
Thread im Forum:{{Link2Forum|Topic=24658|Message=177528}}<br />
<br />
== Beschreibung ==<br />
<br />
[[Datei:dok39_VALVES.jpg|mini|Funktionsweise]]<br />
VALVES bietet als kleines Helferlein die Möglichkeit, einen halbwegs sinnvollen und individuell gewichteten Durchschnittswert der Ventilpositionen mehrerer Heizungsthermostate zu berechnen.<br />
<br />
Dieser (gewichtete) Durchschnittswert der Ventilöffnungen ist ein Ausdruck der Wärmeanforderung im Haus. Da die Raumthermostate aus der FS20-, der Homematic und der Max-Reihe ihrerseits immer bessere Strategien verfolgen, um die Entwicklung der Temperatur in jeweils "ihrem" Raum zu erkennen, hat die Ventilposition eine große Aussagekraft.<br />
<br />
Zugleich wird auch Vorlaufsteuerung des Heizkessels oder der Heiztherme automatisch durch Nachtabsenkungen, Abwesentheitsschaltungen einerseits und durch zusätzliche Wärmequellen, die das Haus aufheizen, beeinflusst.<br />
<br />
Idealerweise ist der Vorlauf dann gerade so groß, dass der Wärmebedarf im Haus überall gestillt wird.<br />
<br />
Die Liste aller Thermostate wird in einem ATTR eingestellt, der Name des Readings mit der Ventilposition in einem weiteren. Das Modul prüft dann regelmäßig (attr: poll interval) die Daten des FHEM-Devices und berechnet neu, wenn ein Änderung festgestellt wird.<br />
<br />
Für die Beeinflussung des Durchschnittes hat man folgende Attribute:<br />
<br />
* ignoriere niedrigste 0...3 Positionen<br />
<br />
* ignoriere höchste 0...3 Positionen<br />
<br />
* ignoriere namentlich genannte Devices<br />
<br />
* priority-device Liste (zählen doppelt)<br />
<br />
* valves<Devicename>Gewichtung optionale Einzeleinstellung für jeden Thermostat, multipliziere mit attr-wert (zB:0,95 um 5% der Position abzuziehen). Damit können Unterschiede im hydraulischen Abgleich kompensiert werden, oder individuelles Nutzungsverhalten feinjustiert.<br />
<br />
<br />
<br />
== Define ==<br />
<code><br />
define <name> VALVES <br />
</code><br />
<br />
----<br />
<br />
== Attribute ==<br />
<br />
<br />
Alle Attributes sind auch in FHEM durch das Kommando get attrHelp <varname> erklärt, fürs "schnelle Nachschauen zwischendurch".<br />
<br />
<br />
valvesInitialDelay -> Startverzögerung<br />
<br />
valvesPollInterval -> Berechnungsfrequenz<br />
<br />
valvesDeviceList -> '''Pflicht-Attr''', Liste >Thermostate mit valve-pos Readings<br />
<br />
valvesDeviceReading -> '''Pflicht-Attr''', Bezeichnung valve-pos Reading<br />
<br />
valvesIgnoreLowest -> Niedrigste N Werte ignorieren<br />
<br />
valvesIgnoreHighest -> Höchste N Werte ignorieren<br />
<br />
valvesIgnoreDeviceList -> Device(s) die komplett ignoriert werden, z.B. temporärer Eintrag für Gästezimmer<br />
<br />
valvesPriorityDeviceList -> Devices, die doppelt gezählt werden<br />
<br />
valves<Devicename>Gewichtung -> Faktor für einzelnes Device für individuelle Gewichtung<br />
<br />
<br />
<br />
== Settings ==<br />
reset -> Alle Readings zurücksetzen<br />
<br />
<br />
== Readings ==<br />
<br />
state -> Fehlermeldung oder Mittelwert nach oben beschriebener Berechnung<br />
<br />
valve_<Devicename> -> Berechnete virtuelle Ventilstellung pro Gerät<br />
<br />
valveDetail_<Devicename> -> Debug-Info mit Details<br />
<br />
raw_average -> Simpler Mittelwert ohne Berücksichtigung der Gewichtungen (ignores werden auch hier ignoriert)<br />
<br />
valve_average -> Mittelwert nach oben beschriebener Berechnung<br />
<br />
valve_max -> Größte aktuelle Ventilöffnung seit letztem Reset<br />
<br />
valve_min -> Kleinste aktuelle Ventilöffnung seit letztem Reset<br />
<br />
<br />
== Weblinks ==<br />
* {{Link2Forum|Topic=24658|Message=177528}} Thread im Forum, in dem dieses Modul vorgestellt wurde<br />
* to be continued<br />
<br />
[[Kategorie:Regelungstechnik]]<br />
[[Kategorie:Examples]]<br />
[[Kategorie:Heizungssteuerung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=TelegramBot&diff=34486TelegramBot2020-12-28T20:24:37Z<p>Maista: /* Fehlermeldungen bei veralteter SSL-Version */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram<br />
|ModType=d<br />
|ModForumArea=Unterstützende Dienste<br />
|ModFTopic=38328<br />
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]<br />
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}<br />
<br />
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/).<br />
Es entsteht eine Möglichkeit Benachrichtungen aus FHEM zu versenden, zum Beispiel Alarmmeldungen.<br />
Ausserdem können auch Kommandos über Telegram an FHEM gesendet werden um Steuerungsbefehle in FHEM auszulösen.<br />
<br />
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem FHEM-Server<ref>anders als die Vorläufer-Variante über das [[Telegram - old API method|Telegram-API]]</ref>, sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das [http://www.fhemwiki.de/wiki/Raspberry_Pi#N.C3.BCtzliche_Zusatzpakete perl JSON modul] installiert sein.<br />
<br />
== Über Telegram Instant Messaging ==<br />
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei.<br />
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und<br />
können auch aus dem WebBrowser verwendet werden.<br />
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt.<br />
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.<br />
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.<br />
<br />
Für die Unterstützung von ''WhatsApp'' siehe Modul [[yowsup]].<br />
<br />
Unterstützt werden:<br />
<br />
* Versand von Textnachrichten<br />
* Versand und Empfang von Bildern/Audio/etc<br />
* Empfang von Textnachrichten von beliebigen Kontakten<br />
* Kommandos in FHEM über Telegram-Nachrichten von aussen auslösen<br />
* Ergebnisse der Kommandos zusenden lassen<br />
<br />
Eine detaillierte Beschreibung des Moduls ist im FHEM Forum und in der (englischen) Dokumentation zum Modul in der {{Link2CmdRef|Anker=TelegramBot}} und in diesem {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über FHEM-Update verteilt.<br />
<br />
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.<br />
<br />
== TelegramBot Devices in FHEM ==<br />
=== Define ===<br />
{{Randnotiz|RNTyp=Info|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.<br />
}}<br />
<br />
Für die Anlage eines TelegramBot Devices in FHEM ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#6-botfather BotFather] erzeugt (siehe dazu unten). Dafür muss der BotFather mit einem Telegram-Client kontaktiert werden. Dort mit dem Telegram-Befehl <code>/newbot</code> einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf "Bot" enden.<br><br />
<br />
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:<br />
<br />
<code>define &lt;name&gt; TelegramBot &lt;token&gt; </code><br />
<br />
Beispiel: <code>define myTelegramBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw</code><br />
<br />
'''Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes'''<br />
<code>pollingTimeout</code> '''auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.'''<br />
<br />
Beispiel: <code>attr myTelegramBot pollingTimeout 120</code><br />
<br />
'''Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.'''<br />
Dafür muss man in seinem Telegram-Client den Kontakt @botName suchen und dann eine Nachricht daran versenden.<br />
<br />
'''Der TelegramBot kann keine Nachrichten an andere Bots senden. Ein anderer Bot erhält die Nachrichten auch nicht wenn er in einer Gruppe enthalten ist.''' Dies ist eine Beschränkung in der Bot-Funktion bei Telegram. Das Versenden an einen anderen Bot (wenn man den Kontakt manuell hinzugefügt hat) führt zur Fehlermeldung<br />
<code>sentMsgResult - Callback returned error :Bad Request: chat not found:</code><br />
<br />
{{Randnotiz|RNTyp=Info|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.<br />
}}<br />
<br />
=== Registrierung eines neuen Bot ===<br />
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.<br />
Hier ein Beispiel, wie so ein Chat aussehen könnte:<br />
<pre>Client:<br />
/newbot<br />
----------------<br />
BotFather:<br />
Alright, a new bot. How are we going to call it? Please choose a name for your bot.<br />
----------------<br />
Client:<br />
Mein Name<br />
----------------<br />
BotFather:<br />
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.<br />
----------------<br />
Client:<br />
fhem_bot<br />
----------------<br />
BotFather:<br />
Sorry, this username is already taken. Think of something different.<br />
----------------<br />
Client:<br />
fhem1234_bot<br />
----------------<br />
BotFather:<br />
Done! Congratulations on your new bot.<br />
You will find it at telegram.me/fhem1234_bot.<br />
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.<br />
----------------<br />
Use this token to access the HTTP API:<br />
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz<br />
<br />
For a description of the Bot API, see this page: https://core.telegram.org/bots/api<br />
</pre><br />
{{Randnotiz|RNTyp=Info|RNText=Achtung: Da Bots generell für alle Benutzer sichtbar sind und es gelegentlich Problem mit spammern gibt, die fremde bots auch in Gruppen hinzufügen, ist es empfehlenswert die Einstellung /setjoingroups auf false zu setzen, wenn die Zugehörigkeit zu Gruppen (und der Empfang von Meldungen aus gruppen) nicht notwendig ist<br />
}}<br />
<br />
<br />
Um einen Chat an einen "Contact" versenden zu können, muss zuerst in Contacts (bei Readings) ein Kontakt auftauchen. Wenn man sich zum allerersten Mal bei Telegram angemeldet hat, gibt es noch keinen Chat mit irgendjemanden. Man muss sich zuerstmal selbst eine Nachricht im Smartphone zusenden, dann taucht unter Readings der Eintrag Contacts auf. Erst dann kann man eine Nachricht mit @msgPeerId (das ist Ziffernfolge des Contacts ) oder mit @msgPeer (das ist der Name nach dem Doppelpunkt) vom TelegramBot auf sein Smartphone senden.<br />
<br />
<br />
<br />
== Tipps ==<br />
<br />
=== Privacyeinstellungen ===<br />
<br />
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.<br>Beispielchat:<pre>Client:<br />
/setprivacy<br />
----------------<br />
BotFather:<br />
Choose a bot to change group messages settings.<br />
----------------<br />
Client:<br />
@fhem1234_bot<br />
----------------<br />
BotFather:<br />
'Enable' - your bot will only receive messages that either start with the '/' symbol or mention the bot by username.<br />
'Disable' - your bot will receive all messages that people send to groups.<br />
Current status is: ENABLED<br />
----------------<br />
Client:<br />
Disable<br />
----------------<br />
BotFather:<br />
Success! The new status is: DISABLED. /help</pre><br />
<br />
Siehe auch Info zu /setjoingroups oben.<br />
<br />
=== Kontakte ===<br />
<br />
Der Bot merkt sich die bereits bekannten Kontakte im Reading <code>Contacts</code>. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge gespeichert - bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @).<br />
<br />
Beispiel: <code>123456:Ralf_Mustermann:@ralf</code><br />
<br />
Verschiedene Einträge werden durch Leerzeichen getrennt.<br />
<br />
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl <code>replaceContacts</code>. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.<br />
<br />
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)<br />
<br />
=== Reset ===<br />
<br />
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl <code>reset</code>). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt.<br />
<br />
=== Gruppen ===<br />
<br />
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Die Gruppen-ID ist eine negative Zahl. Wenn die Privacy-Einstellungen nicht auf 'Disabled' gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.<br />
<br />
==== Supergroups / Supergruppen ====<br />
<br />
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.<br />
<br />
==== Fehlermeldungen bei veralteter SSL-Version ====<br />
Telegram nutzt seit Februar 2020 eine neue Verschlüsselung und dies ruft bei veralteter Installation eine Fehlermeldung hervor:<br />
<br />
NonBlockingGet: returned <hidden>: Can't connect(2) to <nowiki>https://api.telegram.org:443</nowiki><br />
<br />
Dies deutet auf eine veraltete SSL-Version hin, siehe dazu die Forumsdiskussion ab {{Link2Forum|Topic=38328|Message=1021642|LinkText=diesem Beitrag}}. Hilfreich hat sich ein upgrade der SSL-Module erwiesen. Zuerst muss u.U. ein Modul installiert werden<br />
:<code>sudo apt-get install libssl-dev</code><br />
und danach in zwei Schritten<br />
sudo cpan <enter><br />
upgrade net::SSLeay<enter><br />
Es ist bei Jessie zwingend ein Upgrade von <br />
IO::Socket::SSL 2.002 -> 2.066 <br />
notwendig. Es wird darauf hingewiesen, dass idealerweise nicht einzelne Module, sondern das gesamte OS sowie alle Perlmodule auf den neuesten Stand gebracht werden sollten.<br />
<br />
=== Befehle von Telegram an FHEM senden ===<br />
Es handelt sich hier um ein Tool, das {{Link2Forum|Topic=51425|Message=464928|LinkText=hier im Forum}} vorgestellt wurde. Dabei wird ein notify in FHEM angelegt, das den TelegramBot überwacht. Wird eine Befehlsfolge an den Bot gesendet, liest das Telegram-Device die gesendete Information aus und führt den Befehl aus. Weitere Details, wie hier vorzugehen ist, unter dem oben angegebenen Link im Forum.<br />
<br />
Wenn man an FHEM Befehle senden will, muss der TelegramBot bereit sein, diese Nachrichten zu empfangen. Wenn man allerdings aus Sicherheitsgründen das Attribut<br />
:<code>allowUnknownContacts = 0</code><br />
gesetzt hat, dann ist ein solcher Empfang nicht möglich. Daher muss (zumindest einmalig) erlaubt werden, von unbekannten Kontakten eine Nachricht zu bekommen. Nach dem ersten Empfang ist dann der Kontakt bekannt und man kann erneut den Empfang auf bekannte Kontakte beschränken.<br />
<br />
== Beispielszenarien ==<br />
=== Benachrichtigungen über Ereignisse ===<br />
Das einfachste Szenario für die Integration von Messaging-Diensten mit FHEM ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von FHEM zu informieren:<br />
<br />
<code>define notify_fhem_reload notify global:INITIALIZED set myTelegramBot message fhem newly started - just now !</code><br />
<br />
In diesem Beispiel wird der Nachrichtentext "fhem newly started - just now !" an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald FHEM neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.<br />
<br />
Nebenbemerkung: hier ist eine erweiterte Strukturierung evt. empfehlenswert: statt jede Notify-Syntax o.ä. direkt auf TelegramBot-Spezifika gehen zu lassen, kann man sich eine Helper-Funktion (zur Vermittlung all solcher "Alarmtexte") bauen ([[99_myUtils_anlegen]]), die entsprechende Alarm-Meldungen dann nur intern auf (u.a.) einen Messaging-Service wie (momentan!) Telegram schickt.<br />
<br />
=== Versand von Bildern ===<br />
<br />
Es ist auch möglich Bilder auf dem FHEM-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.<br />
<br />
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015<br />
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=FHEM-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).<br />
<br />
<br />
<code>define notify_fhem_reload notify wetter:report set myTelegramBot sendImage /opt/fhem/wetter.jpg</code><br />
<br />
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.<br />
<br />
=== Versand von SVG-Plots ===<br />
<br />
SVG-Plots können mit dem Befehl<br />
<code>cmdSend [ @<peer1> ... @<peerN> ] <fhem command></code><br />
verschickt werden.<br />
<br />
Das angegebene FHEM-Kommando wird ausgeführt und das Ergebnis an die angegebenen Peers bzw. den Standard-Peer verschickt.<br />
<br />
Mit dem folgenden Befehl wird der SVG-Plot SVG_FileLog_Aussen an den Standard-Peer geschickt:<br />
<code>set myTelegramBot cmdSend { plotAsPng('SVG_FileLog_Aussen') }</code><br />
<br />
Nach <code>define cmd_sendTelegramSVG cmdalias TGSVG .* AS set myTelegramBot cmdSend { plotAsPng("$EVENT") }</code><br />
kann man mit einem kurzen<br />
<code>TGSVG SVG_Garten</code><br />
ein beliebiges SVG über die Kommandozeile per Telegram versenden.<br />
<br />
Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:<br />
<br />
<code>{fhem "set myTelegramBot message Bildbeschreibung;; set myTelegramBot cmdSend { plotAsPng('mein_SVG') }" }</code><br />
<br />
'''Hinweis:''' früher wurde zum Verschicken von Plots auch die interne Funktion TelegramBot_ExecuteCommand verwendet; mit dem Update Ende Februar 2017 hat diese Funktion einen zusätzlichen Parameter erhalten und lautet nun<br />
<code>TelegramBot_ExecuteCommand($defs{"myTelegramBot"}, meine_ZielID, undef, '{plotAsPng("mein_SVG")}');</code><br />
<br />
<br />
==== Voraussetzungen für den Versand von SVG-Plots ====<br />
Es muss das Modul libimage-librsvg-perl installiert sein:<br />
<br />
<code>sudo apt-get install libimage-librsvg-perl</code><br />
<br />
Evtl. sind weitere Module erforderlich:<br />
<br />
<code>sudo apt-get install libgd-graph-perl<br />
<br />
sudo apt-get install libgd-text-perl</code><br />
<br />
=== Empfang von Bildern oder ähnlichem ===<br />
<br />
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading <code>msgFileId</code> angelegt (<code>123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx</code>) und im Reading <code>msgText</code> steht dann so etwas wie<br />
<code>received photo # Size: 107701</code><br />
<br />
Über das Get-Kommando <code>urlForFile</code> mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt:<br />
<br />
<code>https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg</code><br />
<br />
<br />
=== Versand von Emojis (Smileys) ===<br />
<br />
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite<br />
<br />
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte "Native")<br />
<br />
übernehmen und mit der Nachricht verschicken.<br />
<br />
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).<br />
<br />
=== Kommandos auslösen ===<br />
<br />
Ein wichtiges Szenario ist die Möglichkeit Kommandos in FHEM ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: "cmdKeyword") erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.<br />
<br />
<code>attr myTelegramBot cmdKeyword doit</code><br />
<br />
Somit kann man dann durch Nachrichten die mit "doit" beginnen Kommandos an FHEM senden, die ähnlich wie im Kommandoeingabefeld von FHEMweb dann von FHEM ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.<br />
<br />
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.<br />
<br />
Beispiele<br />
<br />
<code>doit set schalter on</code><br />
<br />
<code>doit list telegrambot</code><br />
<br />
==== TelegramBot-Aktionen auslösen ====<br />
Der Bot sendet Nachrichten standardmäßig an den defaultPeer (falls definiert). So kann mit folgendem Befehl etwa der Versand eines Videos ausgelöst werden:<br />
<br />
<code>doit set telegrambot sendMedia cam.mp4</code><br />
<br />
Soll eine Nachricht an einen anderen (bekannten) User geschickt werden, so ist die Angabe der ID des Users erforderlich. Dies kann dynamisch mit set-Logik und Abfrage der Readings erfolgen. Der folgende Befehl sendet das Video an den User, der das Kommando an den Bot geschickt hat:<br />
<br />
<code>doit set telegrambot sendMedia @[TB:msgChatId] cam.mp4</code><br />
<br />
Bei der Definition von Favoriten (siehe unten) kann genau so vorgegangen werden.{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut "cmdRestrictedPeer" setzen, damit nicht jeder Kommandos auf dem FHEM-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.<br />
}}<br />
<br />
==== Favoriten für Kommandos anlegen ====<br />
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf "Kurzwahl" legt.<br />
<br />
Beispiel-Kommandos wie z.B. <code>set TYPE=ROLLLADEN pos 100</code> und <code>set TYPE=ROLLLADEN pos 0</code>, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.<br />
<br />
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:<br />
<br />
<code>attr myTelegramBot favorites set TYPE=ROLLLADEN pos 100;set TYPE=ROLLLADEN pos 0</code><br />
<br />
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.<br />
Nehmen wir mal an man möchte die Favoriten mit <code>/short</code> ausführen können. Dazu muss dann das Attribut "cmdFavorites" setzen<br />
<br />
<code>attr myTelegramBot cmdFavorites /short</code><br />
<br />
Wenn man nun im Telegram Client<br />
<code>/short 1</code> an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.<br />
<br />
Ausserdem kann man im Telegram Client<br />
<code>/short</code> an den Bot schicken, dann antwortet der Bot mit<br />
<br />
<pre><br />
Favorites<br />
<br />
/short1 = set TYPE=ROLLLADEN pos 100<br />
<br />
/short2 = set TYPE=ROLLLADEN pos 0<br />
<br />
</pre><br />
<br />
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.<br />
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:<br />
<br />
<code>/[Rolllaeden zu ]=set TYPE=ROLLLADEN pos 100;/[Rolllaeden auf]=set TYPE=ROLLLADEN pos 0</code><br />
<br />
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:<br />
<br />
<pre><br />
Favorites<br />
<br />
/short1 = Rolllaeden zu<br />
<br />
/short2 = Rolllaeden auf<br />
<br />
</pre><br />
<br />
=== Nützliche Kombinationen mit weiteren Modulen ===<br />
<br />
==== msgConfig ====<br />
{{Link2CmdRef|Anker=msgConfig|Lang=de|Label=msgConfig}}<br />
<br />
{{Link2CmdRef|Anker=msgDialog|Lang=de|Label=msgDialog}}<br />
<br />
==== msgDialog ====<br />
[[MsgDialog]]<br />
<br />
==== MSG ====<br />
[[Msg]]<br />
<br />
{{Link2CmdRef|Anker=MSG|Lang=en|Label=MSG}}<br />
<br />
{{Link2Forum|Topic=39983|LinkText=Forum-Beitrag}}<br />
<br />
==== PostMe ====<br />
[[Modul PostMe#Steuerung per Telegram|PostMe]]<br />
<br />
{{Link2CmdRef|Anker=PostMe|Lang=de|Label=PostMe}}<br />
<br />
{{Link2CmdRef|Anker=TBot_List|Lang=en|Label=TBot_List}}<br />
<br />
==== ROOMATE ====<br />
{{Link2CmdRef|Anker=ROOMMATE|Lang=de|Label=ROOMMATE}}<br />
<br />
==== MAX ====<br />
[[MAX#Telegram-Benachrichtigung bei dauergeöffnetem Fenster|Dauer-offenes Fenster melden]]<br />
<br />
==== SSCAM - Steuerung von Kameras in Synology Surveillance Station - Schnappschüsse mit TelegramBot versenden ====<br />
[[SSCAM - Steuerung von Kameras in Synology Surveillance Station#Schnappschüsse mit TelegramBot versenden|Schnappschüsse mit TelegramBot versenden]]<br />
<br />
==== PRESENCE ====<br />
[[PRESENCE#Hinweis zur Benutzung / Fehlerhandling|Hinweis zur Benutzung / Fehlerhandling]]<br />
<br />
==== AMAD ====<br />
[[AMAD]]<br />
<br />
==== TALKTOME & TALKTOUSER ====<br />
[[TALKTOME & TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen#Beleuchtungssteuerung mit Telegram|Beleuchtungssteuerung mit Telegram]]<br />
<br />
==== Staumelder ====<br />
[[Staumelder#telegram|Staumelder]]<br />
<br />
==== Grafana ====<br />
[[Grafana#Speichern und Senden von Grafiken (zB_mit_Telegram)|Grafana-Plots versenden]]<br />
<br />
==== Talk2Fhem ====<br />
[[Talk2Fhem#Messenger Telegram|Talk2Fhem]]<br />
<br />
==== Hausüberwachung ====<br />
[[Hausüberwachung#Nachrichten aus dem Haus|Nachrichten aus dem Haus]]<br />
<br />
==== Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden ====<br />
<br />
{{Link2Forum|Topic=100119|Message=936495|LinkText=Forum-Beitrag}}<br />
<br />
==== Batterieüberwachung nur einmal täglich ====<br />
{{Link2Forum|Topic=99219|Message=926652|LinkText=Forum-Beitrag}}<br />
<br />
==== BOTVAC ====<br />
[[BOTVAC#MAPS|Saugroboter-Karten]]<br />
<br />
==== Unifi Voucher bereistellen über msgDialog ====<br />
[[Unifi#über Telegram|Unifi Voucher]]<br />
<br />
[[Unifi#Erkennung neuer clients|Erkennung unbekannter Clients]]<br />
<br />
<br />
== Links ==<br />
* Github Repository für die Telegram-FHEM Entwicklung: https://github.com/viegener/Telegram-fhem<br />
* Infos zum Telegram BotFather: https://core.telegram.org/bots#6-botfather<br />
<br />
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm<br />
<br />
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=FHEM-Forum}}<br />
* Telegram messaging system https://telegram.org/<br />
* TelegramBot API https://core.telegram.org/bots/api<br />
<br />
<references /><br />
[[Kategorie:Telegram]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=33973MSwitch2020-10-04T18:40:35Z<p>Maista: Aktuelle Modulversion 4.1</p>
<hr />
<div><br />
{{Hinweis|Das Modul wurde vom Modulautor aus dem FHEM-SVN entfernt. Download des Moduls unter https://github.com/Byte009/Fhem-MSwitch. Support erfolgt laut github-Seite derzeit über Whatsapp.}}<br />
<br />
Achtung: Das Wiki entspricht nicht mehr der aktuellen Modulversion ( V4.1 )<br />
<br />
Hilfe zu allen Befehlen , Einstellungen etc. ist direkt über das Frontend eines MSwitch-Devices verfügbar.<br />
<br />
Eine Aktualisierung des Wikis erfolgt in den kommenden Tagen.<br />
<br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt. Hauptmerkmale sind die fast vollständige und die sehr umfangreiche Konfigurierbarkeit über das Webinterface.<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=x<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09 (aus dem Forum abgemeldet)}}<br />
<br />
{{Randnotiz | RNTyp=y | RNText=Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
[[Datei:1-2-3-4.png|rahmenlos]]<br />
}}<br />
<br />
<br />
<br />
== Grundsätzliche Überlegungen ==<br />
{{Randnotiz | RNTyp=y | RNText=Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar).}} <br />
<br />
1. Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen? <br />
[[Datei:MSwitch basic.svg|mini|240px|Stark vereinfachtes Struktogramm]]<br />
Im Rahmen 1 des Webinterfaces lässt sich der Trigger (Auslöser) bzw. eine Zeitabhängigkeit konfigurieren:<br />
<br />
** jedes Event aus dem Eventmonitor,<br />
** triggerunabhängige Zeiten, <br />
** triggerunabhängige Zufallszeiten,<br />
** triggerunabhängige Intervalle,<br />
** Kombinationen aus Triggern und Zeiten.<br />
<br />
2. Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Ersten Rahmen: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
3. Welche Kommandos sollen ausgelöst werden?<br />
: Im vierten Rahmen des Webinterfaces werden dann die konkreten Kommandos eingegeben. Man wählt dabei aus einer Liste wie auf der Geräteseite Kommandos aus. FreeCmd erlaubt geräteunabhängige Kommandos, beispielsweise reinen Perl-Code.<br />
<br />
4. Welche weiteren Bedingungen sollen noch gelten?<br />
: Zusätzlich pro Gerät eine oder mehrere Instanzen des vierten Rahmens:<br />
** ereignisgesteuerte Bedingungen,<br />
** zeitgesteuerte Bedingungen,<br />
** Verzögerungen,<br />
** Wiederholungen etc.<br />
<br />
==Definition und Einrichtung =={{Randnotiz | RNTyp=y | RNText=Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save. Die Speicherung erfolgt durch den Befehl Fhemsave.<br />
}}<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird in der aktuellen Version über FHEM Update verteilt. MSwitch kann mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in den zwei möglichen Zweigen entsprechend der Kommandos cmd1 und cmd2. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle':<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
== Webinterface ==<br />
MSwitch wird über das Webinterface eingerichtet. Es besteht aus vier Teilen. Änderungen in einem Abschnitt müssen auch dort gespeichert werden, bevor ein weiterer Teil bearbeitet wird, sonst gehen Änderungen verloren.{{Randnotiz | RNTyp=y | RNText=<code>attr <name> MSwitch_Help 1</code> führt dazu, dass im Modul selber eine sehr umfangreiche kontextsensitive Hilfe in Form von Fragezeichensymbolen angezeigt wird.}} <br />
<br />
[[Datei:1-2-3-4.png|rahmenlos|Webinterface]]<br />
=== Rahmen 1: Trigger Device und Trigger Time ===<br />
==== Trigger Device ====<br />
{{Randnotiz | RNTyp=y | RNText=Wenn das Attribut 'MSwitch_Expert' gesetzt ist kann man 'GLOBAL' auswählen. Dann werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
==== Trigger Device Global Whitelist ====<br />
Damit kann die Liste eingehender Events weiter eingeschränkt werden. Sobald mindestens ein Eintrag vorhanden sind, werden nur noch Events der hier benannten Devices verarbeitet. Zulässig ind Devicenamen und DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
Im unten gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt.}}In diesem Feld wird das Device per Dropdownfeld gewählt, dessen Events eine Aktion auslösen sollen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
<br />
==== Trigger Time ==== <br />
Trigger time bietet die Möglichkeit einer zeitabhängigen Steuerung. Dazu wird in die "at"-Zeile ein Termin in der Form [STUNDEN:MINUTEN|TAGE] eingetragen. Die Tage werden ab Montag von 1-7 gezählt. Mehrere Zeitvorgaben können direkt hintereinander geschrieben werden. Beispiele:<br />
* <code>[17:00|1][18:30|23]</code> löst montags um 17 Uhr und dienstags sowie mittwochs um 18:30 Uhr aus.<br />
* <code>[00:10*20:00-21:00]</code> führt den Schaltbefehl von 20 Uhr bis 21 Uhr alle 10 Minuten aus.<br />
* <code>[?20:00-21:00]</code> schaltet zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr einmalig. <br />
* <code>[20:00|$we]</code> nur am Wochenende um 20:00 wird geschaltet.<br />
<br />
==== Trigger Conditions ====<br />
<br />
Optionale zusätzliche Bedingungen in diesem Feld gelten nur für auslösende Device Trigger. Trigger Times haben keinen Einfluss, es sei denn, das Attribut MSwitch_Condition_Time ist gesetzt. Man kann mit AND / OR verknüpfte Bedingungen für die Auslösung in an DOIF angelehnter Syntax angeben. Leere Felder werden ignoriert. Werden Readings mit Strings wie 'on' oder 'off' abgefragt, ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden. Beispiele:{{Randnotiz | RNTyp=y | RNText=Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).}} <br />
* <code>[19:10-23:00] AND [Devicename:Reading] = 10</code> beide Bedingungen müssen erfüllt sein.<br />
* <code>[19:10-23:00] OR [Devicename:Reading] eq "on"</code> eine der Bedingungen muss erfüllt sein.<br />
* <code>[10:00-11:00|13]</code> schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
* <code>[{ sunset() }-23:00]</code> von Sonnenuntergang bis 23:00 Uhr.<br />
* <code>{ !$we }</code> löst den Schaltvorgang nur Werktagen an aus.<br />
* <code>{ $we }</code> löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
=== Rahmen 2: Trigger Details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Der Inhalt des zweiten Rahmens wird mit dem gewählten Trigger aus dem ersten Rahmen initialisiert. Events können zugeordnet werden. Im Beispiel wird cmd1 ausgelöst, wenn das Fenster offen ist. Cmd2 wird bei Temperaturunterschreitung ausgelöst.<br />
<br />
==== execute ====<br />
Diese vier Zeilen legen fest, welches ankommende Event welchen Befehlszweig auslösen soll. Die Event-Drop-Down-Liste enthält alle empfangenen Events dieses Devices. Fehlende Events können manuell hinzugefügt werden.<br />
<br />
* switch <MSwitch> on + execute 'cmd1' - MSwitch Statusänderung auf 'on'; cmd1 soll ausgeführt werden<br />
* switch <MSwitch> off + execute 'cmd2' - MSwitch Statusänderung auf 'off'; cmd2 soll ausgeführt werden; <br />
* execute 'cmd1' only - keine Statusänderung; cmd1 soll ausgeführt werden<br />
* execute 'cmd2' only - keine Statusänderung; cmd2 soll ausgeführt werden<br />
<br />
==== Save incomming events ====<br />
Alle ankommenden Events der konfigurierten Geräte werden für die Dropdownlisten gespeichert. Nach erfolgreicher Konfiguration sollte diese Option entfernt werden, um die Datenmenge zu reduzieren. Falls das Device Events während der Konfiguration nicht liefert, können sie manuell als kommagetrennte Liste hinzugefügt werden.<br />
<br />
==== add event ====<br />
{{Randnotiz | RNTyp=y | RNText=Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br />
- * - alle auftretende Events des entsprechenden Device<br />
- device:reading:wert (z.B. device:state:on ) - nur für das Event "device:state:on"<br />
- device:reading:* (z.B. device:state:* ) - Events "device:state:(on,off,etc.)<br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Events "device:state:left" oder "devicestate:right" etc.<br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
}} <br />
* * - alle auftretende Events des entsprechenden Device<br />
* reading:wert (z.B. state:on ) - nur auf das Event "state:on"<br />
* reading:* (z.B. state:* ) - Events "state:(on,off,etc.)<br />
* reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Events "state:left" oder "state:right" etc.<br />
==== test event ====<br />
Stehen Events zur Auswahl, kann die Konfiguration getestet werden. Durch Klick wird das Event simuliert und die dafür definierte Aktion ausgelöst. <br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt???<br />
<br />
==== clear saved event ====<br />
Es werden die nicht als Trigger wirkenden Events aus der Liste gelöscht.<br />
<br />
=== Rahmen 3: Affected devices ===<br />
{{Randnotiz | RNTyp=y | RNText=In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
}} <br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Auswahl der Devices, die auf die oben konfigurierten Events reagieren sollen. Um unbeabsichtigte Änderungen zu vermeiden ist die direkte Mehrfachauswahl gesperrt.<br />
<br />
=== Rahmen 4: Device Actions ===<br />
<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Die auszuführenden Aktionen der im dritten Rahmen gewählten Geräte. Leere Felder werden ignoriert.<br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
{{Randnotiz | RNTyp=y | RNText=Im Beispiel befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail).<br />
}} <br />
Man wählt den gewünschten Befehl aus den gespeicherten verfügbaren Möglichkeiten des betreffenden Device aus. <br />
<br />
* Im Sonderfall FreeCmd wird der Befehl als String eingegeben. <br />
* Das Attribut MSwitch_Extensions ergänzt die Schaltoption 'MSwitchToggle' in der Liste, um die Toggle-Funktion bei Geräten die sie nicht von Haus aus anbieten nachzurüsten. <br />
<br />
{{Randnotiz | RNTyp=y | RNText=Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
).<br />
}}<br />
<br />
==== cmd1/cmd2 condition ====<br />
<br />
{{Randnotiz | RNTyp=y | RNText=Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
}} <br />
Die Ausführung der Befehle kann '''pro gewählten Gerät''' analog Rahmen 1 von weiteren Bedingungen abhängig gemacht werden. Es gelten die gleichen Regeln und Beispiele wie im 'Rahmen 1 Trigger Conditions'. Sie können sinngemäß übernommen werden.<br />
<br />
Die Variable <code>$EVENT</code> enthält den auslösenden Trigger. Wenn unter 'Rahmen 1 Trigger Conditions' ein Wildcard verwendet wurde, kann nun feingefiltert werden, indem das konkrete Ereignis angegeben wird. <br />
<br />
Beispiel: <code>[$EVENT] eq "state:on"</code> würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war.<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen. Einzelheiten enthält auch das Funktions-Struktogramm.<br />
<br />
Statt einer direkten Zeitangabe kann hier auch auf eine verwiesen werden, indem in der Form [NAME.reading] ein Reading eines Devices wie z.B. [dummy.state] angegeben wird.<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiterer Rahmen 4 als Rahmen 4.1 für das gleiche Device angelegt werden, um z.B. einen weiteren Befehl gegebenenfalls zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der gewählte Rahmen 4 für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
<br />
Die Felder 'Repeats', 'Repeatdelay in s' und 'priority' stehen zur Verfügung, wenn das Attribut MSwitch_Expert gesetzt wurde. Diese bewirken eine n-fache Wiederholung des gesetzten Befehls mit m Sekunden Verzögerung. Das Auswahlfeld 'priority' erscheint bei jedem 'affectes device'. So kann die Reihenfolge der Befehlsabarbeitung beeinflusst werden.<br />
<br />
== Erweiterte Konfiguration ==<br />
<br />
=== Set-Befehle ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|set active||Setzt das MSwitch-Device in den Status 'active'.<br />
|-<br />
|set inactive||Setzt das Device in den Status 'inactive'. Es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
|-<br />
|set on<nowiki>|</nowiki>off [<parameter>]||Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt. Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
|-<br />
|set reload_timer||Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
|-<br />
|set change_renamed <oldname> <newname>||Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
|-<br />
|set exec_cmd1 <nowiki>|</nowiki> set exec_cmd1 ID [<ID>]||Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
|-<br />
|set MSwitch_backup||Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg. Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
|-<br />
|set del_delays <nowiki>|</nowiki> set exec_cmd1 ID [<ID>]||Löscht alle anstehenden, verzögerten Befehle (delays).<br />
|-<br />
|set reset_cmd_count: 1<nowiki>|</nowiki>2||Löscht das entsprechende EVT_CMD_COUNT - Reading; entspricht damit einer Rückstellung auf '0'.<br />
|-<br />
|set fakeevent [<device>]:<reading>:<arg>||Beispiel: <device> fakeevent state:on<br><br />
Das MSwitch Device reagiert so, als wäre statt des internen "fakes-Befehls" ohne FHEM-Systembeeinflussung dieses Event tatsächlich vom triggernden Gerät generiert worden. <br />
<br />
Der Name (<device>) muss bei GLOBALEN Triggern mit angegeben werden, sonst wird das Device automatisch gesetzt.<br />
Um z.B. einen Watchdog zu realisieren ist es eventuell nötig, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay Affected Device. Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. Möglicherweise steht dieser Befehl zukünftig nur noch zur Verfügung, wenn Safemode aktiviert ist.<br />
|}<br />
<br />
=== Get-Befehle ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|get show_timer [<show><delete>]||<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
|-<br />
|get restore_MSwitch_data [<this_device><nowiki>|</nowiki><all_devices>]||<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM..<br />
|-<br />
|get_config||Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
|-<br />
|get_support_info||Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
|-<br />
|get_MSwitch_preconf||Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
|}<br />
<br />
=== Attribute ===<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|MSwitch_Debug <0<nowiki>|</nowiki>1<nowiki>|</nowiki>2<nowiki>|</nowiki>3<nowiki>|</nowiki>4>||<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Der Inhalt der Protokolldatei wird direkt im Device angezeigt<br><br />
3 - Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt.<br><br />
4 - erweitertes Debugfür Entwickler mit wechselnden Funktionen<br><br />
|-<br />
|MSwitch_Expert <0<nowiki>|</nowiki>1>||<br />
* In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
* Die Felder 'Repeats' und 'Repeatdelay in s' stehen zur Verfügung. Dies bewirkt eine n-fache Wiederholung des gesetzten Befehls mit m Sekunden Verzögerung.<br />
<br />
* Das Auswahlfeld 'priority' erscheint bei jedem 'affectes device'. So kann die Reihenfolge der Befehlsabarbeitung beeinflusst werden.<br />
|-<br />
|MSwitch_Sequenz <Suchmuster> ??? ||<br />
Eine Schaltsequenz kann durch ein oder mehrere durch '/' getrennte Suchmuster angegeben werden. Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
Beispiel: <code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden. Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
|-<br />
|MSwitch_Sequence_time <Zeit in Sekunden>||Maximalzeit in Sekunden, um eine Sequenz vollständig auszuführen. (Was wenn diese Zeit überschritten wird???)<br />
|-<br />
|MSwitch_Extensions <0<nowiki>|</nowiki>1>||Es wird zusätzlich zu 'on' und 'off' die Schaltoption 'MSwitchToggle' in der Liste angeboten, um die Toggle-Funktion bei Geräten die sie nicht von Haus aus anbieten nachzurüsten.<br />
|-<br />
|MSwitch_Delete_Delays <0<nowiki>|</nowiki>1>||Eins bewirkt das Löschen aller anstehende Delays bei dem Auftreten eines erneuten passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorher getriggerten Event erhalten und werden ausgeführt. Empfohlene Einstellung: 1<br />
|-<br />
|MSwitch_Include_Devicecmds <0<nowiki>|</nowiki>1>||Bewirkt die Aufnahme aller Devices die bei Abfrage mit 'set DEVICE ?' einen eigenen Befehlssatz liefern in die Auswahlliste 'Affected Devices'. Bei Option '0' werden diese Devices in der Liste nicht mehr angeboten. Empfohlene Einstellung: 1<br />
|-<br />
|MSwitch_Include_Webcmds <0<nowiki>|</nowiki>1>||Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option '0' werden diese Devices nicht mehr angeboten, es sei denn, sie liefern mit 'set DEVICE ?' einen eigenen Befehlssatz. Empfohlene Einstellung: 0, Einsatz nach Bedarf.<br />
|-<br />
|MSwitch_Activate_MSwitchcmds <0<nowiki>|</nowiki>1>||Fügt jedem vorhandenen Device das Attribut 'MSwitchcmd' hinzu.<br />
|-<br />
|MSwitch_Include_MSwitchcmds <0<nowiki>|</nowiki>1> ||Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option '0' werden diese Devices nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz mit 'set DEVICE ?' liefern. Empfohlene Einstellung: 0, Einsatz nach Bedarf.<br />
|-<br />
|MSwitch_Lock_Quickedit <0<nowiki>|</nowiki>1>||Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option '1' ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden, um versehentliche Änderungen zu vermeiden. Die Auswahl einer Option ohne betätigte <Strg>-Taste bewirkt das Löschen aller bereits gesetzten Optionen. Empfohlene Einstellung: 1<br />
|-<br />
|MSwitch_Startdelay <0<nowiki>|</nowiki>10<nowiki>|</nowiki>20<nowiki>|</nowiki>30<nowiki>|</nowiki>60> ||MSwitch ignoriert nach einem FHEM-Neustart für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen geändert werden. Empfohlene Einstellung: 30<br />
|-<br />
|MSwitch_Ignore_Types||Beinhaltet eine durch Leerzeichen getrennte Liste von Device-''Typen'' welche nicht geschaltet werden oder nicht geschaltet werden können. Sie werden dann in den Auswahllisten ''nicht'' dargestellt, um die Auswahllisten übersichtlich zu halten.Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul. <br />
<br />
???Wenn statt des Devicetyps ein devspec z.B. "TYPE=watchdog" angegeben wird, ist zu beachten, dass alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!???<br />
<br />
|-<br />
|MSwitch_Trigger_Filter ||Beinhaltet eine kommagetrennte Liste von Events, die im Falle ihres Eingangs unberücksichtigt und ungespeichert bleiben. Wildcards wie '*' können angegeben werden. Empfohlene Einstellung: -<br />
|-<br />
|MSwitch_Wait <n in Sekunden>||Bei gesetztem Attribut nimmt das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events.<br />
<br />
|-<br />
|MSwitch_Event_Id_Distributor|| ??? Voraussetzung ist, dass das Attribut 'MSwitchExpert' auf '1' gesetzt ist. Es können auslösende Events ID-Aktionen umgeleitet werden. Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. mehrere getriggert werden (regex state:(on |off)) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohne ID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet: <code>state:on=>cmd1 ID 1,2</code> Entsprechend werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen. ???<br />
<br />
|-<br />
|MSwitch_Selftrigger_always <0<nowiki>|</nowiki>1> ||(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes '1' bewirkt, dass alle SET Aktionen des Devices einen internen Event ohne Auswirkungen auf das FHEM-System auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden. Auftretende auswertbare interne Events haben immer folgendes Format: <br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind. Der 'wait' Befehl/Attribut hat keine wirkung.<br />
|-<br />
|MSwitch_Mode <Notify<nowiki>|</nowiki>Full<nowiki>|</nowiki>Toggle<nowiki>|</nowiki>Dummy> ||Schaltet das Modul zwischen angepassten Weboberflächen-Modi um.<br />
<br />
Notify<br />
Das Device kann nicht manuell umgeschaltet werden. Es gibt nur die zwei ausführbaren Zweige "execute 'cmd1' commands" und "execute 'cmd2' commands". Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active' Dieser Mode ist ähnlich zu einem FHEM-Notify.<br />
<br />
Full<br />
Es stehen alle Funktionen zur Verfügung.<br />
Toggle<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'umgeschaltet', ??? entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt. ???<br />
Dummy<br />
ACHTUNG: Funktionsänderung mit V2.61 Der Mode 'Dummy' ist ein eingeschränkter Modus. Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen. Der Dummy-Mode kann nur in einem neu angelegten leeren MSwitch aktiviert und auch nicht wieder verlassen werden! Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) sind Umschalt-Optionen nicht mehr verfügbar.<br />
<br />
|-<br />
|MSwitch_Condition_Time <0<nowiki>|</nowiki>1> ||In der Grundeinstellung '0' werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung '1' wird diese Überprüfung wie für Events zugeschaltet.<br />
<br />
|-<br />
|MSwitch_Random_Time <HH:MM:SS-HH:MM:SS> || Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls (Delay) eine Zufallszeit generiert, die im Rahmen der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von '[random]' immer '00:00:00'<br />
<br />
|-<br />
|MMSwitch_Random_Number <n> ||Bei Aktivierung dieses Attributes mit einer beliebigen ganzen Zahl, werden vom Device die zwei Readings 'RandomNr' und 'RandomNr1' und mit Werten zwischen null und n angelegt. RandomNr wird vor jedem Ausführen eines Befehls, auch für unterschiedliche Geräte in einem Durchgang, neu generiert. RandomNr1 bleibt nach der Initialisierung konstant. Wenn auf dieses Readings in einer Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen wird, wird der Befehl nur ausgeführt, wenn ReadingNr1 gerade = 1 ist. Der Befehl wird somit nur mit einer Wahrscheinlichkeit von eins zu n ausgeführt.<br />
<br />
|-<br />
|MSwitch_Reset_EVT_CMD1(2)_COUNT ||Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt. Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
|-<br />
|MSwitch_Safemode <0<nowiki>|</nowiki>1> ||Bietet einen gewissen Schutz vor falschen Konfigurationen und dadurch entstehenden Endlosschleifen. Bei aktiviertem Attribut '1' beendet das Modul Endlosschleifen eines Devices. In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt. Es wird ein letztes Event generiert, auf das reagiert werden kann <code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code> Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis. In der Grundkonfiguration ist dieses Attribut nicht gesetzt. Es empfiehlt sich aber, bei neuen bzw. komplizierten Devices, dieses zumindest anfänglich zu aktivieren.<br />
|-<br />
|MSwitch_Read_Log<0<nowiki>|</nowiki>1> ||Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Der im Logeintrag vorhandene Devicename ist Bedingung für die Funktion.<br />
|-<br />
|MSwitch_Help<0<nowiki>|</nowiki>1> ||Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
|-<br />
|MSwitch_Comments<0<nowiki>|</nowiki>1> ||Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
|-<br />
|MSwitch_generate_Events<0<nowiki>|</nowiki>1> ||Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
|-<br />
|MSwitch_Startdelay||???Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das Device nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.??? (Hatten wir das nicht schon?)<br />
<br />
|-<br />
|MSwitch_Inforoom ||Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
|}<br />
<br />
== Integrierte Funktionen ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|Average||???<br />
|-<br />
<br />
|Difference||<br />
* Syntax: [DIFF<wert>:<reading>] > <differenz><br />
* Beispiel: [DIFF2:countdown] > 0<br />
* Reading: entspricht dem getriggerten Reading.<br />
* Wert: gespeicherter Wert (in diesem Fall der vorletzte).<br />
* Differenz: geforderte Differenz zwischen aktuellem und vorletztem Wert.<br />
* Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
Folgende Readings werden zur Verfügung gestellt:<br />
* DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
* DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
|-<br />
|Increase||???<br />
|-<br />
|Tendency||<br />
*Syntax: [TEND<wert>:<reading>] > <Mindestwert><br />
*Beispiel: [TEND2:countdown] > 2<br />
*Reading: entspricht dem getriggerten Reading.<br />
*Wert: Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen. Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte. Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
*Mindestwert: Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
|}<br />
<br />
== Funktions-Struktogramm ==<br />
[[Datei:MSwitch full.svg|Struktogramm des Funktionsprinzips]]<br />
<br />
== Anwendungs-Beispiele ==<br />
<br />
=== [[Blinken - Rechteckgenerator]] ===<br />
=== [[Blinken - Impulsgenerator mit variablem Tastgrad]] ===<br />
=== [[Schmitt-Trigger - Temperaturabhängiges Schalten]] ===<br />
=== [[Linearschalter]] ===<br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}<br />
* {{Link2Forum|Topic=86199|Message=990265|LinkText=Bewegungsmelder}}<br />
* {{Link2Forum|Topic=86199|Message=974592|LinkText=Rauch und Hitzemelder steuern}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=AT_um_eine_Temperaturabh%C3%A4ngige_Nachtabsenkung_zu_realisieren&diff=33367AT um eine Temperaturabhängige Nachtabsenkung zu realisieren2020-06-07T19:45:45Z<p>Maista: drei "war" in einem Satz</p>
<hr />
<div>'''Für die Grundlegende Funktion von [[at]] bitte einen Blick in die {{Link2CmdRef|Anker=at}} werfen.'''<br />
<br />
<ins>Zielvorgabe:</ins><br />
<br />
Jeden Tag um 22:30 soll die Temperatur auf 17° abgesenkt werden (hier das FHEM-Gerät "wz_Heizung") wenn die Temperatur vorher über 17° eingestellt war - war die Temperatur vorher niedriger eingestellt, soll nichts passieren.<br />
<br />
Der Befehl für die [[Konfiguration]] lautet dazu wie folgt:<br />
<br />
Einzeiler:<br />
<br />
:<code>define wz_HeizungNachtabsenkung at 22:30:00 {if(ReadingsVal('wz_Heizung', 'desired-temp', 0) &gt; 17.0) {fhem(&quot;set wz_Heizung desired-temp 17.0&quot;)} }</code><br />
<br />
Mehrzeiler:<br />
<br />
<nowiki>define wz_HeizungNachtabsenkung at 22:30:00 {\<br />
if(ReadingsVal('wz_Heizung', 'desired-temp', 0) &gt; 17.0) {\<br />
fhem(&quot;set wz_Heizung desired-temp 17.0&quot;)\<br />
}\<br />
}</nowiki><br />
Im Detail:<br />
<br />
* ''define wz_HeizungNachtabsenkung'' =&gt; lege ein neues Objekt ''wz_HeizungNachtabsenkung'' und ...<br />
* ''at *22:30:00'' =&gt; ... prüfe täglich um 22:30 Uhr ...<br />
* ''if(ReadingsVal('wz_Heizung', 'desired-temp', 0) &gt; 17.0'' =&gt; ... ob ''(ReadingsVal -&gt; lese Werte)'' ...<br>''('wz_Heizung', 'desired-temp', 0)''=&gt; ... ob am Gerät ''wz_Heizung''der Wert ''desired-temp''...<br>''&gt; 17.0''=&gt; ... größer als 17.0 ist, wenn ja dann ...<br />
* ''fhem("set wz_Heizung desired-temp 17.0")'' =&gt; ... soll FHEM am Gerät ''wz_Heizung'' den Wert ''desired-temp'' auf 17.0° setzen.<br />
<br />
'''Anmerkung zu ReadingsVal:'''<br />
<nowiki>ReadingsVal(&lt;DeviceName&gt;, &lt;ReadingsName&gt;, &lt;Defaultwert&gt;)</nowiki><br />
Damit wird das entsprechende Reading am entsprechenden Device ausgelesen. Gibt es das Reading nicht, wird Defaultwert zurückgegeben.<br />
<br />
Man kann Prozedurergebnisse (wie dieses von ReadingsVal) und Variablen bei Vergleichen natürlich mischen, und muss diese Ergebnisse nicht unbedingt in Variablen zwischenspeichern. Das tut man meistens nur, wenn das Ermitteln viel Zeit in Anspruch nimmt und man diesen mehrfach benötigt, oder der Wert durch Überschreiben verloren geht.<br />
<br />
Perl hat als Besonderheit, dass man einer Variablen nicht ansieht, ob sie eine Zahl oder einen String enthält. Das sind alles sogenannte Skalare (im Gegensatz zu Arrays oder Hashlisten). Um bei einem Vergleich aber die durchaus unterschiedlichen Ergebnisse erzwingen zu können, gibt es eben unterschiedliche Operatoren dafür:<br />
<br />
<nowiki>&lt;, &gt;, &lt;=, &gt;=, ==,&#160;!= sind numerische Operatoren<br />
lt, gt, le, ge, eq, ne sind die entsprechenden Stringvergleichsoperatoren</nowiki><br />
Beispiel:<br />
<br />
<nowiki>my $var1 = '10';<br />
my $var2 = '2';<br />
# Ergibt true:<br />
if ($var1 &gt; $var2)...<br />
# Ergibt false:<br />
if ($var1 gt $var2)...</nowiki><br />
Für weitere Beispiele bietet es sich an auch mal einen Blick in die ''fhem.pl ''zu werfen.<br />
<br />
[[Kategorie:Code Snippets]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=List&diff=33272List2020-05-23T20:46:20Z<p>Maista: /* list -r */</p>
<hr />
<div>{{SEITENTITEL:list}}<br />
{{Infobox Modul<br />
|ModPurpose=Befehl zur Auflistung von Gerätedefinitionen<br />
|ModType=cmd<br />
|ModCmdRef=list<br />
|ModForumArea=Sonstiges<br />
|ModTechName=fhem.pl ("Built-in")<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
Der Befehl [[list]] dient dazu, Informationen über Geräte (Devices) anzuzeigen. Dabei können entweder Details zu einem einzelnen Gerät ausgegeben werden, oder eine Liste von Geräten (Gerätenamen) mit bestimmten gemeinsamen Attributen. Wenn mehrere Geräte aufgelistet werden, lässt sich zu jedem zusätzlich der Wert eines oder mehrerer Internals, Readings oder Attribute mit ausgeben.<br />
<br />
Der Befehl kann direkt über das Eingabefeld des [[FHEMWEB|Webfrontends]] oder über die telnet Schnittstelle eingegeben werden. <br />
<br />
== Beispiele ==<br />
{{Randnotiz|RNText=Für alle Beispiele gilt: im Webfrontend lassen sich die Namen der ausgegebenen Geräte direkt anklicken, um in die zugehörige Detail-Ansicht zu gelangen. Dies ist besonders für [[weblink]], [[SVG]] oder [[readingsGroup]] Geräte nützlich, die in der Raum-Ansicht eventuell keinen solchen Link auf die Detail-Ansicht zeigen.}}<br />
=== Alle Geräte mit bestimmten Namen mit ihrer Definition ===<br />
Auflistung der Definitionen aller Geräte von FHEM:<br />
:<code><nowiki>list .* DEF</nowiki></code><br />
<br />
Auflistung der Definitionen der Geräte, die mit wz beginnen.<br />
:<code><nowiki>list wz.* DEF</nowiki></code><br />
<br />
=== Alle Geräte eines bestimmten Typs ===<br />
Mit dem Befehl <br />
:<code><nowiki>list TYPE=FS20</nowiki></code><br />
wird eine Liste (die Namen) aller Geräte des Typs [[FS20]] ausgegeben. <br />
<br />
=== Alle Geräte ohne TYPE ===<br />
Manche Fehlersituationen in FHEM werden verursacht durch Geräte, bei denen kein ''Internal'' mit dem Namen ''TYPE'' festgelegt ist (was eigentlich eine ungültige Definition ist). Diese Geräte-Definitionen lassen sich mit dem Befehl <br />
:<code><nowiki>{ join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</nowiki></code><br />
identifizieren. Mithilfe dieser Information lässt sich dann z.B. ein solches Gerät [[delete|löschen]]. <br />
<br />
Ein derartiges Szenario ist unter anderem in diesem {{Link2Forum|Topic=41137|LinkText=Forenthema}} beschrieben.<br />
<br />
=== Alle Geräte mit einem bestimmten Attribut ===<br />
Im Zusammenhang mit Verhaltensänderungen eines Attributs (wie z.B. bei [[userReadings]] geschehen), kann es sinnvoll sein, alle Devices aufzulisten, bei denen dieses Attribut verwendet wurde.<br />
;alle Devices, bei denen das Attribut ''userReadings'' (auf einen beliebigen Wert gesetzt) ist:<br />
:<code>list userReadings=[a-zA-Z].*</code> oder <br /><code>list userReadings=.+</code> oder <br /><code>list userReadings=\w.*</code> oder <br /><code>list userReadings=..*</code><br />
<br />
=== Alle Geräte in einem Raum ===<br />
[[Datei:ListRoom.png|mini|right|Ausgabebeispiel eines ''list'' Befehls]]<br />
Mit dem Befehl <br />
:<code><nowiki>list room=TV</nowiki></code><br />
werden die Namen aller Geräte aufgeführt, die ein Attribut ''room'' mit dem Wert ''TV'' haben. Durch einen Klick auf den Gerätenamen wird die Detailansicht des Gerätes aufgerufen.<br />
<br />
=== Attributwert zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM serialNr</code><br />
werden die Seriennummern aller Homematic Geräte aufgelistet.<br />
<br />
=== Mehrere Werte zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM:FILTER=serialNr=..* serialNr model</code><br />
werden die Seriennummer und die Modellbezeichnung aller Homematic Geräte aufgelistet, die auch eine Seriennummer haben.<br />
<br />
=== Gezieltes Auflisten von Internal, Reading oder Attribut ===<br />
Bei manchen Geräten gibt es Internals, Readings oder Attribute mit gleichem Namen. Da ''list'' jeweils nur das erste Vorkommen zeigt und nicht sichtbar macht, was genau gefunden wurde, ist die Ausgabe manchmal nicht eindeutig. Um das zu vermeiden, lässt sich mit dem Präfix i:, r: oder a: vor dem Namen des anzuzeigenden Wertes angeben, welcher der drei möglichen Typen ausgegeben werden soll.<br />
<br />
== Erweiterte Optionen ==<br />
Mit den Optionen -r und -R kann eine erweiterte Ausgabe erzielt werden. Diese sollte bei der Erstellung eines Threads im Forum zu allen beteiligten Geräten mit angegeben werden. Die Optionen können auch hilfreich sein, um Teile der [[Konfiguration]] schnell zwischen unterschiedlichen Installationen zu kopieren, z.B. von einem oder in ein Testsystem (siehe auch [[Import von Code Snippets]]). <br />
=== list -r ===<br />
Dabei werden auch die derzeitigen Stände der Readings mit ausgegeben. Für die Angabe des Gerätenamens ist dabei die Verwendung jeder {{Link2CmdRef|Anker=devspec|Label=devspec}} zulässig.<br />
<br />
Beispiele:<br />
:<code><nowiki>list -r TV</nowiki></code><br />
:<code><nowiki>list -r</nowiki></code><br />
<br />
=== list -R ===<br />
Mit dieser Option werden auch die Geräte samt aktueller Zustände mit ausgegeben, die als '''probably associated with'' erkannt worden sind.<br />
<br />
Beispiel:<br />
:<code><nowiki>list -R TV</nowiki></code><br />
<br />
== Links ==<br />
* [[Import von Code Snippets|RAW Definition]]<br />
<br />
[[Kategorie:FHEM-Verwendung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=List&diff=33271List2020-05-23T20:43:58Z<p>Maista: /* list -r */</p>
<hr />
<div>{{SEITENTITEL:list}}<br />
{{Infobox Modul<br />
|ModPurpose=Befehl zur Auflistung von Gerätedefinitionen<br />
|ModType=cmd<br />
|ModCmdRef=list<br />
|ModForumArea=Sonstiges<br />
|ModTechName=fhem.pl ("Built-in")<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
Der Befehl [[list]] dient dazu, Informationen über Geräte (Devices) anzuzeigen. Dabei können entweder Details zu einem einzelnen Gerät ausgegeben werden, oder eine Liste von Geräten (Gerätenamen) mit bestimmten gemeinsamen Attributen. Wenn mehrere Geräte aufgelistet werden, lässt sich zu jedem zusätzlich der Wert eines oder mehrerer Internals, Readings oder Attribute mit ausgeben.<br />
<br />
Der Befehl kann direkt über das Eingabefeld des [[FHEMWEB|Webfrontends]] oder über die telnet Schnittstelle eingegeben werden. <br />
<br />
== Beispiele ==<br />
{{Randnotiz|RNText=Für alle Beispiele gilt: im Webfrontend lassen sich die Namen der ausgegebenen Geräte direkt anklicken, um in die zugehörige Detail-Ansicht zu gelangen. Dies ist besonders für [[weblink]], [[SVG]] oder [[readingsGroup]] Geräte nützlich, die in der Raum-Ansicht eventuell keinen solchen Link auf die Detail-Ansicht zeigen.}}<br />
=== Alle Geräte mit bestimmten Namen mit ihrer Definition ===<br />
Auflistung der Definitionen aller Geräte von FHEM:<br />
:<code><nowiki>list .* DEF</nowiki></code><br />
<br />
Auflistung der Definitionen der Geräte, die mit wz beginnen.<br />
:<code><nowiki>list wz.* DEF</nowiki></code><br />
<br />
=== Alle Geräte eines bestimmten Typs ===<br />
Mit dem Befehl <br />
:<code><nowiki>list TYPE=FS20</nowiki></code><br />
wird eine Liste (die Namen) aller Geräte des Typs [[FS20]] ausgegeben. <br />
<br />
=== Alle Geräte ohne TYPE ===<br />
Manche Fehlersituationen in FHEM werden verursacht durch Geräte, bei denen kein ''Internal'' mit dem Namen ''TYPE'' festgelegt ist (was eigentlich eine ungültige Definition ist). Diese Geräte-Definitionen lassen sich mit dem Befehl <br />
:<code><nowiki>{ join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</nowiki></code><br />
identifizieren. Mithilfe dieser Information lässt sich dann z.B. ein solches Gerät [[delete|löschen]]. <br />
<br />
Ein derartiges Szenario ist unter anderem in diesem {{Link2Forum|Topic=41137|LinkText=Forenthema}} beschrieben.<br />
<br />
=== Alle Geräte mit einem bestimmten Attribut ===<br />
Im Zusammenhang mit Verhaltensänderungen eines Attributs (wie z.B. bei [[userReadings]] geschehen), kann es sinnvoll sein, alle Devices aufzulisten, bei denen dieses Attribut verwendet wurde.<br />
;alle Devices, bei denen das Attribut ''userReadings'' (auf einen beliebigen Wert gesetzt) ist:<br />
:<code>list userReadings=[a-zA-Z].*</code> oder <br /><code>list userReadings=.+</code> oder <br /><code>list userReadings=\w.*</code> oder <br /><code>list userReadings=..*</code><br />
<br />
=== Alle Geräte in einem Raum ===<br />
[[Datei:ListRoom.png|mini|right|Ausgabebeispiel eines ''list'' Befehls]]<br />
Mit dem Befehl <br />
:<code><nowiki>list room=TV</nowiki></code><br />
werden die Namen aller Geräte aufgeführt, die ein Attribut ''room'' mit dem Wert ''TV'' haben. Durch einen Klick auf den Gerätenamen wird die Detailansicht des Gerätes aufgerufen.<br />
<br />
=== Attributwert zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM serialNr</code><br />
werden die Seriennummern aller Homematic Geräte aufgelistet.<br />
<br />
=== Mehrere Werte zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM:FILTER=serialNr=..* serialNr model</code><br />
werden die Seriennummer und die Modellbezeichnung aller Homematic Geräte aufgelistet, die auch eine Seriennummer haben.<br />
<br />
=== Gezieltes Auflisten von Internal, Reading oder Attribut ===<br />
Bei manchen Geräten gibt es Internals, Readings oder Attribute mit gleichem Namen. Da ''list'' jeweils nur das erste Vorkommen zeigt und nicht sichtbar macht, was genau gefunden wurde, ist die Ausgabe manchmal nicht eindeutig. Um das zu vermeiden, lässt sich mit dem Präfix i:, r: oder a: vor dem Namen des anzuzeigenden Wertes angeben, welcher der drei möglichen Typen ausgegeben werden soll.<br />
<br />
== Erweiterte Optionen ==<br />
Mit den Optionen -r und -R kann eine erweiterte Ausgabe erzielt werden. Diese sollte bei der Erstellung eines Threads im Forum zu allen beteiligten Geräten mit angegeben werden. Die Optionen können auch hilfreich sein, um Teile der [[Konfiguration]] schnell zwischen unterschiedlichen Installationen zu kopieren, z.B. von einem oder in ein Testsystem (siehe auch [[Import von Code Snippets]]). <br />
=== list -r ===<br />
Dabei werden auch die derzeitigen Stände der Readings mit ausgegeben. Für die Angabe des Gerätenamens ist dabei die Verwendung jeder {{Link2CmdRef|Anker=devspec|Label=devspec}} zulässig.<br />
<br />
Beispiel:<br />
:<code><nowiki>list -r TV</nowiki></code><br />
:<code><nowiki>list -r</nowiki></code><br />
<br />
=== list -R ===<br />
Mit dieser Option werden auch die Geräte samt aktueller Zustände mit ausgegeben, die als '''probably associated with'' erkannt worden sind.<br />
<br />
Beispiel:<br />
:<code><nowiki>list -R TV</nowiki></code><br />
<br />
== Links ==<br />
* [[Import von Code Snippets|RAW Definition]]<br />
<br />
[[Kategorie:FHEM-Verwendung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=List&diff=33270List2020-05-23T20:43:13Z<p>Maista: /* list -r */</p>
<hr />
<div>{{SEITENTITEL:list}}<br />
{{Infobox Modul<br />
|ModPurpose=Befehl zur Auflistung von Gerätedefinitionen<br />
|ModType=cmd<br />
|ModCmdRef=list<br />
|ModForumArea=Sonstiges<br />
|ModTechName=fhem.pl ("Built-in")<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
Der Befehl [[list]] dient dazu, Informationen über Geräte (Devices) anzuzeigen. Dabei können entweder Details zu einem einzelnen Gerät ausgegeben werden, oder eine Liste von Geräten (Gerätenamen) mit bestimmten gemeinsamen Attributen. Wenn mehrere Geräte aufgelistet werden, lässt sich zu jedem zusätzlich der Wert eines oder mehrerer Internals, Readings oder Attribute mit ausgeben.<br />
<br />
Der Befehl kann direkt über das Eingabefeld des [[FHEMWEB|Webfrontends]] oder über die telnet Schnittstelle eingegeben werden. <br />
<br />
== Beispiele ==<br />
{{Randnotiz|RNText=Für alle Beispiele gilt: im Webfrontend lassen sich die Namen der ausgegebenen Geräte direkt anklicken, um in die zugehörige Detail-Ansicht zu gelangen. Dies ist besonders für [[weblink]], [[SVG]] oder [[readingsGroup]] Geräte nützlich, die in der Raum-Ansicht eventuell keinen solchen Link auf die Detail-Ansicht zeigen.}}<br />
=== Alle Geräte mit bestimmten Namen mit ihrer Definition ===<br />
Auflistung der Definitionen aller Geräte von FHEM:<br />
:<code><nowiki>list .* DEF</nowiki></code><br />
<br />
Auflistung der Definitionen der Geräte, die mit wz beginnen.<br />
:<code><nowiki>list wz.* DEF</nowiki></code><br />
<br />
=== Alle Geräte eines bestimmten Typs ===<br />
Mit dem Befehl <br />
:<code><nowiki>list TYPE=FS20</nowiki></code><br />
wird eine Liste (die Namen) aller Geräte des Typs [[FS20]] ausgegeben. <br />
<br />
=== Alle Geräte ohne TYPE ===<br />
Manche Fehlersituationen in FHEM werden verursacht durch Geräte, bei denen kein ''Internal'' mit dem Namen ''TYPE'' festgelegt ist (was eigentlich eine ungültige Definition ist). Diese Geräte-Definitionen lassen sich mit dem Befehl <br />
:<code><nowiki>{ join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</nowiki></code><br />
identifizieren. Mithilfe dieser Information lässt sich dann z.B. ein solches Gerät [[delete|löschen]]. <br />
<br />
Ein derartiges Szenario ist unter anderem in diesem {{Link2Forum|Topic=41137|LinkText=Forenthema}} beschrieben.<br />
<br />
=== Alle Geräte mit einem bestimmten Attribut ===<br />
Im Zusammenhang mit Verhaltensänderungen eines Attributs (wie z.B. bei [[userReadings]] geschehen), kann es sinnvoll sein, alle Devices aufzulisten, bei denen dieses Attribut verwendet wurde.<br />
;alle Devices, bei denen das Attribut ''userReadings'' (auf einen beliebigen Wert gesetzt) ist:<br />
:<code>list userReadings=[a-zA-Z].*</code> oder <br /><code>list userReadings=.+</code> oder <br /><code>list userReadings=\w.*</code> oder <br /><code>list userReadings=..*</code><br />
<br />
=== Alle Geräte in einem Raum ===<br />
[[Datei:ListRoom.png|mini|right|Ausgabebeispiel eines ''list'' Befehls]]<br />
Mit dem Befehl <br />
:<code><nowiki>list room=TV</nowiki></code><br />
werden die Namen aller Geräte aufgeführt, die ein Attribut ''room'' mit dem Wert ''TV'' haben. Durch einen Klick auf den Gerätenamen wird die Detailansicht des Gerätes aufgerufen.<br />
<br />
=== Attributwert zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM serialNr</code><br />
werden die Seriennummern aller Homematic Geräte aufgelistet.<br />
<br />
=== Mehrere Werte zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM:FILTER=serialNr=..* serialNr model</code><br />
werden die Seriennummer und die Modellbezeichnung aller Homematic Geräte aufgelistet, die auch eine Seriennummer haben.<br />
<br />
=== Gezieltes Auflisten von Internal, Reading oder Attribut ===<br />
Bei manchen Geräten gibt es Internals, Readings oder Attribute mit gleichem Namen. Da ''list'' jeweils nur das erste Vorkommen zeigt und nicht sichtbar macht, was genau gefunden wurde, ist die Ausgabe manchmal nicht eindeutig. Um das zu vermeiden, lässt sich mit dem Präfix i:, r: oder a: vor dem Namen des anzuzeigenden Wertes angeben, welcher der drei möglichen Typen ausgegeben werden soll.<br />
<br />
== Erweiterte Optionen ==<br />
Mit den Optionen -r und -R kann eine erweiterte Ausgabe erzielt werden. Diese sollte bei der Erstellung eines Threads im Forum zu allen beteiligten Geräten mit angegeben werden. Die Optionen können auch hilfreich sein, um Teile der [[Konfiguration]] schnell zwischen unterschiedlichen Installationen zu kopieren, z.B. von einem oder in ein Testsystem (siehe auch [[Import von Code Snippets]]). <br />
=== list -r ===<br />
Dabei werden auch die derzeitigen Stände der Readings mit ausgegeben. Für die Angabe des Gerätenamens ist dabei die Verwendung jeder {{Link2CmdRef|Anker=devspec|Label=devspec}} zulässig.<br />
<br />
Beispiel:<br />
:<code><nowiki>list -r TV</nowiki></code><br />
:<code><nowiki>list -r .*</nowiki></code><br />
<br />
=== list -R ===<br />
Mit dieser Option werden auch die Geräte samt aktueller Zustände mit ausgegeben, die als '''probably associated with'' erkannt worden sind.<br />
<br />
Beispiel:<br />
:<code><nowiki>list -R TV</nowiki></code><br />
<br />
== Links ==<br />
* [[Import von Code Snippets|RAW Definition]]<br />
<br />
[[Kategorie:FHEM-Verwendung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=List&diff=33269List2020-05-23T20:40:03Z<p>Maista: /* list -R */</p>
<hr />
<div>{{SEITENTITEL:list}}<br />
{{Infobox Modul<br />
|ModPurpose=Befehl zur Auflistung von Gerätedefinitionen<br />
|ModType=cmd<br />
|ModCmdRef=list<br />
|ModForumArea=Sonstiges<br />
|ModTechName=fhem.pl ("Built-in")<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
Der Befehl [[list]] dient dazu, Informationen über Geräte (Devices) anzuzeigen. Dabei können entweder Details zu einem einzelnen Gerät ausgegeben werden, oder eine Liste von Geräten (Gerätenamen) mit bestimmten gemeinsamen Attributen. Wenn mehrere Geräte aufgelistet werden, lässt sich zu jedem zusätzlich der Wert eines oder mehrerer Internals, Readings oder Attribute mit ausgeben.<br />
<br />
Der Befehl kann direkt über das Eingabefeld des [[FHEMWEB|Webfrontends]] oder über die telnet Schnittstelle eingegeben werden. <br />
<br />
== Beispiele ==<br />
{{Randnotiz|RNText=Für alle Beispiele gilt: im Webfrontend lassen sich die Namen der ausgegebenen Geräte direkt anklicken, um in die zugehörige Detail-Ansicht zu gelangen. Dies ist besonders für [[weblink]], [[SVG]] oder [[readingsGroup]] Geräte nützlich, die in der Raum-Ansicht eventuell keinen solchen Link auf die Detail-Ansicht zeigen.}}<br />
=== Alle Geräte mit bestimmten Namen mit ihrer Definition ===<br />
Auflistung der Definitionen aller Geräte von FHEM:<br />
:<code><nowiki>list .* DEF</nowiki></code><br />
<br />
Auflistung der Definitionen der Geräte, die mit wz beginnen.<br />
:<code><nowiki>list wz.* DEF</nowiki></code><br />
<br />
=== Alle Geräte eines bestimmten Typs ===<br />
Mit dem Befehl <br />
:<code><nowiki>list TYPE=FS20</nowiki></code><br />
wird eine Liste (die Namen) aller Geräte des Typs [[FS20]] ausgegeben. <br />
<br />
=== Alle Geräte ohne TYPE ===<br />
Manche Fehlersituationen in FHEM werden verursacht durch Geräte, bei denen kein ''Internal'' mit dem Namen ''TYPE'' festgelegt ist (was eigentlich eine ungültige Definition ist). Diese Geräte-Definitionen lassen sich mit dem Befehl <br />
:<code><nowiki>{ join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</nowiki></code><br />
identifizieren. Mithilfe dieser Information lässt sich dann z.B. ein solches Gerät [[delete|löschen]]. <br />
<br />
Ein derartiges Szenario ist unter anderem in diesem {{Link2Forum|Topic=41137|LinkText=Forenthema}} beschrieben.<br />
<br />
=== Alle Geräte mit einem bestimmten Attribut ===<br />
Im Zusammenhang mit Verhaltensänderungen eines Attributs (wie z.B. bei [[userReadings]] geschehen), kann es sinnvoll sein, alle Devices aufzulisten, bei denen dieses Attribut verwendet wurde.<br />
;alle Devices, bei denen das Attribut ''userReadings'' (auf einen beliebigen Wert gesetzt) ist:<br />
:<code>list userReadings=[a-zA-Z].*</code> oder <br /><code>list userReadings=.+</code> oder <br /><code>list userReadings=\w.*</code> oder <br /><code>list userReadings=..*</code><br />
<br />
=== Alle Geräte in einem Raum ===<br />
[[Datei:ListRoom.png|mini|right|Ausgabebeispiel eines ''list'' Befehls]]<br />
Mit dem Befehl <br />
:<code><nowiki>list room=TV</nowiki></code><br />
werden die Namen aller Geräte aufgeführt, die ein Attribut ''room'' mit dem Wert ''TV'' haben. Durch einen Klick auf den Gerätenamen wird die Detailansicht des Gerätes aufgerufen.<br />
<br />
=== Attributwert zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM serialNr</code><br />
werden die Seriennummern aller Homematic Geräte aufgelistet.<br />
<br />
=== Mehrere Werte zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM:FILTER=serialNr=..* serialNr model</code><br />
werden die Seriennummer und die Modellbezeichnung aller Homematic Geräte aufgelistet, die auch eine Seriennummer haben.<br />
<br />
=== Gezieltes Auflisten von Internal, Reading oder Attribut ===<br />
Bei manchen Geräten gibt es Internals, Readings oder Attribute mit gleichem Namen. Da ''list'' jeweils nur das erste Vorkommen zeigt und nicht sichtbar macht, was genau gefunden wurde, ist die Ausgabe manchmal nicht eindeutig. Um das zu vermeiden, lässt sich mit dem Präfix i:, r: oder a: vor dem Namen des anzuzeigenden Wertes angeben, welcher der drei möglichen Typen ausgegeben werden soll.<br />
<br />
== Erweiterte Optionen ==<br />
Mit den Optionen -r und -R kann eine erweiterte Ausgabe erzielt werden. Diese sollte bei der Erstellung eines Threads im Forum zu allen beteiligten Geräten mit angegeben werden. Die Optionen können auch hilfreich sein, um Teile der [[Konfiguration]] schnell zwischen unterschiedlichen Installationen zu kopieren, z.B. von einem oder in ein Testsystem (siehe auch [[Import von Code Snippets]]). <br />
=== list -r ===<br />
Dabei werden auch die derzeitigen Stände der Readings mit ausgegeben. Für die Angabe des Gerätenamens ist dabei die Verwendung jeder {{Link2CmdRef|Anker=devspec|Label=devspec}} zulässig.<br />
=== list -R ===<br />
Mit dieser Option werden auch die Geräte samt aktueller Zustände mit ausgegeben, die als '''probably associated with'' erkannt worden sind.<br />
<br />
Beispiel:<br />
:<code><nowiki>list -R TV</nowiki></code><br />
<br />
== Links ==<br />
* [[Import von Code Snippets|RAW Definition]]<br />
<br />
[[Kategorie:FHEM-Verwendung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=List&diff=33268List2020-05-23T20:14:03Z<p>Maista: n entfernt</p>
<hr />
<div>{{SEITENTITEL:list}}<br />
{{Infobox Modul<br />
|ModPurpose=Befehl zur Auflistung von Gerätedefinitionen<br />
|ModType=cmd<br />
|ModCmdRef=list<br />
|ModForumArea=Sonstiges<br />
|ModTechName=fhem.pl ("Built-in")<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
Der Befehl [[list]] dient dazu, Informationen über Geräte (Devices) anzuzeigen. Dabei können entweder Details zu einem einzelnen Gerät ausgegeben werden, oder eine Liste von Geräten (Gerätenamen) mit bestimmten gemeinsamen Attributen. Wenn mehrere Geräte aufgelistet werden, lässt sich zu jedem zusätzlich der Wert eines oder mehrerer Internals, Readings oder Attribute mit ausgeben.<br />
<br />
Der Befehl kann direkt über das Eingabefeld des [[FHEMWEB|Webfrontends]] oder über die telnet Schnittstelle eingegeben werden. <br />
<br />
== Beispiele ==<br />
{{Randnotiz|RNText=Für alle Beispiele gilt: im Webfrontend lassen sich die Namen der ausgegebenen Geräte direkt anklicken, um in die zugehörige Detail-Ansicht zu gelangen. Dies ist besonders für [[weblink]], [[SVG]] oder [[readingsGroup]] Geräte nützlich, die in der Raum-Ansicht eventuell keinen solchen Link auf die Detail-Ansicht zeigen.}}<br />
=== Alle Geräte mit bestimmten Namen mit ihrer Definition ===<br />
Auflistung der Definitionen aller Geräte von FHEM:<br />
:<code><nowiki>list .* DEF</nowiki></code><br />
<br />
Auflistung der Definitionen der Geräte, die mit wz beginnen.<br />
:<code><nowiki>list wz.* DEF</nowiki></code><br />
<br />
=== Alle Geräte eines bestimmten Typs ===<br />
Mit dem Befehl <br />
:<code><nowiki>list TYPE=FS20</nowiki></code><br />
wird eine Liste (die Namen) aller Geräte des Typs [[FS20]] ausgegeben. <br />
<br />
=== Alle Geräte ohne TYPE ===<br />
Manche Fehlersituationen in FHEM werden verursacht durch Geräte, bei denen kein ''Internal'' mit dem Namen ''TYPE'' festgelegt ist (was eigentlich eine ungültige Definition ist). Diese Geräte-Definitionen lassen sich mit dem Befehl <br />
:<code><nowiki>{ join("\n", grep { !defined($defs{$_}{TYPE}) } keys %defs) }</nowiki></code><br />
identifizieren. Mithilfe dieser Information lässt sich dann z.B. ein solches Gerät [[delete|löschen]]. <br />
<br />
Ein derartiges Szenario ist unter anderem in diesem {{Link2Forum|Topic=41137|LinkText=Forenthema}} beschrieben.<br />
<br />
=== Alle Geräte mit einem bestimmten Attribut ===<br />
Im Zusammenhang mit Verhaltensänderungen eines Attributs (wie z.B. bei [[userReadings]] geschehen), kann es sinnvoll sein, alle Devices aufzulisten, bei denen dieses Attribut verwendet wurde.<br />
;alle Devices, bei denen das Attribut ''userReadings'' (auf einen beliebigen Wert gesetzt) ist:<br />
:<code>list userReadings=[a-zA-Z].*</code> oder <br /><code>list userReadings=.+</code> oder <br /><code>list userReadings=\w.*</code> oder <br /><code>list userReadings=..*</code><br />
<br />
=== Alle Geräte in einem Raum ===<br />
[[Datei:ListRoom.png|mini|right|Ausgabebeispiel eines ''list'' Befehls]]<br />
Mit dem Befehl <br />
:<code><nowiki>list room=TV</nowiki></code><br />
werden die Namen aller Geräte aufgeführt, die ein Attribut ''room'' mit dem Wert ''TV'' haben. Durch einen Klick auf den Gerätenamen wird die Detailansicht des Gerätes aufgerufen.<br />
<br />
=== Attributwert zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM serialNr</code><br />
werden die Seriennummern aller Homematic Geräte aufgelistet.<br />
<br />
=== Mehrere Werte zu mehreren Geräten ===<br />
Mit dem Befehl<br />
:<code>list TYPE=CUL_HM:FILTER=serialNr=..* serialNr model</code><br />
werden die Seriennummer und die Modellbezeichnung aller Homematic Geräte aufgelistet, die auch eine Seriennummer haben.<br />
<br />
=== Gezieltes Auflisten von Internal, Reading oder Attribut ===<br />
Bei manchen Geräten gibt es Internals, Readings oder Attribute mit gleichem Namen. Da ''list'' jeweils nur das erste Vorkommen zeigt und nicht sichtbar macht, was genau gefunden wurde, ist die Ausgabe manchmal nicht eindeutig. Um das zu vermeiden, lässt sich mit dem Präfix i:, r: oder a: vor dem Namen des anzuzeigenden Wertes angeben, welcher der drei möglichen Typen ausgegeben werden soll.<br />
<br />
== Erweiterte Optionen ==<br />
Mit den Optionen -r und -R kann eine erweiterte Ausgabe erzielt werden. Diese sollte bei der Erstellung eines Threads im Forum zu allen beteiligten Geräten mit angegeben werden. Die Optionen können auch hilfreich sein, um Teile der [[Konfiguration]] schnell zwischen unterschiedlichen Installationen zu kopieren, z.B. von einem oder in ein Testsystem (siehe auch [[Import von Code Snippets]]). <br />
=== list -r ===<br />
Dabei werden auch die derzeitigen Stände der Readings mit ausgegeben. Für die Angabe des Gerätenamens ist dabei die Verwendung jeder {{Link2CmdRef|Anker=devspec|Label=devspec}} zulässig.<br />
=== list -R ===<br />
Mit dieser Option werden auch die Geräte samt aktueller Zustände mit ausgegeben, die als '''probably associated with'' erkannt worden sind.<br />
<br />
== Links ==<br />
* [[Import von Code Snippets|RAW Definition]]<br />
<br />
[[Kategorie:FHEM-Verwendung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=EventTypes&diff=33267EventTypes2020-05-23T16:33:48Z<p>Maista: Fhem > FHEM</p>
<hr />
<div>{{SEITENTITEL:eventTypes}}<br />
{{Infobox Modul<br />
|ModPurpose=Sammeln der Ereignistypen für alle definerten Geräte<br />
|ModType=h<br />
|ModForumArea=Frontends<br />
|ModCmdRef=eventTypes<br />
|ModTechName=91_eventTypes.pm<br />
|ModOwner={{Link2FU|8|rudolfkoenig}}<br />
}}<br />
<br />
Das Hilfsmodul [[eventTypes]] sammelt die Ereignistypen für alle definierten Geräte (Devices) und speichert sie in der spezifizierten Datei. Die gesammelten Daten werden benutzt um auf der Benutzeroberfläche (z.B. bei der Bearbeitung eines [[notify]]) bei der Erstellung von regulären Ausrücken die möglichen Werte in Auswahllisten anzuzeigen.<br />
<br />
== Voraussetzungen ==<br />
[[Datei:Hinweis_eventTypes.png|mini|rechts|Hinweis (Link) auf Informationen zu eventTypes]]<br />
Für die Benutzung von eventTypes sind keine besonderen Voraussetzungen zu erfüllen, evenTypes ist jedoch im Gegenzug erforderlich, um Unterstützung bei der Erstellung von regulären Ausdrücken (Regexp wizard) bieten zu können.<br />
<br />
== Anwendung ==<br />
=== Define ===<br />
Siehe {{Link2CmdRef|Anker=eventTypesdefine}}.<br />
<br />
=== Attribute ===<br />
Siehe {{Link2CmdRef|Anker=eventTypesattr}}.<br />
<br />
== Hinweise ==<br />
Die Datei für die Sammlung der eventTypes kann nach einiger Zeit sehr groß werden. Auf leistungsschwächeren FHEM-Servern führt dies unter Umständen zu einer erheblichen Verzögerung beim Objektdetails-Aufruf der Objekte, die den Regex Wizard nutzen (bspw. [[notify]], [[at]]).<br />
<br />
Abhilfe: Löschen der eventTypes-Datei <br />
set <eventTypes-device> clear<br />
set <eventTypes-device> flush<br />
<br />
siehe auch: {{Link2Forum|Topic=33905}}<br />
<br />
== Anwendungsbeispiele ==<br />
<br />
== Links ==</div>Maistahttp://wiki.fhem.de/w/index.php?title=FileLog&diff=33266FileLog2020-05-23T16:30:38Z<p>Maista: Fhem > FHEM</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Protokollierung von Fhem-Ereignissen<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=92_FileLog.pm<br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])}}<br />
<br />
Das Modul [[FileLog]] dient zur Protokollierung von Ereignissen in FHEM. Die Einträge werden in eine einfache Textdatei geschrieben. Zur Protokollierung in eine Datenbank kann alternativ oder auch parallel das Modul [[DbLog]] verwendet werden.<br />
<br />
Logdateien sind die Basis für die Erstellung von Diagrammen ([[SVG]]).<br />
<br />
== Definition ==<br />
Details in der {{Link2CmdRef|Anker=FileLogdefine}}.<br />
<br />
== Attribute ==<br />
Über {{Link2CmdRef|Anker=FileLogattr|Label=Attribute}} lässt sich unter anderem auch festlegen, wie die Archivierung von Logdateien durchgeführt werden soll (Archivierungsbefehl, -pfad sowie Anzahl von Archivgenerationen).<br />
<br />
Wenn bestimmte Zeilen '''nicht''' in die Logdatei geschrieben werden sollen, ist das Attribut ''ignoreRegexp'' hilfreich. Wenn beispielsweise alle Zeilen, die die Zeichenfolge "AbCd" oder "CdEf" enthalten '''nicht''' geloggt werden sollen, dann wäre<br />
:<code>attr <log-name> ignoreRegexp .*AbCd.*|.*CdEf.*</code><br />
eine Attributdefinition, die das ermöglicht.<br />
<br />
Dies bezieht sich aber nur auf normale FileLog-Instanzen. Falls Events aus dem globalen FHEM-Logfile ausgeschlossen werden sollen, muss man das Attribut in '''global''' angeben. (Zusammenhang siehe [[#Globale Logdatei und "fakelog"|Globale Logdatei und "fakelog"]]) <br />
:<code>attr global ignoreRegexp .*AbCd.*|.*CdEf.*</code><br />
<br />
== Funktionen ==<br />
''FileLog'' bietet Funktionen wie ''reopen'', ''absorb'' und ''get''. Details dazu sind in der {{Link2CmdRef|Anker=FileLogset}} zu finden.<br />
<br />
Sofern eine Instanz vom Objekt [[eventTypes]] angelegt ist, bietet die Detailansicht eines FileLog eine komfortable Möglichkeit, die regulären Ausdrücke für den/die Filter zu bearbeiten. Siehe hierzu auch diesen {{Link2Forum|Topic=12557|Message=75436}}.<br />
<br />
<br />
== Globale Logdatei und "fakelog" ==<br />
Die globale Logdatei (üblicherweise als fhem.log bezeichnet) für FHEM wird mit dem Attribut <br />
:<code>attr global logfile XXX</code><br />
für das ''global''-Objekt definiert, wobei für ''XXX'' normalerweise <code>./log/fhem-%Y-%m.log</code> verwendet wird.<br />
<br />
Um das ''fhem.log'' über das [[FHEMWEB|Web Interface]] anzeigen zu können, ist ein weiterer Eintrag in der [[Konfiguration]] erforderlich, nämlich:<br />
:<code>define Logfile FileLog XXX fakelog</code><br />
Das ''XXX'' muss '''zwingend''' durch den gleichen Wert ersetzt werden, wie in der Definition des globalen ''logfile'' Attributs, weil anderenfalls unterschiedliche Dateien verwendet werden - mit dem Effekt, dass die über das Web Interface angezeigte Datei nicht die erwarteten Einträge enthält (Details dazu auch in diesem {{Link2Forum|Topic=40041|Message=323315|LinkText=Forenbeitrag}}).<br />
<br />
== Werte auslesen ==<br />
Manchmal möchte man Daten aus den Logs abrufen ohne händisch in den Logfiles herumzuwühlen. Dies ist insb. auch dann hilfreich, wenn man eigenen Funktionen, Notifys oder spezielle Plots entwirft, bei denen man auf Logdaten zugreifen möchte.<br />
<br />
Grundsätzlich beschrieben ist dies in der {{Link2CmdRef|Lang=de|Anker=FileLog}} und unterscheidet sich minimal (aber entscheidend) von der Struktur bei [[DbLog#Werte_auslesen|DbLogs]].<br />
<br />
Hier ein paar Beispiele, was man damit anstellen kann:<br />
<br />
* <code>get FileLog_FHT_3a32 - - 2016-10-01 2016-10-03</code> alle Einträge des FileLog_FHT_3a32 vom 01.10.-03.10.2016<br />
* <code>get FileLog_FHT_3a32 - - 2016-10-01_08:00:00 2016-10-01_16:00:00</code> alle Einträge des FileLog_FHT_3a32 von 8-16 Uhr am 01.10.2016<br />
* <code>get FileLog_FHT_3a32 - - 2016-10-01_08:00:00 2016-10-01_16:00:00 4:measured:0:</code> nur die Temperatur-Werte<br />
* <code>{ ReadingsTimestamp("FHT_3a32","state","0") }</code> Timestamp des aktuellen state des FHT_3a32<br />
* <code>{ OldTimestamp("FHT_3a32") }</code> Timestamp des letzten state des FHT_3a32<br />
* <code>{ time_str2num(OldTimestamp("FHT_3a32")) }</code> Timestamp in Sekunden des letzten state des FHT_3a32<br />
* ...<br />
Weitere Beispiele kann man sich gut aus den SVG-Dateien ziehen.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=40041|Message=323315|LinkText=Forenbeitrag}} zum Thema fhem.log / fakelog<br />
<br />
[[Kategorie:Logging]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=ArduCounter&diff=32259ArduCounter2020-01-01T22:57:13Z<p>Maista: /* Set-Commands */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Count pulses, calculate time between pulses and convert this to readings for e.g. power consumption of Energy meters<br />
|ModType=contrib<br />
|ModCmdRef=ArduCounter<br />
|ModForumArea=Sonstiges<br />
|ModFTopic=19285<br />
|ModTechName=98_ArduCounter.pm<br />
|ModOwner=StefanStrobel ({{Link2FU|3960|Forum}} / [[Benutzer:StefanStrobel|Wiki]])<br />
}}<br />
This module implements an Interface to an Arduino or ESP8266 based counter for pulses on any input pin of an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device. The device connects to FHEM either through USB / serial or via tcp if an ESP board is used.<br />
<br />
The typical use case is an S0-Interface on an energy meter or water meter, but also reflection light barriers to monitor old ferraris counters are supported<br />
<br />
Counters are configured with attributes that define which Arduino pins should count pulses and in which intervals the Arduino board should report the current counts.<br />
<br />
The Arduino sketch that works with this module uses pin change interrupts so it can efficiently count pulses on all available input pins.<br />
The module creates readings for pulse counts, consumption and optionally also a pin history with pulse lengths and gaps of the last pulses.<br />
<br />
== Availability == <br />
The module has been checked in to the FHEM svn. <br />
The corresponding Arduino sketch can also be found under contrib in the subdirectory arduino/.<br />
<br />
== Prerequisites ==<br />
This module requires an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device based on an Atmel 328p or ESP8266 running the ArduCounter sketch provided with this module<br />
<br />
In order to flash an Arduino board with the corresponding ArduCounter firmware from within Fhem, avrdude needs to be installed.<br />
<br />
For old ferraris counters an Arduino Uno or Nano or ESP8266 board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line.<br />
<br />
This module also requires Device::SerialPort or Win32::SerialPort for communication via serial lines<br />
<br />
== Define ==<br />
<br />
<pre>define <name> ArduCounter <device></pre><br />
or<br />
<pre>define <name> ArduCounter <ip:port></pre><br />
<br />
<device> specifies the serial port to communicate with the Arduino.<br />
<br />
<ip:port> specifies the ip address and tcp port to communicate with an esp8266 where port is typically 80.<br />
<br />
The name of the serial-device depends on your distribution. You can also specify a baudrate for serial connections if the device name contains the @ character, e.g.: /dev/ttyUSB0@38400. The default baudrate of the ArduCounter firmware is 38400 since Version 1.4<br />
<br />
Examples:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2@38400<br />
define AC ArduCounter 192.168.1.134:80<br />
</pre><br />
<br />
== Configuration of ArduCounter digital counters ==<br />
<br />
Specify the pins where impulses should be counted e.g. as attr AC pinX falling pullup 30<br />
<br />
The X in pinX can be an Arduino / ESP pin number with or without the letter D e.g. pin4, pinD5, pin6, pinD7 ...<br />
<br />
After the pin you can use the keywords falling or rising to define if a logical one / 5V (rising) or a logical zero / 0V (falling) should be treated as pulse.<br />
<br />
The optional keyword pullup activates the pullup resistor for the given Pin.<br />
<br />
The last argument is also optional but recommended and specifies a minimal pulse length in milliseconds.<br />
<br />
An energy meter with S0 interface is typically connected to GND and an input pin like D4.<br />
The S0 pulse then pulls the input to 0V.<br />
Since the minimal pulse lenght of the s0 interface is specified to be 30ms, the typical configuration for an s0 interface is<br />
attr AC pinX falling pullup 30<br />
<br />
Specifying a minimal pulse length is recommended since it filters bouncing of reed contacts or other noise.<br />
<br />
Example:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2<br />
attr AC pulsesPerKWh 1000<br />
attr AC interval 60 300<br />
attr AC pinD4 falling pullup 5<br />
attr AC pinD5 falling pullup 30<br />
attr AC verboseReadingsD5<br />
attr AC pinD6 rising<br />
</pre><br />
<br />
This defines three counters connected to the pins D4, D5 and D5.<br />
D4 and D5 have their pullup resistors activated and the impulse draws the pins to zero.<br />
For D4 and D5 the arduino measures the time in milliseconds between the falling edge and the rising edge. If this time is longer than the specified 5 or 30 milliseconds then the impulse is counted.<br />
If the time is shorter then this impulse is regarded as noise and added to a separate reject counter.<br />
<br />
verboseReadings5 causes the module to create additional readings like the pin history which shows length and gaps between the last pulses.<br />
<br />
For pin D6 the arduino does not check pulse lengths and counts every time when the signal changes from 0 to 1.<br />
<br />
The ArduCounter sketch which must be loaded on the Arduino or ESP implements this using pin change interrupts, so all avilable input pins can be used, not only the ones that support normal interrupts.<br />
The module has been tested with 14 inputs of an Arduino Uno counting in parallel and pulses as short as 3 milliseconds.<br />
<br />
== Configuration of ArduCounter analog counters ==<br />
<br />
This module and the corresponding sketch can be used to read out old analog ferraris energy counters. Therefore an ESP, Arduino Uno or Nano board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line. The idea comes from Martin Kompf (https://www.kompf.de/tech/emeir.html) and has been adopted for ArduCounter to support old ferraris energy counters.<br />
<br />
To support this mode, the sketch has to be compiled with analogIR defined.<br />
<br />
The configuration is then similar to the one for digital counters:<br />
<br />
<pre><br />
define ACF ArduCounter /dev/ttyUSB4<br />
attr ACF analogThresholds 100 110<br />
attr ACF flashCommand avrdude -p atmega328P -b57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
attr ACF interval 60 300 2 2<br />
attr ACF pinA7 rising 20<br />
attr ACF pulsesPerKWh 75<br />
attr ACF stateFormat {sprintf("%.3f kW", ReadingsVal($name,"powerA7",0))}<br />
</pre> <br />
<br />
To find out the right analog thresholds you can set devVerbose to 20 which will ask the firmware of your conting board to report every analog measurement. The ArduCounter module will count how often each value is reported and you can then query these analog level counts with get levels. After a few turns of the ferraris disc the result of get levels might look like this:<br />
<br />
<pre><br />
observed levels from analog input:<br />
94: 21<br />
95: 79<br />
96: 6<br />
97: 2<br />
98: 3<br />
99: 2<br />
100: 2<br />
101: 1<br />
102: 3<br />
105: 2<br />
106: 1<br />
108: 2<br />
109: 1<br />
110: 1<br />
112: 1<br />
113: 3<br />
115: 4<br />
116: 9<br />
117: 14<br />
118: 71<br />
119: 103<br />
120: 118<br />
121: 155<br />
122: 159<br />
123: 143<br />
124: 147<br />
125: 158<br />
126: 198<br />
127: 249<br />
128: 220<br />
129: 230<br />
130: 201<br />
131: 140<br />
132: 147<br />
133: 153<br />
134: 141<br />
135: 119<br />
136: 105<br />
137: 109<br />
138: 114<br />
139: 83<br />
140: 33<br />
141: 14<br />
142: 1 <br />
</pre> <br />
<br />
This shows the measured values together with the frequency how often the individual value has been measured. It is obvious that most measurements result in values between 120 and 135, very few values are betweem 96 and 115 and another peak is around the value 95.<br />
It means that the when the red mark of the ferraris disc is under the sensor, the value is around 95 and while the blank disc is under the sensor, the value is typically between 120 and 135. So a good upper threshold would be 120 and a good lower threshold would be for example 96.<br />
<br />
== Get-Commands ==<br />
;info <br />
:send a command to the Arduino board to get current counts. <br />
:This is not needed for normal operation but might be useful sometimes for debugging.<br />
<br />
;levels<br />
:show the count for the measured levels if an analog pin is used to measure e.g. the red mark of a ferraris counter disc. <br />
:This is useful for setting the thresholds for analog measurements.<br />
<br />
;history<br />
:shows details regarding all the level changes that the counter device (Arduino or ESP) has detected <br />
:and how they were used (counted or rejected)<br />
:If get history is issued with a pin name (e.g. get history D5) then only the history entries concerning D5 will be shown.<br />
:This information is sent from the device to Fhem when it reports the current count but only if devVerbose is equal or greater than 5.<br />
:The maximum number of lines that the Arducounter module stores in a ring buffer is defined by the attribute maxHist and defaults to 1000.<br />
<br />
<br />
== Set-Commands ==<br />
<br />
;raw<br />
:send the value to the board so you can directly talk to the sketch using its commands.<br />
:This is not needed for normal operation but might be useful sometimes for debugging<br />
<br />
;flash<br />
:flashes the ArduCounter firmware ArduCounter.hex from the fhem subdirectory FHEM/firmware onto the device. <br />
:This command needs avrdude to be installed. The attribute flashCommand specidies how avrdude is called. <br />
:If it is not modifed then the module sets it to avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
:This setting should work for a standard installation and the placeholders are automatically replaced when the command is used. <br />
:So normally there is no need to modify this attribute.<br />
:Depending on your specific Arduino board however, you might need to insert -b 57600 in the flash Command. <br />
:(e.g. for an Arduino Nano) ESP boards so far have to be flashed from the Arduino IDE. In a future version flashing over the air sould be supported.<br />
<br />
;reset<br />
:reopens the arduino device and sends a command to it which causes a reinitialize and reset of the counters. Then the module resends the attribute configuration / definition of the pins to the device.<br />
<br />
;saveConfig<br />
:stores the current interval, analog threshold and pin configuration to be stored in the EEPROM of the counter device <br />
:so it can be retrieved after a reset.<br />
<br />
;enable<br />
:sets the attribute disable to 0<br />
<br />
;disable<br />
:sets the attribute disable to 1<br />
<br />
;reconnect<br />
:closes the tcp connection to an ESP based counter board that is conected via TCP/IP and reopen the connection<br />
<br />
== Supported readings ==<br />
The module creates at least the following readings and events for each defined pin:<br />
<br />
;pin.* e.g. pinD4<br />
:the current internal count at this pin (internal to the Arduino / ESP device, starts at 0 when the device restarts).<br />
:The name of this reading can be changed with the attribute readingNameCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;long.* e.g. longD5<br />
:long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts.<br />
:The name of this reading can be changed with the attribute readingNameLongCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;interpolatedLong.*<br />
:like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart.<br />
:The name of this reading can be changed with the attribute readingNameInterpolatedCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;calcCounter.*<br />
:similar to long count which keeps on counting up after fhem restarts but this counter will take the pulses per kWh setting into the :calculation und thus not count pulses but real kWh (or some other unit that is applicable)<br />
:The name of this reading can be changed with the attribute readingNameCalcCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;reject.*<br />
:counts rejected pulses that are shorter than the specified minimal pulse length.<br />
<br />
;power.*<br />
:the current calculated power at this pin.<br />
:The name of this reading can be changed with the attribute readingNamePower[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;pinHistory.*<br />
:shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G<br />
:The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action. -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.<br />
<br />
;countDiff.*<br />
:delta of the current count to the last reported one. This is used together with timeDiff.* to calculate the power consumption.<br />
<br />
;timeDiff.*<br />
:time difference between the first pulse in the current observation interval and the last one. Used togehter with countDiff to calculate the power consumption.<br />
<br />
;seq.*<br />
:internal sequence number of the last report from the board to Fhem.<br />
<br />
<br />
== Attributes ==<br />
<br />
;do_not_notify<br />
: ...<br />
<br />
;pin.* <br />
:Define a pin of the Arduino board as input. This attribute expects either <code>rising</code>, <code>falling</code> or <code>change</code>, followed by an optional <code>pullup</code> and an optional number as value.<br />
:If a number is specified, the arduino will track rising and falling edges of each impulse and measure the length of a pulse in milliseconds. <br />
:The number specified here is the minimal length of a pulse and a pause before a pulse. If one is too small, the pulse is not counted but added to a separate reject counter.<br />
<br />
;interval normal max min mincout <br />
:Defines the parameters that affect the way counting and reporting works.<br />
:This Attribute expects at least two and a maximum of four numbers as value. <br />
: The first is the normal interval, the second the maximal interval, the third is a minimal interval and the fourth is a minimal pulse count.<br />
<br />
:In the usual operation mode (when the normal interval is smaller than the maximum interval), the Arduino board just counts and remembers the time between the first impulse and the last impulse for each pin.<br />
:After the normal interval is elapsed the Arduino board reports the count and time for those pins where impulses were encountered.<br />
:This means that even though the normal interval might be 10 seconds, the reported time difference can be something different because it observed impulses as starting and ending point.<br />
:The Power (e.g. for energy meters) is the calculated based of the counted impulses and the time between the first and the last impulse. <br />
:For the next interval, the starting time will be the time of the last impulse in the previous reporting period and the time difference will be taken up to the last impulse before the reporting interval has elapsed.<br />
<br />
:The second, third and fourth numbers (maximum, minimal interval and minimal count) exist for the special case when the pulse frequency is very low and the reporting time is comparatively short.<br />
:For example if the normal interval (first number) is 60 seconds and the device counts only one impulse in 90 seconds, the the calculated power reading will jump up and down and will give ugly numbers.<br />
:By adjusting the other numbers of this attribute this can be avoided.<br />
:In case in the normal interval the observed impulses are encountered in a time difference that is smaller than the third number (minimal interval) or if the number of impulses counted is smaller than the fourth number (minimal count) then the reporting is delayed until the maximum interval has elapsed or the above conditions have changed after another normal interval.<br />
:This way the counter will report a higher number of pulses counted and a larger time difference back to fhem.<br />
<br />
:If this is seems too complicated and you prefer a simple and constant reporting interval, then you can set the normal interval and the mximum interval to the same number. This changes the operation mode of the counter to just count during this normal and maximum interval and report the count. In this case the reported time difference is always the reporting interval and not the measured time between the real impulses.<br />
<br />
;factor <br />
:Define a multiplicator for calculating the power from the impulse count and the time between the first and the last impulse.<br />
:This attribute is outdated and unintuitive so you should avoid it.<br />
:Instead you should specify the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;readingFactor[0-9]+<br />
:Override the factor attribute for this individual pin.<br />
:Just like the attribute factor, this is a rather cumbersome way to specify the pulses per kWh.<br />
:Instaed it is advised to use the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;pulsesPerKWh<br />
:specify the number of pulses that the meter is giving out per unit that sould be displayed (e.g. per kWh energy consumed). For many S0 counters this is 1000, for old ferraris counters this is 75 (rounds per kWh).<br />
:Example: attr myCounter pulsesPerKWh 75<br />
<br />
;readingPulsesPerKWh[0-9]+<br />
:is the same as pulsesPerKWh but specified per pin individually in case you have multiple counters with different settings at the same time<br />
:Example:<br />
:attr myCounter readingPulsesPerKWhA7 75<br />
:attr myCounter readingPulsesPerKWhD4 1000<br />
<br />
;readingNameCount[0-9]+ <br />
:Change the name of the counter reading pinX to something more meaningful.<br />
<br />
;readingNameLongCount[0-9]+ <br />
:Change the name of the counter reading longX to something more meaningful.<br />
<br />
;readingNameInterpolatedCount[0-9]+ <br />
:Change the name of the counter reading InterpolatedLongX to something more meaningful.<br />
<br />
;readingNameCalcCount[AD]?[0-9]+<br />
:Change the name of the real unit counter reading CalcCounterX to something more meaningful.<br />
:Example: attr myCounter readingNameCalcCountD4 CounterHaus_kWh<br />
<br />
;readingNamePower[0-9]+ <br />
:Change the name of the power reading powerX to something more meaningful.<br />
<br />
;readingStartTime[0-9]+ <br />
:Allow the reading time stamp to be set to the beginning of measuring intervals<br />
<br />
;verboseReadings[0-9]+ <br />
:create additional readings: timeDiff, countDiff and lastMsg for each pin<br />
<br />
;devVerbose<br />
:set the verbose level in the counting board. This defaults to 0.<br />
:If the value is >0, then the firmware will echo all commands sent to it by the Fhem module.<br />
:If the value is >=5, then the firmware will report the pin history (assuming that the firmware has been compiled with this feature enabled)<br />
:If the value is >=10, then the firmware will report every level change of a pin<br />
:If the value is >=20, then the firmware will report every analog measurement (assuming that the firmware has been compiled with analog measurements for old ferraris counters or similar).<br />
<br />
;maxHist<br />
:specifies how many pin history lines hould be buffered for "get history".<br />
:This attribute defaults to 1000.<br />
<br />
;analogThresholds<br />
:this Attribute is necessary when you use an arduino nano with connected reflection light barrier (photo transistor and led) to detect the red mark of an old ferraris energy counter. In this case the firmware uses an upper and lower threshold which can be set here.<br />
:Example: attr myCounter analogThresholds 90 110<br />
:In order to find out the right threshold values you can set devVerbose to 20, wait for several turns of the ferraris disc and then use get levels to see the typical measurements for the red mark and the blank disc.<br />
<br />
;flashCommand<br />
:sets the command to call avrdude and flash the onnected arduino with an updated hex file (by default it looks for ArduCounter.hex in the FHEM/firmware subdirectory.<br />
:This attribute contains avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] by default.<br />
:For an Arduino Nano based counter you should add -b 57600 e.g. between the -P and -D options.<br />
:Example: attr myCounter flashCommand avrdude -p atmega328P -c arduino -b 57600 -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
<br />
;keepAliveDelay<br />
:defines an interval in which the module sends keepalive messages to a counter device that is conected via tcp.<br />
:This attribute is ignored if the device is connected via serial port.<br />
:If the device doesn't reply within a defined timeout then the module closes and tries to reopen the connection.<br />
:The module tells the device when to expect the next keepalive message and the device will also close the tcp connection if it doesn't see a :keepalive message within the delay multiplied by 3<br />
:The delay defaults to 10 seconds.<br />
:Example: attr myCounter keepAliveDelay 30<br />
<br />
;keepAliveTimeout<br />
:defines the timeout when wainting for a keealive reply (see keepAliveDelay) The timeout defaults to 2 seconds.<br />
:Example: attr myCounter keepAliveTimeout 3<br />
<br />
;keepAliveRetries<br />
:defines how often sending a keepalive is retried before the connection is closed and reopened.<br />
:It defaults to 2.<br />
:Example: attr myCounter keepAliveRetries 3<br />
<br />
;nextOpenDelay<br />
:defines the time that the module waits before retrying to open a disconnected tcp connection.<br />
:This defaults to 60 seconds.<br />
:Example: attr myCounter nextOpenDelay 20<br />
<br />
;openTimeout<br />
:defines the timeout after which tcp open gives up trying to establish a connection to the counter device. This timeout defaults to 3 seconds.<br />
:Example: attr myCounter openTimeout 5<br />
<br />
;silentReconnect<br />
:if set to 1, then it will set the loglevel for "disconnected" and "reappeared" messages to 4 instead of 3<br />
:Example: attr myCounter silentReconnect 1<br />
<br />
;disable<br />
:if set to 1 then the module closes the connection to a counter device.<br />
<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Energieverbrauchsmessung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=ArduCounter&diff=32258ArduCounter2020-01-01T22:54:47Z<p>Maista: /* Prerequisites */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Count pulses, calculate time between pulses and convert this to readings for e.g. power consumption of Energy meters<br />
|ModType=contrib<br />
|ModCmdRef=ArduCounter<br />
|ModForumArea=Sonstiges<br />
|ModFTopic=19285<br />
|ModTechName=98_ArduCounter.pm<br />
|ModOwner=StefanStrobel ({{Link2FU|3960|Forum}} / [[Benutzer:StefanStrobel|Wiki]])<br />
}}<br />
This module implements an Interface to an Arduino or ESP8266 based counter for pulses on any input pin of an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device. The device connects to FHEM either through USB / serial or via tcp if an ESP board is used.<br />
<br />
The typical use case is an S0-Interface on an energy meter or water meter, but also reflection light barriers to monitor old ferraris counters are supported<br />
<br />
Counters are configured with attributes that define which Arduino pins should count pulses and in which intervals the Arduino board should report the current counts.<br />
<br />
The Arduino sketch that works with this module uses pin change interrupts so it can efficiently count pulses on all available input pins.<br />
The module creates readings for pulse counts, consumption and optionally also a pin history with pulse lengths and gaps of the last pulses.<br />
<br />
== Availability == <br />
The module has been checked in to the FHEM svn. <br />
The corresponding Arduino sketch can also be found under contrib in the subdirectory arduino/.<br />
<br />
== Prerequisites ==<br />
This module requires an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device based on an Atmel 328p or ESP8266 running the ArduCounter sketch provided with this module<br />
<br />
In order to flash an Arduino board with the corresponding ArduCounter firmware from within Fhem, avrdude needs to be installed.<br />
<br />
For old ferraris counters an Arduino Uno or Nano or ESP8266 board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line.<br />
<br />
This module also requires Device::SerialPort or Win32::SerialPort for communication via serial lines<br />
<br />
== Define ==<br />
<br />
<pre>define <name> ArduCounter <device></pre><br />
or<br />
<pre>define <name> ArduCounter <ip:port></pre><br />
<br />
<device> specifies the serial port to communicate with the Arduino.<br />
<br />
<ip:port> specifies the ip address and tcp port to communicate with an esp8266 where port is typically 80.<br />
<br />
The name of the serial-device depends on your distribution. You can also specify a baudrate for serial connections if the device name contains the @ character, e.g.: /dev/ttyUSB0@38400. The default baudrate of the ArduCounter firmware is 38400 since Version 1.4<br />
<br />
Examples:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2@38400<br />
define AC ArduCounter 192.168.1.134:80<br />
</pre><br />
<br />
== Configuration of ArduCounter digital counters ==<br />
<br />
Specify the pins where impulses should be counted e.g. as attr AC pinX falling pullup 30<br />
<br />
The X in pinX can be an Arduino / ESP pin number with or without the letter D e.g. pin4, pinD5, pin6, pinD7 ...<br />
<br />
After the pin you can use the keywords falling or rising to define if a logical one / 5V (rising) or a logical zero / 0V (falling) should be treated as pulse.<br />
<br />
The optional keyword pullup activates the pullup resistor for the given Pin.<br />
<br />
The last argument is also optional but recommended and specifies a minimal pulse length in milliseconds.<br />
<br />
An energy meter with S0 interface is typically connected to GND and an input pin like D4.<br />
The S0 pulse then pulls the input to 0V.<br />
Since the minimal pulse lenght of the s0 interface is specified to be 30ms, the typical configuration for an s0 interface is<br />
attr AC pinX falling pullup 30<br />
<br />
Specifying a minimal pulse length is recommended since it filters bouncing of reed contacts or other noise.<br />
<br />
Example:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2<br />
attr AC pulsesPerKWh 1000<br />
attr AC interval 60 300<br />
attr AC pinD4 falling pullup 5<br />
attr AC pinD5 falling pullup 30<br />
attr AC verboseReadingsD5<br />
attr AC pinD6 rising<br />
</pre><br />
<br />
This defines three counters connected to the pins D4, D5 and D5.<br />
D4 and D5 have their pullup resistors activated and the impulse draws the pins to zero.<br />
For D4 and D5 the arduino measures the time in milliseconds between the falling edge and the rising edge. If this time is longer than the specified 5 or 30 milliseconds then the impulse is counted.<br />
If the time is shorter then this impulse is regarded as noise and added to a separate reject counter.<br />
<br />
verboseReadings5 causes the module to create additional readings like the pin history which shows length and gaps between the last pulses.<br />
<br />
For pin D6 the arduino does not check pulse lengths and counts every time when the signal changes from 0 to 1.<br />
<br />
The ArduCounter sketch which must be loaded on the Arduino or ESP implements this using pin change interrupts, so all avilable input pins can be used, not only the ones that support normal interrupts.<br />
The module has been tested with 14 inputs of an Arduino Uno counting in parallel and pulses as short as 3 milliseconds.<br />
<br />
== Configuration of ArduCounter analog counters ==<br />
<br />
This module and the corresponding sketch can be used to read out old analog ferraris energy counters. Therefore an ESP, Arduino Uno or Nano board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line. The idea comes from Martin Kompf (https://www.kompf.de/tech/emeir.html) and has been adopted for ArduCounter to support old ferraris energy counters.<br />
<br />
To support this mode, the sketch has to be compiled with analogIR defined.<br />
<br />
The configuration is then similar to the one for digital counters:<br />
<br />
<pre><br />
define ACF ArduCounter /dev/ttyUSB4<br />
attr ACF analogThresholds 100 110<br />
attr ACF flashCommand avrdude -p atmega328P -b57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
attr ACF interval 60 300 2 2<br />
attr ACF pinA7 rising 20<br />
attr ACF pulsesPerKWh 75<br />
attr ACF stateFormat {sprintf("%.3f kW", ReadingsVal($name,"powerA7",0))}<br />
</pre> <br />
<br />
To find out the right analog thresholds you can set devVerbose to 20 which will ask the firmware of your conting board to report every analog measurement. The ArduCounter module will count how often each value is reported and you can then query these analog level counts with get levels. After a few turns of the ferraris disc the result of get levels might look like this:<br />
<br />
<pre><br />
observed levels from analog input:<br />
94: 21<br />
95: 79<br />
96: 6<br />
97: 2<br />
98: 3<br />
99: 2<br />
100: 2<br />
101: 1<br />
102: 3<br />
105: 2<br />
106: 1<br />
108: 2<br />
109: 1<br />
110: 1<br />
112: 1<br />
113: 3<br />
115: 4<br />
116: 9<br />
117: 14<br />
118: 71<br />
119: 103<br />
120: 118<br />
121: 155<br />
122: 159<br />
123: 143<br />
124: 147<br />
125: 158<br />
126: 198<br />
127: 249<br />
128: 220<br />
129: 230<br />
130: 201<br />
131: 140<br />
132: 147<br />
133: 153<br />
134: 141<br />
135: 119<br />
136: 105<br />
137: 109<br />
138: 114<br />
139: 83<br />
140: 33<br />
141: 14<br />
142: 1 <br />
</pre> <br />
<br />
This shows the measured values together with the frequency how often the individual value has been measured. It is obvious that most measurements result in values between 120 and 135, very few values are betweem 96 and 115 and another peak is around the value 95.<br />
It means that the when the red mark of the ferraris disc is under the sensor, the value is around 95 and while the blank disc is under the sensor, the value is typically between 120 and 135. So a good upper threshold would be 120 and a good lower threshold would be for example 96.<br />
<br />
== Get-Commands ==<br />
;info <br />
:send a command to the Arduino board to get current counts. <br />
:This is not needed for normal operation but might be useful sometimes for debugging.<br />
<br />
;levels<br />
:show the count for the measured levels if an analog pin is used to measure e.g. the red mark of a ferraris counter disc. <br />
:This is useful for setting the thresholds for analog measurements.<br />
<br />
;history<br />
:shows details regarding all the level changes that the counter device (Arduino or ESP) has detected <br />
:and how they were used (counted or rejected)<br />
:If get history is issued with a pin name (e.g. get history D5) then only the history entries concerning D5 will be shown.<br />
:This information is sent from the device to Fhem when it reports the current count but only if devVerbose is equal or greater than 5.<br />
:The maximum number of lines that the Arducounter module stores in a ring buffer is defined by the attribute maxHist and defaults to 1000.<br />
<br />
<br />
== Set-Commands ==<br />
<br />
;raw<br />
:send the value to the board so you can directly talk to the sketch using its commands.<br />
:This is not needed for normal operation but might be useful sometimes for debugging<br />
<br />
;flash<br />
:flashes the ArduCounter firmware ArduCounter.hex from the fhem subdirectory FHEM/firmware onto the device. <br />
:This command needs avrdude to be installed. The attribute flashCommand specidies how avrdude is called. <br />
:If it is not modifed then the module sets it to avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
:This setting should work for a standard installation and the placeholders are automatically replaced when the command is used. <br />
:So normally there is no need to modify this attribute.<br />
:Depending on your specific Arduino board however, you might need to insert -b 57600 in the flash Command. <br />
:(e.g. for an Arduino Nano) ESP boards so far have to be fashed from the Arduino IDE. In a future version flashing over the air sould be supported.<br />
<br />
;reset<br />
:reopens the arduino device and sends a command to it which causes a reinitialize and reset of the counters. Then the module resends the attribute configuration / definition of the pins to the device.<br />
<br />
;saveConfig<br />
:stores the current interval, analog threshold and pin configuration to be stored in the EEPROM of the counter device <br />
:so it can be retrieved after a reset.<br />
<br />
;enable<br />
:sets the attribute disable to 0<br />
<br />
;disable<br />
:sets the attribute disable to 1<br />
<br />
;reconnect<br />
:closes the tcp connection to an ESP based counter board that is conected via TCP/IP and reopen the connection<br />
<br />
<br />
== Supported readings ==<br />
The module creates at least the following readings and events for each defined pin:<br />
<br />
;pin.* e.g. pinD4<br />
:the current internal count at this pin (internal to the Arduino / ESP device, starts at 0 when the device restarts).<br />
:The name of this reading can be changed with the attribute readingNameCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;long.* e.g. longD5<br />
:long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts.<br />
:The name of this reading can be changed with the attribute readingNameLongCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;interpolatedLong.*<br />
:like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart.<br />
:The name of this reading can be changed with the attribute readingNameInterpolatedCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;calcCounter.*<br />
:similar to long count which keeps on counting up after fhem restarts but this counter will take the pulses per kWh setting into the :calculation und thus not count pulses but real kWh (or some other unit that is applicable)<br />
:The name of this reading can be changed with the attribute readingNameCalcCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;reject.*<br />
:counts rejected pulses that are shorter than the specified minimal pulse length.<br />
<br />
;power.*<br />
:the current calculated power at this pin.<br />
:The name of this reading can be changed with the attribute readingNamePower[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;pinHistory.*<br />
:shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G<br />
:The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action. -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.<br />
<br />
;countDiff.*<br />
:delta of the current count to the last reported one. This is used together with timeDiff.* to calculate the power consumption.<br />
<br />
;timeDiff.*<br />
:time difference between the first pulse in the current observation interval and the last one. Used togehter with countDiff to calculate the power consumption.<br />
<br />
;seq.*<br />
:internal sequence number of the last report from the board to Fhem.<br />
<br />
<br />
== Attributes ==<br />
<br />
;do_not_notify<br />
: ...<br />
<br />
;pin.* <br />
:Define a pin of the Arduino board as input. This attribute expects either <code>rising</code>, <code>falling</code> or <code>change</code>, followed by an optional <code>pullup</code> and an optional number as value.<br />
:If a number is specified, the arduino will track rising and falling edges of each impulse and measure the length of a pulse in milliseconds. <br />
:The number specified here is the minimal length of a pulse and a pause before a pulse. If one is too small, the pulse is not counted but added to a separate reject counter.<br />
<br />
;interval normal max min mincout <br />
:Defines the parameters that affect the way counting and reporting works.<br />
:This Attribute expects at least two and a maximum of four numbers as value. <br />
: The first is the normal interval, the second the maximal interval, the third is a minimal interval and the fourth is a minimal pulse count.<br />
<br />
:In the usual operation mode (when the normal interval is smaller than the maximum interval), the Arduino board just counts and remembers the time between the first impulse and the last impulse for each pin.<br />
:After the normal interval is elapsed the Arduino board reports the count and time for those pins where impulses were encountered.<br />
:This means that even though the normal interval might be 10 seconds, the reported time difference can be something different because it observed impulses as starting and ending point.<br />
:The Power (e.g. for energy meters) is the calculated based of the counted impulses and the time between the first and the last impulse. <br />
:For the next interval, the starting time will be the time of the last impulse in the previous reporting period and the time difference will be taken up to the last impulse before the reporting interval has elapsed.<br />
<br />
:The second, third and fourth numbers (maximum, minimal interval and minimal count) exist for the special case when the pulse frequency is very low and the reporting time is comparatively short.<br />
:For example if the normal interval (first number) is 60 seconds and the device counts only one impulse in 90 seconds, the the calculated power reading will jump up and down and will give ugly numbers.<br />
:By adjusting the other numbers of this attribute this can be avoided.<br />
:In case in the normal interval the observed impulses are encountered in a time difference that is smaller than the third number (minimal interval) or if the number of impulses counted is smaller than the fourth number (minimal count) then the reporting is delayed until the maximum interval has elapsed or the above conditions have changed after another normal interval.<br />
:This way the counter will report a higher number of pulses counted and a larger time difference back to fhem.<br />
<br />
:If this is seems too complicated and you prefer a simple and constant reporting interval, then you can set the normal interval and the mximum interval to the same number. This changes the operation mode of the counter to just count during this normal and maximum interval and report the count. In this case the reported time difference is always the reporting interval and not the measured time between the real impulses.<br />
<br />
;factor <br />
:Define a multiplicator for calculating the power from the impulse count and the time between the first and the last impulse.<br />
:This attribute is outdated and unintuitive so you should avoid it.<br />
:Instead you should specify the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;readingFactor[0-9]+<br />
:Override the factor attribute for this individual pin.<br />
:Just like the attribute factor, this is a rather cumbersome way to specify the pulses per kWh.<br />
:Instaed it is advised to use the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;pulsesPerKWh<br />
:specify the number of pulses that the meter is giving out per unit that sould be displayed (e.g. per kWh energy consumed). For many S0 counters this is 1000, for old ferraris counters this is 75 (rounds per kWh).<br />
:Example: attr myCounter pulsesPerKWh 75<br />
<br />
;readingPulsesPerKWh[0-9]+<br />
:is the same as pulsesPerKWh but specified per pin individually in case you have multiple counters with different settings at the same time<br />
:Example:<br />
:attr myCounter readingPulsesPerKWhA7 75<br />
:attr myCounter readingPulsesPerKWhD4 1000<br />
<br />
;readingNameCount[0-9]+ <br />
:Change the name of the counter reading pinX to something more meaningful.<br />
<br />
;readingNameLongCount[0-9]+ <br />
:Change the name of the counter reading longX to something more meaningful.<br />
<br />
;readingNameInterpolatedCount[0-9]+ <br />
:Change the name of the counter reading InterpolatedLongX to something more meaningful.<br />
<br />
;readingNameCalcCount[AD]?[0-9]+<br />
:Change the name of the real unit counter reading CalcCounterX to something more meaningful.<br />
:Example: attr myCounter readingNameCalcCountD4 CounterHaus_kWh<br />
<br />
;readingNamePower[0-9]+ <br />
:Change the name of the power reading powerX to something more meaningful.<br />
<br />
;readingStartTime[0-9]+ <br />
:Allow the reading time stamp to be set to the beginning of measuring intervals<br />
<br />
;verboseReadings[0-9]+ <br />
:create additional readings: timeDiff, countDiff and lastMsg for each pin<br />
<br />
;devVerbose<br />
:set the verbose level in the counting board. This defaults to 0.<br />
:If the value is >0, then the firmware will echo all commands sent to it by the Fhem module.<br />
:If the value is >=5, then the firmware will report the pin history (assuming that the firmware has been compiled with this feature enabled)<br />
:If the value is >=10, then the firmware will report every level change of a pin<br />
:If the value is >=20, then the firmware will report every analog measurement (assuming that the firmware has been compiled with analog measurements for old ferraris counters or similar).<br />
<br />
;maxHist<br />
:specifies how many pin history lines hould be buffered for "get history".<br />
:This attribute defaults to 1000.<br />
<br />
;analogThresholds<br />
:this Attribute is necessary when you use an arduino nano with connected reflection light barrier (photo transistor and led) to detect the red mark of an old ferraris energy counter. In this case the firmware uses an upper and lower threshold which can be set here.<br />
:Example: attr myCounter analogThresholds 90 110<br />
:In order to find out the right threshold values you can set devVerbose to 20, wait for several turns of the ferraris disc and then use get levels to see the typical measurements for the red mark and the blank disc.<br />
<br />
;flashCommand<br />
:sets the command to call avrdude and flash the onnected arduino with an updated hex file (by default it looks for ArduCounter.hex in the FHEM/firmware subdirectory.<br />
:This attribute contains avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] by default.<br />
:For an Arduino Nano based counter you should add -b 57600 e.g. between the -P and -D options.<br />
:Example: attr myCounter flashCommand avrdude -p atmega328P -c arduino -b 57600 -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
<br />
;keepAliveDelay<br />
:defines an interval in which the module sends keepalive messages to a counter device that is conected via tcp.<br />
:This attribute is ignored if the device is connected via serial port.<br />
:If the device doesn't reply within a defined timeout then the module closes and tries to reopen the connection.<br />
:The module tells the device when to expect the next keepalive message and the device will also close the tcp connection if it doesn't see a :keepalive message within the delay multiplied by 3<br />
:The delay defaults to 10 seconds.<br />
:Example: attr myCounter keepAliveDelay 30<br />
<br />
;keepAliveTimeout<br />
:defines the timeout when wainting for a keealive reply (see keepAliveDelay) The timeout defaults to 2 seconds.<br />
:Example: attr myCounter keepAliveTimeout 3<br />
<br />
;keepAliveRetries<br />
:defines how often sending a keepalive is retried before the connection is closed and reopened.<br />
:It defaults to 2.<br />
:Example: attr myCounter keepAliveRetries 3<br />
<br />
;nextOpenDelay<br />
:defines the time that the module waits before retrying to open a disconnected tcp connection.<br />
:This defaults to 60 seconds.<br />
:Example: attr myCounter nextOpenDelay 20<br />
<br />
;openTimeout<br />
:defines the timeout after which tcp open gives up trying to establish a connection to the counter device. This timeout defaults to 3 seconds.<br />
:Example: attr myCounter openTimeout 5<br />
<br />
;silentReconnect<br />
:if set to 1, then it will set the loglevel for "disconnected" and "reappeared" messages to 4 instead of 3<br />
:Example: attr myCounter silentReconnect 1<br />
<br />
;disable<br />
:if set to 1 then the module closes the connection to a counter device.<br />
<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Energieverbrauchsmessung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=ArduCounter&diff=32257ArduCounter2020-01-01T22:54:15Z<p>Maista: /* Availability */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Count pulses, calculate time between pulses and convert this to readings for e.g. power consumption of Energy meters<br />
|ModType=contrib<br />
|ModCmdRef=ArduCounter<br />
|ModForumArea=Sonstiges<br />
|ModFTopic=19285<br />
|ModTechName=98_ArduCounter.pm<br />
|ModOwner=StefanStrobel ({{Link2FU|3960|Forum}} / [[Benutzer:StefanStrobel|Wiki]])<br />
}}<br />
This module implements an Interface to an Arduino or ESP8266 based counter for pulses on any input pin of an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device. The device connects to FHEM either through USB / serial or via tcp if an ESP board is used.<br />
<br />
The typical use case is an S0-Interface on an energy meter or water meter, but also reflection light barriers to monitor old ferraris counters are supported<br />
<br />
Counters are configured with attributes that define which Arduino pins should count pulses and in which intervals the Arduino board should report the current counts.<br />
<br />
The Arduino sketch that works with this module uses pin change interrupts so it can efficiently count pulses on all available input pins.<br />
The module creates readings for pulse counts, consumption and optionally also a pin history with pulse lengths and gaps of the last pulses.<br />
<br />
== Availability == <br />
The module has been checked in to the FHEM svn. <br />
The corresponding Arduino sketch can also be found under contrib in the subdirectory arduino/.<br />
<br />
== Prerequisites ==<br />
This module requires an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device based on an Atmel 328p or ESP8266 running the ArduCounter sketch provided with this module<br />
<br />
In order to flash an arduino board with the corresponding ArduCounter firmware from within Fhem, avrdude needs to be installed.<br />
<br />
For old ferraris counters an Arduino Uno or Nano or ESP8266 board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line.<br />
<br />
This module also requires Device::SerialPort or Win32::SerialPort for communication via serial lines<br />
<br />
== Define ==<br />
<br />
<pre>define <name> ArduCounter <device></pre><br />
or<br />
<pre>define <name> ArduCounter <ip:port></pre><br />
<br />
<device> specifies the serial port to communicate with the Arduino.<br />
<br />
<ip:port> specifies the ip address and tcp port to communicate with an esp8266 where port is typically 80.<br />
<br />
The name of the serial-device depends on your distribution. You can also specify a baudrate for serial connections if the device name contains the @ character, e.g.: /dev/ttyUSB0@38400. The default baudrate of the ArduCounter firmware is 38400 since Version 1.4<br />
<br />
Examples:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2@38400<br />
define AC ArduCounter 192.168.1.134:80<br />
</pre><br />
<br />
== Configuration of ArduCounter digital counters ==<br />
<br />
Specify the pins where impulses should be counted e.g. as attr AC pinX falling pullup 30<br />
<br />
The X in pinX can be an Arduino / ESP pin number with or without the letter D e.g. pin4, pinD5, pin6, pinD7 ...<br />
<br />
After the pin you can use the keywords falling or rising to define if a logical one / 5V (rising) or a logical zero / 0V (falling) should be treated as pulse.<br />
<br />
The optional keyword pullup activates the pullup resistor for the given Pin.<br />
<br />
The last argument is also optional but recommended and specifies a minimal pulse length in milliseconds.<br />
<br />
An energy meter with S0 interface is typically connected to GND and an input pin like D4.<br />
The S0 pulse then pulls the input to 0V.<br />
Since the minimal pulse lenght of the s0 interface is specified to be 30ms, the typical configuration for an s0 interface is<br />
attr AC pinX falling pullup 30<br />
<br />
Specifying a minimal pulse length is recommended since it filters bouncing of reed contacts or other noise.<br />
<br />
Example:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2<br />
attr AC pulsesPerKWh 1000<br />
attr AC interval 60 300<br />
attr AC pinD4 falling pullup 5<br />
attr AC pinD5 falling pullup 30<br />
attr AC verboseReadingsD5<br />
attr AC pinD6 rising<br />
</pre><br />
<br />
This defines three counters connected to the pins D4, D5 and D5.<br />
D4 and D5 have their pullup resistors activated and the impulse draws the pins to zero.<br />
For D4 and D5 the arduino measures the time in milliseconds between the falling edge and the rising edge. If this time is longer than the specified 5 or 30 milliseconds then the impulse is counted.<br />
If the time is shorter then this impulse is regarded as noise and added to a separate reject counter.<br />
<br />
verboseReadings5 causes the module to create additional readings like the pin history which shows length and gaps between the last pulses.<br />
<br />
For pin D6 the arduino does not check pulse lengths and counts every time when the signal changes from 0 to 1.<br />
<br />
The ArduCounter sketch which must be loaded on the Arduino or ESP implements this using pin change interrupts, so all avilable input pins can be used, not only the ones that support normal interrupts.<br />
The module has been tested with 14 inputs of an Arduino Uno counting in parallel and pulses as short as 3 milliseconds.<br />
<br />
== Configuration of ArduCounter analog counters ==<br />
<br />
This module and the corresponding sketch can be used to read out old analog ferraris energy counters. Therefore an ESP, Arduino Uno or Nano board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line. The idea comes from Martin Kompf (https://www.kompf.de/tech/emeir.html) and has been adopted for ArduCounter to support old ferraris energy counters.<br />
<br />
To support this mode, the sketch has to be compiled with analogIR defined.<br />
<br />
The configuration is then similar to the one for digital counters:<br />
<br />
<pre><br />
define ACF ArduCounter /dev/ttyUSB4<br />
attr ACF analogThresholds 100 110<br />
attr ACF flashCommand avrdude -p atmega328P -b57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
attr ACF interval 60 300 2 2<br />
attr ACF pinA7 rising 20<br />
attr ACF pulsesPerKWh 75<br />
attr ACF stateFormat {sprintf("%.3f kW", ReadingsVal($name,"powerA7",0))}<br />
</pre> <br />
<br />
To find out the right analog thresholds you can set devVerbose to 20 which will ask the firmware of your conting board to report every analog measurement. The ArduCounter module will count how often each value is reported and you can then query these analog level counts with get levels. After a few turns of the ferraris disc the result of get levels might look like this:<br />
<br />
<pre><br />
observed levels from analog input:<br />
94: 21<br />
95: 79<br />
96: 6<br />
97: 2<br />
98: 3<br />
99: 2<br />
100: 2<br />
101: 1<br />
102: 3<br />
105: 2<br />
106: 1<br />
108: 2<br />
109: 1<br />
110: 1<br />
112: 1<br />
113: 3<br />
115: 4<br />
116: 9<br />
117: 14<br />
118: 71<br />
119: 103<br />
120: 118<br />
121: 155<br />
122: 159<br />
123: 143<br />
124: 147<br />
125: 158<br />
126: 198<br />
127: 249<br />
128: 220<br />
129: 230<br />
130: 201<br />
131: 140<br />
132: 147<br />
133: 153<br />
134: 141<br />
135: 119<br />
136: 105<br />
137: 109<br />
138: 114<br />
139: 83<br />
140: 33<br />
141: 14<br />
142: 1 <br />
</pre> <br />
<br />
This shows the measured values together with the frequency how often the individual value has been measured. It is obvious that most measurements result in values between 120 and 135, very few values are betweem 96 and 115 and another peak is around the value 95.<br />
It means that the when the red mark of the ferraris disc is under the sensor, the value is around 95 and while the blank disc is under the sensor, the value is typically between 120 and 135. So a good upper threshold would be 120 and a good lower threshold would be for example 96.<br />
<br />
== Get-Commands ==<br />
;info <br />
:send a command to the Arduino board to get current counts. <br />
:This is not needed for normal operation but might be useful sometimes for debugging.<br />
<br />
;levels<br />
:show the count for the measured levels if an analog pin is used to measure e.g. the red mark of a ferraris counter disc. <br />
:This is useful for setting the thresholds for analog measurements.<br />
<br />
;history<br />
:shows details regarding all the level changes that the counter device (Arduino or ESP) has detected <br />
:and how they were used (counted or rejected)<br />
:If get history is issued with a pin name (e.g. get history D5) then only the history entries concerning D5 will be shown.<br />
:This information is sent from the device to Fhem when it reports the current count but only if devVerbose is equal or greater than 5.<br />
:The maximum number of lines that the Arducounter module stores in a ring buffer is defined by the attribute maxHist and defaults to 1000.<br />
<br />
<br />
== Set-Commands ==<br />
<br />
;raw<br />
:send the value to the board so you can directly talk to the sketch using its commands.<br />
:This is not needed for normal operation but might be useful sometimes for debugging<br />
<br />
;flash<br />
:flashes the ArduCounter firmware ArduCounter.hex from the fhem subdirectory FHEM/firmware onto the device. <br />
:This command needs avrdude to be installed. The attribute flashCommand specidies how avrdude is called. <br />
:If it is not modifed then the module sets it to avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
:This setting should work for a standard installation and the placeholders are automatically replaced when the command is used. <br />
:So normally there is no need to modify this attribute.<br />
:Depending on your specific Arduino board however, you might need to insert -b 57600 in the flash Command. <br />
:(e.g. for an Arduino Nano) ESP boards so far have to be fashed from the Arduino IDE. In a future version flashing over the air sould be supported.<br />
<br />
;reset<br />
:reopens the arduino device and sends a command to it which causes a reinitialize and reset of the counters. Then the module resends the attribute configuration / definition of the pins to the device.<br />
<br />
;saveConfig<br />
:stores the current interval, analog threshold and pin configuration to be stored in the EEPROM of the counter device <br />
:so it can be retrieved after a reset.<br />
<br />
;enable<br />
:sets the attribute disable to 0<br />
<br />
;disable<br />
:sets the attribute disable to 1<br />
<br />
;reconnect<br />
:closes the tcp connection to an ESP based counter board that is conected via TCP/IP and reopen the connection<br />
<br />
<br />
== Supported readings ==<br />
The module creates at least the following readings and events for each defined pin:<br />
<br />
;pin.* e.g. pinD4<br />
:the current internal count at this pin (internal to the Arduino / ESP device, starts at 0 when the device restarts).<br />
:The name of this reading can be changed with the attribute readingNameCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;long.* e.g. longD5<br />
:long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts.<br />
:The name of this reading can be changed with the attribute readingNameLongCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;interpolatedLong.*<br />
:like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart.<br />
:The name of this reading can be changed with the attribute readingNameInterpolatedCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;calcCounter.*<br />
:similar to long count which keeps on counting up after fhem restarts but this counter will take the pulses per kWh setting into the :calculation und thus not count pulses but real kWh (or some other unit that is applicable)<br />
:The name of this reading can be changed with the attribute readingNameCalcCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;reject.*<br />
:counts rejected pulses that are shorter than the specified minimal pulse length.<br />
<br />
;power.*<br />
:the current calculated power at this pin.<br />
:The name of this reading can be changed with the attribute readingNamePower[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;pinHistory.*<br />
:shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G<br />
:The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action. -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.<br />
<br />
;countDiff.*<br />
:delta of the current count to the last reported one. This is used together with timeDiff.* to calculate the power consumption.<br />
<br />
;timeDiff.*<br />
:time difference between the first pulse in the current observation interval and the last one. Used togehter with countDiff to calculate the power consumption.<br />
<br />
;seq.*<br />
:internal sequence number of the last report from the board to Fhem.<br />
<br />
<br />
== Attributes ==<br />
<br />
;do_not_notify<br />
: ...<br />
<br />
;pin.* <br />
:Define a pin of the Arduino board as input. This attribute expects either <code>rising</code>, <code>falling</code> or <code>change</code>, followed by an optional <code>pullup</code> and an optional number as value.<br />
:If a number is specified, the arduino will track rising and falling edges of each impulse and measure the length of a pulse in milliseconds. <br />
:The number specified here is the minimal length of a pulse and a pause before a pulse. If one is too small, the pulse is not counted but added to a separate reject counter.<br />
<br />
;interval normal max min mincout <br />
:Defines the parameters that affect the way counting and reporting works.<br />
:This Attribute expects at least two and a maximum of four numbers as value. <br />
: The first is the normal interval, the second the maximal interval, the third is a minimal interval and the fourth is a minimal pulse count.<br />
<br />
:In the usual operation mode (when the normal interval is smaller than the maximum interval), the Arduino board just counts and remembers the time between the first impulse and the last impulse for each pin.<br />
:After the normal interval is elapsed the Arduino board reports the count and time for those pins where impulses were encountered.<br />
:This means that even though the normal interval might be 10 seconds, the reported time difference can be something different because it observed impulses as starting and ending point.<br />
:The Power (e.g. for energy meters) is the calculated based of the counted impulses and the time between the first and the last impulse. <br />
:For the next interval, the starting time will be the time of the last impulse in the previous reporting period and the time difference will be taken up to the last impulse before the reporting interval has elapsed.<br />
<br />
:The second, third and fourth numbers (maximum, minimal interval and minimal count) exist for the special case when the pulse frequency is very low and the reporting time is comparatively short.<br />
:For example if the normal interval (first number) is 60 seconds and the device counts only one impulse in 90 seconds, the the calculated power reading will jump up and down and will give ugly numbers.<br />
:By adjusting the other numbers of this attribute this can be avoided.<br />
:In case in the normal interval the observed impulses are encountered in a time difference that is smaller than the third number (minimal interval) or if the number of impulses counted is smaller than the fourth number (minimal count) then the reporting is delayed until the maximum interval has elapsed or the above conditions have changed after another normal interval.<br />
:This way the counter will report a higher number of pulses counted and a larger time difference back to fhem.<br />
<br />
:If this is seems too complicated and you prefer a simple and constant reporting interval, then you can set the normal interval and the mximum interval to the same number. This changes the operation mode of the counter to just count during this normal and maximum interval and report the count. In this case the reported time difference is always the reporting interval and not the measured time between the real impulses.<br />
<br />
;factor <br />
:Define a multiplicator for calculating the power from the impulse count and the time between the first and the last impulse.<br />
:This attribute is outdated and unintuitive so you should avoid it.<br />
:Instead you should specify the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;readingFactor[0-9]+<br />
:Override the factor attribute for this individual pin.<br />
:Just like the attribute factor, this is a rather cumbersome way to specify the pulses per kWh.<br />
:Instaed it is advised to use the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;pulsesPerKWh<br />
:specify the number of pulses that the meter is giving out per unit that sould be displayed (e.g. per kWh energy consumed). For many S0 counters this is 1000, for old ferraris counters this is 75 (rounds per kWh).<br />
:Example: attr myCounter pulsesPerKWh 75<br />
<br />
;readingPulsesPerKWh[0-9]+<br />
:is the same as pulsesPerKWh but specified per pin individually in case you have multiple counters with different settings at the same time<br />
:Example:<br />
:attr myCounter readingPulsesPerKWhA7 75<br />
:attr myCounter readingPulsesPerKWhD4 1000<br />
<br />
;readingNameCount[0-9]+ <br />
:Change the name of the counter reading pinX to something more meaningful.<br />
<br />
;readingNameLongCount[0-9]+ <br />
:Change the name of the counter reading longX to something more meaningful.<br />
<br />
;readingNameInterpolatedCount[0-9]+ <br />
:Change the name of the counter reading InterpolatedLongX to something more meaningful.<br />
<br />
;readingNameCalcCount[AD]?[0-9]+<br />
:Change the name of the real unit counter reading CalcCounterX to something more meaningful.<br />
:Example: attr myCounter readingNameCalcCountD4 CounterHaus_kWh<br />
<br />
;readingNamePower[0-9]+ <br />
:Change the name of the power reading powerX to something more meaningful.<br />
<br />
;readingStartTime[0-9]+ <br />
:Allow the reading time stamp to be set to the beginning of measuring intervals<br />
<br />
;verboseReadings[0-9]+ <br />
:create additional readings: timeDiff, countDiff and lastMsg for each pin<br />
<br />
;devVerbose<br />
:set the verbose level in the counting board. This defaults to 0.<br />
:If the value is >0, then the firmware will echo all commands sent to it by the Fhem module.<br />
:If the value is >=5, then the firmware will report the pin history (assuming that the firmware has been compiled with this feature enabled)<br />
:If the value is >=10, then the firmware will report every level change of a pin<br />
:If the value is >=20, then the firmware will report every analog measurement (assuming that the firmware has been compiled with analog measurements for old ferraris counters or similar).<br />
<br />
;maxHist<br />
:specifies how many pin history lines hould be buffered for "get history".<br />
:This attribute defaults to 1000.<br />
<br />
;analogThresholds<br />
:this Attribute is necessary when you use an arduino nano with connected reflection light barrier (photo transistor and led) to detect the red mark of an old ferraris energy counter. In this case the firmware uses an upper and lower threshold which can be set here.<br />
:Example: attr myCounter analogThresholds 90 110<br />
:In order to find out the right threshold values you can set devVerbose to 20, wait for several turns of the ferraris disc and then use get levels to see the typical measurements for the red mark and the blank disc.<br />
<br />
;flashCommand<br />
:sets the command to call avrdude and flash the onnected arduino with an updated hex file (by default it looks for ArduCounter.hex in the FHEM/firmware subdirectory.<br />
:This attribute contains avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] by default.<br />
:For an Arduino Nano based counter you should add -b 57600 e.g. between the -P and -D options.<br />
:Example: attr myCounter flashCommand avrdude -p atmega328P -c arduino -b 57600 -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
<br />
;keepAliveDelay<br />
:defines an interval in which the module sends keepalive messages to a counter device that is conected via tcp.<br />
:This attribute is ignored if the device is connected via serial port.<br />
:If the device doesn't reply within a defined timeout then the module closes and tries to reopen the connection.<br />
:The module tells the device when to expect the next keepalive message and the device will also close the tcp connection if it doesn't see a :keepalive message within the delay multiplied by 3<br />
:The delay defaults to 10 seconds.<br />
:Example: attr myCounter keepAliveDelay 30<br />
<br />
;keepAliveTimeout<br />
:defines the timeout when wainting for a keealive reply (see keepAliveDelay) The timeout defaults to 2 seconds.<br />
:Example: attr myCounter keepAliveTimeout 3<br />
<br />
;keepAliveRetries<br />
:defines how often sending a keepalive is retried before the connection is closed and reopened.<br />
:It defaults to 2.<br />
:Example: attr myCounter keepAliveRetries 3<br />
<br />
;nextOpenDelay<br />
:defines the time that the module waits before retrying to open a disconnected tcp connection.<br />
:This defaults to 60 seconds.<br />
:Example: attr myCounter nextOpenDelay 20<br />
<br />
;openTimeout<br />
:defines the timeout after which tcp open gives up trying to establish a connection to the counter device. This timeout defaults to 3 seconds.<br />
:Example: attr myCounter openTimeout 5<br />
<br />
;silentReconnect<br />
:if set to 1, then it will set the loglevel for "disconnected" and "reappeared" messages to 4 instead of 3<br />
:Example: attr myCounter silentReconnect 1<br />
<br />
;disable<br />
:if set to 1 then the module closes the connection to a counter device.<br />
<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Energieverbrauchsmessung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=ArduCounter&diff=32256ArduCounter2020-01-01T22:53:40Z<p>Maista: </p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Count pulses, calculate time between pulses and convert this to readings for e.g. power consumption of Energy meters<br />
|ModType=contrib<br />
|ModCmdRef=ArduCounter<br />
|ModForumArea=Sonstiges<br />
|ModFTopic=19285<br />
|ModTechName=98_ArduCounter.pm<br />
|ModOwner=StefanStrobel ({{Link2FU|3960|Forum}} / [[Benutzer:StefanStrobel|Wiki]])<br />
}}<br />
This module implements an Interface to an Arduino or ESP8266 based counter for pulses on any input pin of an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device. The device connects to FHEM either through USB / serial or via tcp if an ESP board is used.<br />
<br />
The typical use case is an S0-Interface on an energy meter or water meter, but also reflection light barriers to monitor old ferraris counters are supported<br />
<br />
Counters are configured with attributes that define which Arduino pins should count pulses and in which intervals the Arduino board should report the current counts.<br />
<br />
The Arduino sketch that works with this module uses pin change interrupts so it can efficiently count pulses on all available input pins.<br />
The module creates readings for pulse counts, consumption and optionally also a pin history with pulse lengths and gaps of the last pulses.<br />
<br />
== Availability == <br />
The module has been checked in to the FHEM svn. <br />
The corresponding arduino sketch can also be found under contrib in the subdirectory arduino/.<br />
<br />
== Prerequisites ==<br />
This module requires an Arduino Uno, Nano, Jeenode, NodeMCU, Wemos D1 or similar device based on an Atmel 328p or ESP8266 running the ArduCounter sketch provided with this module<br />
<br />
In order to flash an arduino board with the corresponding ArduCounter firmware from within Fhem, avrdude needs to be installed.<br />
<br />
For old ferraris counters an Arduino Uno or Nano or ESP8266 board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line.<br />
<br />
This module also requires Device::SerialPort or Win32::SerialPort for communication via serial lines<br />
<br />
== Define ==<br />
<br />
<pre>define <name> ArduCounter <device></pre><br />
or<br />
<pre>define <name> ArduCounter <ip:port></pre><br />
<br />
<device> specifies the serial port to communicate with the Arduino.<br />
<br />
<ip:port> specifies the ip address and tcp port to communicate with an esp8266 where port is typically 80.<br />
<br />
The name of the serial-device depends on your distribution. You can also specify a baudrate for serial connections if the device name contains the @ character, e.g.: /dev/ttyUSB0@38400. The default baudrate of the ArduCounter firmware is 38400 since Version 1.4<br />
<br />
Examples:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2@38400<br />
define AC ArduCounter 192.168.1.134:80<br />
</pre><br />
<br />
== Configuration of ArduCounter digital counters ==<br />
<br />
Specify the pins where impulses should be counted e.g. as attr AC pinX falling pullup 30<br />
<br />
The X in pinX can be an Arduino / ESP pin number with or without the letter D e.g. pin4, pinD5, pin6, pinD7 ...<br />
<br />
After the pin you can use the keywords falling or rising to define if a logical one / 5V (rising) or a logical zero / 0V (falling) should be treated as pulse.<br />
<br />
The optional keyword pullup activates the pullup resistor for the given Pin.<br />
<br />
The last argument is also optional but recommended and specifies a minimal pulse length in milliseconds.<br />
<br />
An energy meter with S0 interface is typically connected to GND and an input pin like D4.<br />
The S0 pulse then pulls the input to 0V.<br />
Since the minimal pulse lenght of the s0 interface is specified to be 30ms, the typical configuration for an s0 interface is<br />
attr AC pinX falling pullup 30<br />
<br />
Specifying a minimal pulse length is recommended since it filters bouncing of reed contacts or other noise.<br />
<br />
Example:<br />
<pre><br />
define AC ArduCounter /dev/ttyUSB2<br />
attr AC pulsesPerKWh 1000<br />
attr AC interval 60 300<br />
attr AC pinD4 falling pullup 5<br />
attr AC pinD5 falling pullup 30<br />
attr AC verboseReadingsD5<br />
attr AC pinD6 rising<br />
</pre><br />
<br />
This defines three counters connected to the pins D4, D5 and D5.<br />
D4 and D5 have their pullup resistors activated and the impulse draws the pins to zero.<br />
For D4 and D5 the arduino measures the time in milliseconds between the falling edge and the rising edge. If this time is longer than the specified 5 or 30 milliseconds then the impulse is counted.<br />
If the time is shorter then this impulse is regarded as noise and added to a separate reject counter.<br />
<br />
verboseReadings5 causes the module to create additional readings like the pin history which shows length and gaps between the last pulses.<br />
<br />
For pin D6 the arduino does not check pulse lengths and counts every time when the signal changes from 0 to 1.<br />
<br />
The ArduCounter sketch which must be loaded on the Arduino or ESP implements this using pin change interrupts, so all avilable input pins can be used, not only the ones that support normal interrupts.<br />
The module has been tested with 14 inputs of an Arduino Uno counting in parallel and pulses as short as 3 milliseconds.<br />
<br />
== Configuration of ArduCounter analog counters ==<br />
<br />
This module and the corresponding sketch can be used to read out old analog ferraris energy counters. Therefore an ESP, Arduino Uno or Nano board needs to be connected to a reflection light barrier which consists simply of an infra red photo transistor (connected to A7 on Arduinos and A0 on ESP8266) and an infra red led (connected to D2 on Arduinos and to D6 on ESP8266), both with a resistor in line. The idea comes from Martin Kompf (https://www.kompf.de/tech/emeir.html) and has been adopted for ArduCounter to support old ferraris energy counters.<br />
<br />
To support this mode, the sketch has to be compiled with analogIR defined.<br />
<br />
The configuration is then similar to the one for digital counters:<br />
<br />
<pre><br />
define ACF ArduCounter /dev/ttyUSB4<br />
attr ACF analogThresholds 100 110<br />
attr ACF flashCommand avrdude -p atmega328P -b57600 -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
attr ACF interval 60 300 2 2<br />
attr ACF pinA7 rising 20<br />
attr ACF pulsesPerKWh 75<br />
attr ACF stateFormat {sprintf("%.3f kW", ReadingsVal($name,"powerA7",0))}<br />
</pre> <br />
<br />
To find out the right analog thresholds you can set devVerbose to 20 which will ask the firmware of your conting board to report every analog measurement. The ArduCounter module will count how often each value is reported and you can then query these analog level counts with get levels. After a few turns of the ferraris disc the result of get levels might look like this:<br />
<br />
<pre><br />
observed levels from analog input:<br />
94: 21<br />
95: 79<br />
96: 6<br />
97: 2<br />
98: 3<br />
99: 2<br />
100: 2<br />
101: 1<br />
102: 3<br />
105: 2<br />
106: 1<br />
108: 2<br />
109: 1<br />
110: 1<br />
112: 1<br />
113: 3<br />
115: 4<br />
116: 9<br />
117: 14<br />
118: 71<br />
119: 103<br />
120: 118<br />
121: 155<br />
122: 159<br />
123: 143<br />
124: 147<br />
125: 158<br />
126: 198<br />
127: 249<br />
128: 220<br />
129: 230<br />
130: 201<br />
131: 140<br />
132: 147<br />
133: 153<br />
134: 141<br />
135: 119<br />
136: 105<br />
137: 109<br />
138: 114<br />
139: 83<br />
140: 33<br />
141: 14<br />
142: 1 <br />
</pre> <br />
<br />
This shows the measured values together with the frequency how often the individual value has been measured. It is obvious that most measurements result in values between 120 and 135, very few values are betweem 96 and 115 and another peak is around the value 95.<br />
It means that the when the red mark of the ferraris disc is under the sensor, the value is around 95 and while the blank disc is under the sensor, the value is typically between 120 and 135. So a good upper threshold would be 120 and a good lower threshold would be for example 96.<br />
<br />
== Get-Commands ==<br />
;info <br />
:send a command to the Arduino board to get current counts. <br />
:This is not needed for normal operation but might be useful sometimes for debugging.<br />
<br />
;levels<br />
:show the count for the measured levels if an analog pin is used to measure e.g. the red mark of a ferraris counter disc. <br />
:This is useful for setting the thresholds for analog measurements.<br />
<br />
;history<br />
:shows details regarding all the level changes that the counter device (Arduino or ESP) has detected <br />
:and how they were used (counted or rejected)<br />
:If get history is issued with a pin name (e.g. get history D5) then only the history entries concerning D5 will be shown.<br />
:This information is sent from the device to Fhem when it reports the current count but only if devVerbose is equal or greater than 5.<br />
:The maximum number of lines that the Arducounter module stores in a ring buffer is defined by the attribute maxHist and defaults to 1000.<br />
<br />
<br />
== Set-Commands ==<br />
<br />
;raw<br />
:send the value to the board so you can directly talk to the sketch using its commands.<br />
:This is not needed for normal operation but might be useful sometimes for debugging<br />
<br />
;flash<br />
:flashes the ArduCounter firmware ArduCounter.hex from the fhem subdirectory FHEM/firmware onto the device. <br />
:This command needs avrdude to be installed. The attribute flashCommand specidies how avrdude is called. <br />
:If it is not modifed then the module sets it to avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
:This setting should work for a standard installation and the placeholders are automatically replaced when the command is used. <br />
:So normally there is no need to modify this attribute.<br />
:Depending on your specific Arduino board however, you might need to insert -b 57600 in the flash Command. <br />
:(e.g. for an Arduino Nano) ESP boards so far have to be fashed from the Arduino IDE. In a future version flashing over the air sould be supported.<br />
<br />
;reset<br />
:reopens the arduino device and sends a command to it which causes a reinitialize and reset of the counters. Then the module resends the attribute configuration / definition of the pins to the device.<br />
<br />
;saveConfig<br />
:stores the current interval, analog threshold and pin configuration to be stored in the EEPROM of the counter device <br />
:so it can be retrieved after a reset.<br />
<br />
;enable<br />
:sets the attribute disable to 0<br />
<br />
;disable<br />
:sets the attribute disable to 1<br />
<br />
;reconnect<br />
:closes the tcp connection to an ESP based counter board that is conected via TCP/IP and reopen the connection<br />
<br />
<br />
== Supported readings ==<br />
The module creates at least the following readings and events for each defined pin:<br />
<br />
;pin.* e.g. pinD4<br />
:the current internal count at this pin (internal to the Arduino / ESP device, starts at 0 when the device restarts).<br />
:The name of this reading can be changed with the attribute readingNameCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;long.* e.g. longD5<br />
:long count which keeps on counting up after fhem restarts whereas the pin.* count is only a temporary internal count that starts at 0 when the arduino board starts.<br />
:The name of this reading can be changed with the attribute readingNameLongCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;interpolatedLong.*<br />
:like long.* but when the Arduino restarts the potentially missed pulses are interpolated based on the pulse rate before the restart and after the restart.<br />
:The name of this reading can be changed with the attribute readingNameInterpolatedCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;calcCounter.*<br />
:similar to long count which keeps on counting up after fhem restarts but this counter will take the pulses per kWh setting into the :calculation und thus not count pulses but real kWh (or some other unit that is applicable)<br />
:The name of this reading can be changed with the attribute readingNameCalcCount[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;reject.*<br />
:counts rejected pulses that are shorter than the specified minimal pulse length.<br />
<br />
;power.*<br />
:the current calculated power at this pin.<br />
:The name of this reading can be changed with the attribute readingNamePower[AD]?[0-9]+ where [AD]?[0-9]+ stands for the pin description e.g. D4<br />
<br />
;pinHistory.*<br />
:shows detailed information of the last pulses. This is only available when a minimal pulse length is specified for this pin. Also the total number of impulses recorded here is limited to 20 for all pins together. The output looks like -36/7:0C, -29/7:1G, -22/8:0C, -14/7:1G, -7/7:0C, 0/7:1G<br />
:The first number is the relative time in milliseconds when the input level changed, followed by the length in milliseconds, the level and the internal action. -36/7:0C for example means that 36 milliseconds before the reporting started, the input changed to 0V, stayed there for 7 milliseconds and this was counted.<br />
<br />
;countDiff.*<br />
:delta of the current count to the last reported one. This is used together with timeDiff.* to calculate the power consumption.<br />
<br />
;timeDiff.*<br />
:time difference between the first pulse in the current observation interval and the last one. Used togehter with countDiff to calculate the power consumption.<br />
<br />
;seq.*<br />
:internal sequence number of the last report from the board to Fhem.<br />
<br />
<br />
== Attributes ==<br />
<br />
;do_not_notify<br />
: ...<br />
<br />
;pin.* <br />
:Define a pin of the Arduino board as input. This attribute expects either <code>rising</code>, <code>falling</code> or <code>change</code>, followed by an optional <code>pullup</code> and an optional number as value.<br />
:If a number is specified, the arduino will track rising and falling edges of each impulse and measure the length of a pulse in milliseconds. <br />
:The number specified here is the minimal length of a pulse and a pause before a pulse. If one is too small, the pulse is not counted but added to a separate reject counter.<br />
<br />
;interval normal max min mincout <br />
:Defines the parameters that affect the way counting and reporting works.<br />
:This Attribute expects at least two and a maximum of four numbers as value. <br />
: The first is the normal interval, the second the maximal interval, the third is a minimal interval and the fourth is a minimal pulse count.<br />
<br />
:In the usual operation mode (when the normal interval is smaller than the maximum interval), the Arduino board just counts and remembers the time between the first impulse and the last impulse for each pin.<br />
:After the normal interval is elapsed the Arduino board reports the count and time for those pins where impulses were encountered.<br />
:This means that even though the normal interval might be 10 seconds, the reported time difference can be something different because it observed impulses as starting and ending point.<br />
:The Power (e.g. for energy meters) is the calculated based of the counted impulses and the time between the first and the last impulse. <br />
:For the next interval, the starting time will be the time of the last impulse in the previous reporting period and the time difference will be taken up to the last impulse before the reporting interval has elapsed.<br />
<br />
:The second, third and fourth numbers (maximum, minimal interval and minimal count) exist for the special case when the pulse frequency is very low and the reporting time is comparatively short.<br />
:For example if the normal interval (first number) is 60 seconds and the device counts only one impulse in 90 seconds, the the calculated power reading will jump up and down and will give ugly numbers.<br />
:By adjusting the other numbers of this attribute this can be avoided.<br />
:In case in the normal interval the observed impulses are encountered in a time difference that is smaller than the third number (minimal interval) or if the number of impulses counted is smaller than the fourth number (minimal count) then the reporting is delayed until the maximum interval has elapsed or the above conditions have changed after another normal interval.<br />
:This way the counter will report a higher number of pulses counted and a larger time difference back to fhem.<br />
<br />
:If this is seems too complicated and you prefer a simple and constant reporting interval, then you can set the normal interval and the mximum interval to the same number. This changes the operation mode of the counter to just count during this normal and maximum interval and report the count. In this case the reported time difference is always the reporting interval and not the measured time between the real impulses.<br />
<br />
;factor <br />
:Define a multiplicator for calculating the power from the impulse count and the time between the first and the last impulse.<br />
:This attribute is outdated and unintuitive so you should avoid it.<br />
:Instead you should specify the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;readingFactor[0-9]+<br />
:Override the factor attribute for this individual pin.<br />
:Just like the attribute factor, this is a rather cumbersome way to specify the pulses per kWh.<br />
:Instaed it is advised to use the attribute pulsesPerKWh or readingPulsesPerKWh[0-9]+ (where [0-9]+ stands for the pin number).<br />
<br />
;pulsesPerKWh<br />
:specify the number of pulses that the meter is giving out per unit that sould be displayed (e.g. per kWh energy consumed). For many S0 counters this is 1000, for old ferraris counters this is 75 (rounds per kWh).<br />
:Example: attr myCounter pulsesPerKWh 75<br />
<br />
;readingPulsesPerKWh[0-9]+<br />
:is the same as pulsesPerKWh but specified per pin individually in case you have multiple counters with different settings at the same time<br />
:Example:<br />
:attr myCounter readingPulsesPerKWhA7 75<br />
:attr myCounter readingPulsesPerKWhD4 1000<br />
<br />
;readingNameCount[0-9]+ <br />
:Change the name of the counter reading pinX to something more meaningful.<br />
<br />
;readingNameLongCount[0-9]+ <br />
:Change the name of the counter reading longX to something more meaningful.<br />
<br />
;readingNameInterpolatedCount[0-9]+ <br />
:Change the name of the counter reading InterpolatedLongX to something more meaningful.<br />
<br />
;readingNameCalcCount[AD]?[0-9]+<br />
:Change the name of the real unit counter reading CalcCounterX to something more meaningful.<br />
:Example: attr myCounter readingNameCalcCountD4 CounterHaus_kWh<br />
<br />
;readingNamePower[0-9]+ <br />
:Change the name of the power reading powerX to something more meaningful.<br />
<br />
;readingStartTime[0-9]+ <br />
:Allow the reading time stamp to be set to the beginning of measuring intervals<br />
<br />
;verboseReadings[0-9]+ <br />
:create additional readings: timeDiff, countDiff and lastMsg for each pin<br />
<br />
;devVerbose<br />
:set the verbose level in the counting board. This defaults to 0.<br />
:If the value is >0, then the firmware will echo all commands sent to it by the Fhem module.<br />
:If the value is >=5, then the firmware will report the pin history (assuming that the firmware has been compiled with this feature enabled)<br />
:If the value is >=10, then the firmware will report every level change of a pin<br />
:If the value is >=20, then the firmware will report every analog measurement (assuming that the firmware has been compiled with analog measurements for old ferraris counters or similar).<br />
<br />
;maxHist<br />
:specifies how many pin history lines hould be buffered for "get history".<br />
:This attribute defaults to 1000.<br />
<br />
;analogThresholds<br />
:this Attribute is necessary when you use an arduino nano with connected reflection light barrier (photo transistor and led) to detect the red mark of an old ferraris energy counter. In this case the firmware uses an upper and lower threshold which can be set here.<br />
:Example: attr myCounter analogThresholds 90 110<br />
:In order to find out the right threshold values you can set devVerbose to 20, wait for several turns of the ferraris disc and then use get levels to see the typical measurements for the red mark and the blank disc.<br />
<br />
;flashCommand<br />
:sets the command to call avrdude and flash the onnected arduino with an updated hex file (by default it looks for ArduCounter.hex in the FHEM/firmware subdirectory.<br />
:This attribute contains avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] by default.<br />
:For an Arduino Nano based counter you should add -b 57600 e.g. between the -P and -D options.<br />
:Example: attr myCounter flashCommand avrdude -p atmega328P -c arduino -b 57600 -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]<br />
<br />
;keepAliveDelay<br />
:defines an interval in which the module sends keepalive messages to a counter device that is conected via tcp.<br />
:This attribute is ignored if the device is connected via serial port.<br />
:If the device doesn't reply within a defined timeout then the module closes and tries to reopen the connection.<br />
:The module tells the device when to expect the next keepalive message and the device will also close the tcp connection if it doesn't see a :keepalive message within the delay multiplied by 3<br />
:The delay defaults to 10 seconds.<br />
:Example: attr myCounter keepAliveDelay 30<br />
<br />
;keepAliveTimeout<br />
:defines the timeout when wainting for a keealive reply (see keepAliveDelay) The timeout defaults to 2 seconds.<br />
:Example: attr myCounter keepAliveTimeout 3<br />
<br />
;keepAliveRetries<br />
:defines how often sending a keepalive is retried before the connection is closed and reopened.<br />
:It defaults to 2.<br />
:Example: attr myCounter keepAliveRetries 3<br />
<br />
;nextOpenDelay<br />
:defines the time that the module waits before retrying to open a disconnected tcp connection.<br />
:This defaults to 60 seconds.<br />
:Example: attr myCounter nextOpenDelay 20<br />
<br />
;openTimeout<br />
:defines the timeout after which tcp open gives up trying to establish a connection to the counter device. This timeout defaults to 3 seconds.<br />
:Example: attr myCounter openTimeout 5<br />
<br />
;silentReconnect<br />
:if set to 1, then it will set the loglevel for "disconnected" and "reappeared" messages to 4 instead of 3<br />
:Example: attr myCounter silentReconnect 1<br />
<br />
;disable<br />
:if set to 1 then the module closes the connection to a counter device.<br />
<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Energieverbrauchsmessung]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Template&diff=31782Template2019-12-01T18:41:26Z<p>Maista: </p>
<hr />
<div>{{SEITENTITEL:template}}<br />
{{Infobox Modul<br />
|ModPurpose=Einfaches Erstellen gleichartiger Devices<br />
|ModType=cmd<br />
|ModCmdRef=template<br />
|ModForumArea=Sonstiges<br />
|ModTechName=98_template.pm<br />
|ModOwner=Dr. Boris Neubert ({{Link2FU|10| Forum}})<br />
}}<br />
Der [[template]]-Befehl vereinfacht das Erstellen gleichartiger Devices in FHEM. Ein Template-File besteht im Grunde aus FHEM Befehlen, in die Platzhalter eingefügt werden. Beim Aufruf des Template-Befehles werden die Platzhalter durch konkrete Werte ersetzt. Damit lassen sich sehr schnell ähnliche Devices (oder Kombinationen von Devices) erstellen oder ändern. Ein Template-File könnte z.B. die Definition eines Dummies inkl. mehrerer sich auf den Dummy beziehenden [[notify]] und [[at]] enthalten. Durch wiederholte Ausführung des Templates lassen sich so schnell Devices und ihre Verarbeitungslogik erstellen.<br />
<br />
== Template-File erstellen ==<br />
Template-Files werden außerhalb FHEM erstellt und dann auf dem FHEM Server (in einem Unterverzeichnis von FHEM) abgelegt. Nutzer von [[configdb]] müssen das File zunächst importieren.<br />
<br />
Derzeit (März 2017) können Template-Files noch nicht über "Edit Files" in FHEM direkt bearbeitet werden. Über einen Workaround ist dies jedoch möglich. Dateien, die in /FHEM abgelegt sind und Endungen wie z.B. .holiday oder .layout haben, werden unter "Edit Files" angezeigt und können in FHEM bearbeitet werden.<br />
Das Template File kann mittels<br />
:<code>template show <templateFile></code><br />
angezeigt werden<br />
<br />
== Template-File mit Inhalt füllen ==<br />
Das Template besteht aus FHEM Befehlen mit Platzhaltern, die bei der Ausführung des Template-Befehls durch konkrete Werte ersetzt werden. Ein Template könnte beispielsweise folgendermaßen definiert werden.<br />
<pre><br />
# my Template File ./FHEM/tmpl_example.layout<br />
define %name% dummy <br />
<br />
define di_%name% doif ([%name]) (set %device" on)<br />
attr di_%name do always<br />
</pre><br />
<br />
Im Gegensatz zur Kopie eines Devices mit [[copy]] ermöglicht der Template-Befehl die Definition mehrerer - von einander abhängiger - Geräte "in einem Rutsch". Oben stehendes Beispiel ist bewusst einfach gehalten um diesen Aspekt zu verdeutlichen.<br />
<br />
Für komplexere Templates bietet sich die [[Import_von_Code_Snippets|raw definition]] eines existierenden Gerätes als Ausgangspunkt an.<br />
<br />
== Template ausführen ==<br />
Bei Ausführung des Templates werden die FHEM Befehle des Template-Files abgearbeitet. In oben definiertem Beispiel würde also ein <br />
:<code>template ./FHEM/tmpl_example.layout name=myDummy device=myDevice</code><br />
dazu führen, dass ein Dummy inkl. zugehörigem [[DOIF]] angelegt würde.<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Glossary]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Template&diff=31781Template2019-12-01T18:41:11Z<p>Maista: /* Template File mit Inhalt füllen */</p>
<hr />
<div>{{SEITENTITEL:template}}<br />
{{Infobox Modul<br />
|ModPurpose=Einfaches Erstellen gleichartiger Devices<br />
|ModType=cmd<br />
|ModCmdRef=template<br />
|ModForumArea=Sonstiges<br />
|ModTechName=98_template.pm<br />
|ModOwner=Dr. Boris Neubert ({{Link2FU|10| Forum}})<br />
}}<br />
Der [[template]] Befehl vereinfacht das Erstellen gleichartiger Devices in FHEM. Ein Template-File besteht im Grunde aus FHEM Befehlen, in die Platzhalter eingefügt werden. Beim Aufruf des Template-Befehles werden die Platzhalter durch konkrete Werte ersetzt. Damit lassen sich sehr schnell ähnliche Devices (oder Kombinationen von Devices) erstellen oder ändern. Ein Template-File könnte z.B. die Definition eines Dummies inkl. mehrerer sich auf den Dummy beziehenden [[notify]] und [[at]] enthalten. Durch wiederholte Ausführung des Templates lassen sich so schnell Devices und ihre Verarbeitungslogik erstellen.<br />
<br />
== Template-File erstellen ==<br />
Template-Files werden außerhalb FHEM erstellt und dann auf dem FHEM Server (in einem Unterverzeichnis von FHEM) abgelegt. Nutzer von [[configdb]] müssen das File zunächst importieren.<br />
<br />
Derzeit (März 2017) können Template-Files noch nicht über "Edit Files" in FHEM direkt bearbeitet werden. Über einen Workaround ist dies jedoch möglich. Dateien, die in /FHEM abgelegt sind und Endungen wie z.B. .holiday oder .layout haben, werden unter "Edit Files" angezeigt und können in FHEM bearbeitet werden.<br />
Das Template File kann mittels<br />
:<code>template show <templateFile></code><br />
angezeigt werden<br />
<br />
== Template-File mit Inhalt füllen ==<br />
Das Template besteht aus FHEM Befehlen mit Platzhaltern, die bei der Ausführung des Template-Befehls durch konkrete Werte ersetzt werden. Ein Template könnte beispielsweise folgendermaßen definiert werden.<br />
<pre><br />
# my Template File ./FHEM/tmpl_example.layout<br />
define %name% dummy <br />
<br />
define di_%name% doif ([%name]) (set %device" on)<br />
attr di_%name do always<br />
</pre><br />
<br />
Im Gegensatz zur Kopie eines Devices mit [[copy]] ermöglicht der Template-Befehl die Definition mehrerer - von einander abhängiger - Geräte "in einem Rutsch". Oben stehendes Beispiel ist bewusst einfach gehalten um diesen Aspekt zu verdeutlichen.<br />
<br />
Für komplexere Templates bietet sich die [[Import_von_Code_Snippets|raw definition]] eines existierenden Gerätes als Ausgangspunkt an.<br />
<br />
== Template ausführen ==<br />
Bei Ausführung des Templates werden die FHEM Befehle des Template-Files abgearbeitet. In oben definiertem Beispiel würde also ein <br />
:<code>template ./FHEM/tmpl_example.layout name=myDummy device=myDevice</code><br />
dazu führen, dass ein Dummy inkl. zugehörigem [[DOIF]] angelegt würde.<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Glossary]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Template&diff=31780Template2019-12-01T18:38:25Z<p>Maista: </p>
<hr />
<div>{{SEITENTITEL:template}}<br />
{{Infobox Modul<br />
|ModPurpose=Einfaches Erstellen gleichartiger Devices<br />
|ModType=cmd<br />
|ModCmdRef=template<br />
|ModForumArea=Sonstiges<br />
|ModTechName=98_template.pm<br />
|ModOwner=Dr. Boris Neubert ({{Link2FU|10| Forum}})<br />
}}<br />
Der [[template]] Befehl vereinfacht das Erstellen gleichartiger Devices in FHEM. Ein Template-File besteht im Grunde aus FHEM Befehlen, in die Platzhalter eingefügt werden. Beim Aufruf des Template-Befehles werden die Platzhalter durch konkrete Werte ersetzt. Damit lassen sich sehr schnell ähnliche Devices (oder Kombinationen von Devices) erstellen oder ändern. Ein Template-File könnte z.B. die Definition eines Dummies inkl. mehrerer sich auf den Dummy beziehenden [[notify]] und [[at]] enthalten. Durch wiederholte Ausführung des Templates lassen sich so schnell Devices und ihre Verarbeitungslogik erstellen.<br />
<br />
== Template-File erstellen ==<br />
Template-Files werden außerhalb FHEM erstellt und dann auf dem FHEM Server (in einem Unterverzeichnis von FHEM) abgelegt. Nutzer von [[configdb]] müssen das File zunächst importieren.<br />
<br />
Derzeit (März 2017) können Template-Files noch nicht über "Edit Files" in FHEM direkt bearbeitet werden. Über einen Workaround ist dies jedoch möglich. Dateien, die in /FHEM abgelegt sind und Endungen wie z.B. .holiday oder .layout haben, werden unter "Edit Files" angezeigt und können in FHEM bearbeitet werden.<br />
Das Template File kann mittels<br />
:<code>template show <templateFile></code><br />
angezeigt werden<br />
<br />
== Template File mit Inhalt füllen ==<br />
Das Template besteht aus FHEM Befehlen mit Platzhaltern, die bei der Ausführung des Template-Befehls durch konkrete Werte ersetzt werden. Ein Template könnte beispielsweise folgendermaßen definiert werden.<br />
<pre><br />
# my Template File ./FHEM/tmpl_example.layout<br />
define %name% dummy <br />
<br />
define di_%name% doif ([%name]) (set %device" on)<br />
attr di_%name do always<br />
</pre><br />
<br />
Im Gegensatz zur Kopie eines Devices mit [[copy]] ermöglicht der Template-Befehl die Definition mehrerer - von einander abhängiger - Geräte "in einem Rutsch". Oben stehendes Beispiel ist bewusst einfach gehalten um diesen Aspekt zu verdeutlichen.<br />
<br />
Für komplexere Templates bietet sich die [[Import_von_Code_Snippets|raw definition]] eines existierenden Gerätes als Ausgangspunkt an.<br />
<br />
== Template ausführen ==<br />
Bei Ausführung des Templates werden die FHEM Befehle des Template-Files abgearbeitet. In oben definiertem Beispiel würde also ein <br />
:<code>template ./FHEM/tmpl_example.layout name=myDummy device=myDevice</code><br />
dazu führen, dass ein Dummy inkl. zugehörigem [[DOIF]] angelegt würde.<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Glossary]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Template&diff=31779Template2019-12-01T18:37:34Z<p>Maista: /* Template File erstellen */</p>
<hr />
<div>{{SEITENTITEL:template}}<br />
{{Infobox Modul<br />
|ModPurpose=Einfaches Erstellen gleichartiger Devices<br />
|ModType=cmd<br />
|ModCmdRef=template<br />
|ModForumArea=Sonstiges<br />
|ModTechName=98_template.pm<br />
|ModOwner=Dr. Boris Neubert ({{Link2FU|10| Forum}})<br />
}}<br />
Der [[template]] Befehl vereinfacht das Erstellen gleichartiger Devices in FHEM. Ein Template File besteht im Grunde aus FHEM Befehlen, in die Platzhalter eingefügt werden. Beim Aufruf des Template-Befehles werden die Platzhalter durch konkrete Werte ersetzt. Damit lassen sich sehr schnell ähnliche Devices (oder Kombinationen von Devices) erstellen oder ändern. Ein Template File könnte z.B. die Definition eines Dummies inkl. mehrerer sich auf den Dummy beziehenden [[notify]] und [[at]] enthalten. Durch wiederholte Ausführung des Templates lassen sich so schnell Devices und ihre Verarbeitungslogik erstellen.<br />
<br />
== Template-File erstellen ==<br />
Template-Files werden außerhalb FHEM erstellt und dann auf dem FHEM Server (in einem Unterverzeichnis von FHEM) abgelegt. Nutzer von [[configdb]] müssen das File zunächst importieren.<br />
<br />
Derzeit (März 2017) können Template-Files noch nicht über "Edit Files" in FHEM direkt bearbeitet werden. Über einen Workaround ist dies jedoch möglich. Dateien, die in /FHEM abgelegt sind und Endungen wie z.B. .holiday oder .layout haben, werden unter "Edit Files" angezeigt und können in FHEM bearbeitet werden.<br />
Das Template File kann mittels<br />
:<code>template show <templateFile></code><br />
angezeigt werden<br />
<br />
== Template File mit Inhalt füllen ==<br />
Das Template besteht aus FHEM Befehlen mit Platzhaltern, die bei der Ausführung des Template-Befehls durch konkrete Werte ersetzt werden. Ein Template könnte beispielsweise folgendermaßen definiert werden.<br />
<pre><br />
# my Template File ./FHEM/tmpl_example.layout<br />
define %name% dummy <br />
<br />
define di_%name% doif ([%name]) (set %device" on)<br />
attr di_%name do always<br />
</pre><br />
<br />
Im Gegensatz zur Kopie eines Devices mit [[copy]] ermöglicht der Template-Befehl die Definition mehrerer - von einander abhängiger - Geräte "in einem Rutsch". Oben stehendes Beispiel ist bewusst einfach gehalten um diesen Aspekt zu verdeutlichen.<br />
<br />
Für komplexere Templates bietet sich die [[Import_von_Code_Snippets|raw definition]] eines existierenden Gerätes als Ausgangspunkt an.<br />
<br />
== Template ausführen ==<br />
Bei Ausführung des Templates werden die FHEM Befehle des Template-Files abgearbeitet. In oben definiertem Beispiel würde also ein <br />
:<code>template ./FHEM/tmpl_example.layout name=myDummy device=myDevice</code><br />
dazu führen, dass ein Dummy inkl. zugehörigem [[DOIF]] angelegt würde.<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Glossary]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Template&diff=31778Template2019-12-01T18:37:12Z<p>Maista: </p>
<hr />
<div>{{SEITENTITEL:template}}<br />
{{Infobox Modul<br />
|ModPurpose=Einfaches Erstellen gleichartiger Devices<br />
|ModType=cmd<br />
|ModCmdRef=template<br />
|ModForumArea=Sonstiges<br />
|ModTechName=98_template.pm<br />
|ModOwner=Dr. Boris Neubert ({{Link2FU|10| Forum}})<br />
}}<br />
Der [[template]] Befehl vereinfacht das Erstellen gleichartiger Devices in FHEM. Ein Template File besteht im Grunde aus FHEM Befehlen, in die Platzhalter eingefügt werden. Beim Aufruf des Template-Befehles werden die Platzhalter durch konkrete Werte ersetzt. Damit lassen sich sehr schnell ähnliche Devices (oder Kombinationen von Devices) erstellen oder ändern. Ein Template File könnte z.B. die Definition eines Dummies inkl. mehrerer sich auf den Dummy beziehenden [[notify]] und [[at]] enthalten. Durch wiederholte Ausführung des Templates lassen sich so schnell Devices und ihre Verarbeitungslogik erstellen.<br />
<br />
== Template File erstellen ==<br />
Template Files werden außerhalb FHEM erstellt und dann auf dem FHEM Server (in einem Unterverzeichnis von FHEM) abgelegt. Nutzer von [[configdb]] müssen das File zunächst importieren.<br />
<br />
Derzeit (März 2017) können Template-Files noch nicht über "Edit Files" in FHEM direkt bearbeitet werden. Über einen Workaround ist dies jedoch möglich. Dateien, die in /FHEM abgelegt sind und Endungen wie z.B. .holiday oder .layout haben, werden unter "Edit Files" angezeigt und können in FHEM bearbeitet werden.<br />
Das Template File kann mittels<br />
:<code>template show <templateFile></code><br />
angezeigt werden<br />
<br />
== Template File mit Inhalt füllen ==<br />
Das Template besteht aus FHEM Befehlen mit Platzhaltern, die bei der Ausführung des Template-Befehls durch konkrete Werte ersetzt werden. Ein Template könnte beispielsweise folgendermaßen definiert werden.<br />
<pre><br />
# my Template File ./FHEM/tmpl_example.layout<br />
define %name% dummy <br />
<br />
define di_%name% doif ([%name]) (set %device" on)<br />
attr di_%name do always<br />
</pre><br />
<br />
Im Gegensatz zur Kopie eines Devices mit [[copy]] ermöglicht der Template-Befehl die Definition mehrerer - von einander abhängiger - Geräte "in einem Rutsch". Oben stehendes Beispiel ist bewusst einfach gehalten um diesen Aspekt zu verdeutlichen.<br />
<br />
Für komplexere Templates bietet sich die [[Import_von_Code_Snippets|raw definition]] eines existierenden Gerätes als Ausgangspunkt an.<br />
<br />
== Template ausführen ==<br />
Bei Ausführung des Templates werden die FHEM Befehle des Template-Files abgearbeitet. In oben definiertem Beispiel würde also ein <br />
:<code>template ./FHEM/tmpl_example.layout name=myDummy device=myDevice</code><br />
dazu führen, dass ein Dummy inkl. zugehörigem [[DOIF]] angelegt würde.<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Glossary]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=ESPEasy&diff=31659ESPEasy2019-11-08T22:59:43Z<p>Maista: /* userSetCmds */</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Steuerung eines Espressif ESP8266 WLAN-SoC<br />
|ModType=d<br />
|ModCmdRef= <br />
|ModForumArea=Bastelecke/ESP8266<br />
|ModFTopic=55728<br />
|ModTechName=34_ESPEasy.pm<br />
|ModOwner={{Link2FU|7465|dev0}}<br />
}}<br />
Dieser Wiki-Artikel soll und kann die {{Link2CmdRef|Anker=ESPEasy|Lang=en|Label=ESPEasy Modul-Dokumentation}}(aka FHEM Command Reference) nicht ersetzen, sondern ergänzt die Dokumentation nur um ein paar Informationen.<br />
<br />
== Grundlegende ESP Easy Einstellungen ==<br />
<br />
Diese Einstellungen sind in der Weboberfläche des ESP vorzunehmen und bewirken u.a., dass für jedes ESPEasy-Device ein FHEM Device angelegt wird. Das kann bspw. für einen ESP sinnvoll sein, der Relays über GPIOs schalten soll (ESPEasy Device-Type ''Switch Input'').<br />
<br />
*Es muss ein einmaliger ESP Devicename vergeben werden (''Config'' -> ''Main Settings'' ->''Name'')<br />
*Die verwendeten ESP Easy Devices sollten einen ESP-weit einmaligen Namen erhalten (''Device'' -> ''Edit'' -> ''Task Settings'' -> ''Name''). Ist dieser Name nicht eindeutig oder wird nicht vergeben, dann gibt es u.a. Probleme mit ESP Easy Rules [link].<br />
*Jeder Wert, der gesendet werden soll, benötigt ebenfalls einen Namen, der in diesem ESP Device einmalig sein muss (''Device'' -> ''Edit'' -> ''Optional Settings'' -> ''Value Name'')<br />
*Soll dieser Wert nun automatisch in einem Interval von x Sekunden (an FHEM) gesendet werden, dann muss noch das ''Delay'' (''Device'' -> ''Edit'' -> ''Task Settings'' -> ''Delay'') angegeben und die Option ''Send Data'' (''Device'' -> ''Edit'' -> ''Task Settings'' -> ''Send Data'') aktiviert werden. Die Option ''Send Boot State'' ist an dieser Stelle ebenfalls sinnvoll.<br />
<br />
=== Attribut combineDevices ===<br />
<br />
Wenn das oben genannte Verhalten (ein FHEM Device pro ESP Easy Device) nicht gewünscht ist, dann kann man mittels des Attributes ''combineDevices'' der {{Link2CmdRef|Anker=ESPEasy_bridge_define|Lang=en|Label=ESPEasy Bridge}} einstellen, ob die ESP Easy Devices eines einzelnen ESPs in ein FHEM Device zusammengeführt werden sollen.<br />
Diese Funktionalität kann man global einschalten, indem man dem Attribut ''combineDevices'' den Wert ''1'' gibt.<br />
<br />
Will man nur von bestimmten ESPs die Devices zusammen fassen, dann kann man eine komma-getrennte Liste der ESPs angeben. Die Liste kann aus ESP Namen, IP Adressen und/oder Netzwerkbereichen bestehen. Netzwerkbereiche können mit einer Netzmaske in dotted decimal (/255.255.255.0) oder in bitmask (/24) Schreibweise angegeben werden. Hostnamen und FQDNs werden nicht unterstützt.<br />
<br />
Beispiele:<br />
attr <esp> combineDevices ESP1,ESP2<br />
attr <esp> combineDevices 10.0.0.148,10.0.0.149<br />
attr <esp> combineDevices 192.168.124.0/24<br />
attr <esp> combineDevices 192.168.124.0/255.255.255.0<br />
attr <esp> combineDevices ESP1,ESP2,10.0.0.0/8,192.168.0.0/255.255.0.0<br />
<br />
IPv6 Adressen/Bereiche werden zwar von FHEM, allerdings zur Zeit noch nicht von der öffentlichen ESP Easy Distribution unterstützt.<br />
<br />
Beispiel:<br />
attr <esp> combineDevices 2001:1a50:50a8::148,2001:abcd:efff::/48<br />
<br />
== Presence Erkennung ==<br />
Die "Presence Detection", also die Erkennung, ob ein ESP noch Daten sendet, wurde anhand des Alters der empfangenen (Sensor-)Werte realisiert. Vereinfacht gesagt: Werden keine Readings mehr innerhalb von x Sekunden empfangen (siehe Device-Attribut ''Interval''), wird das FHEM Device als "absent" gekennzeichnet. Das hat den Vorteil, dass auch ESP Easy Devices, die zwischen dem Senden von Daten in den so genannten Deep Sleep Modus gehen, erkannt werden können.<br />
<br />
Das Attribut ''Interval'' gibt unter anderem vor, in welchem zeitlichen Abstand Werte vom ESP erwartet werden, damit der ESP als "present" (und nicht absent) markiert wird.<br />
<br />
Wenn ein ESP Easy Device Werte alle 60 Sekunden sendet (Option ''Delay'' in der ESP Easy Device GUI) und das FHEM Device Interval auf 60 gesetzt ist, dann würde das Device-Reading "presence" auf "absent" wechseln, wenn innerhalb von 60-120 Sekunden keine Werte empfangen werden.<br />
<br />
Also wäre zum Beispiel die ESP Easy Firmware so zu konfigurieren, dass mindestens ein Wert alle 60 Sekunden gesendet wird. Das Interval-Attribut des entsprechenden FHEM ESPEasy Device müsste ebenfalls auf 60 (default) gesetzt werden. Ein paar Sekunden Toleranz sind im ESPEasy Modul eingebaut.<br />
<br />
Wenn man kein ESP Easy Device hat, das Daten an FHEM sendet, dann kann man zusätzlich einen der "System Info" Werte senden lassen und ''combineDevices'' für diesen ESP aktivieren. Es reicht nämlich, wenn ein Reading regelmäßig aktualisiert wird.<br />
<br />
Wenn die Presence Erkennung nicht genutzt werden soll, dann muss das Attribut ''presenceCheck'' auf 0 gesetzt werden.<br />
<br />
== Sicherheit ==<br />
<br />
Wenn eine ESPEasy Bridge in FHEM eingerichtet wurde, dann werden Verbindungen nur von IP Adressen aus [https://tools.ietf.org/html/rfc1918 privaten Bereichen] zugelassen.<br />
<br />
Wenn ESP Easy Geräte außerhalb dieser Bereiche Daten an FHEM senden (z.B. über das Internet), dann muss das in der ESPEasy Bridge konfiguriert werden, andernfalls wird die Verbindung abgewiesen.<br />
<br />
Einerseits muss die IP Adresse bzw. der IP Bereich erlaubt (Attribute ''allowedIPs'', ''deniedIPs''), andererseits die Authentifizierung über "Basic Auth" in der ESPEasy Bridge eingerichtet werden.<br />
Die Authentifizierung wird über das Attribut ''authentication'' eingeschaltet. Die Benutzerdaten für die Authentifizierung werden über die Set-Befehle ''user'' und ''pass'' der Bridge eingegeben<br />
{{Hinweis|Hinweis: Username und Passwort werden unverschlüsselt in ./FHEM/FhemUtils/uniqueID gespeichert.}}<br />
<br />
=== Attribut authentication ===<br />
Beispiel:<br />
set <espbridge> user MeinUserName<br />
set <espbridge> pass sehrgeheim<br />
attr <espbridge> authentication 1<br />
<br />
=== Attribute allowedIPs / deniedIPs ===<br />
Beispiel:<br />
attr <espbridge> allowedIPs 192.0.2.0/24 # erlaubt ist 192.0.2.0 bis 192.0.2.255<br />
attr <espbridge> deniedIPs 192.0.2.0/29 # ausgeschlossen werden aber die IPs von 192.0.2.0 bis 192.0.2.7<br />
<br />
Das Attribut ''deniedIPs'' hat Vorrang vor ''allowedIPs''. Das bedeutet, dass verbotene IPs niemals eine Verbindung aufbauen können, auch wenn sie vorher erlaubt wurden.<br />
<br />
Regular Expressions sind können ebenfalls verwendet werden:<br />
attr <espbridge> allowedIPs 192.0.2.1([0-4][0-9]|50) # erlaubt IP von 192.168.30.100 bis 192.168.30.150<br />
<br />
Alle Details dazu sind in der {{Link2CmdRef|Anker=ESPEasy_bridge_attr_allowedips|Lang=en|Label=Command Reference}} beschrieben.<br />
<br />
== Erweiterte Beispiele==<br />
Hier ein paar Beispiele für unterschiedlichste Anwendungsfälle<br />
<br />
=== Schalter in FHEMWEB mit devStateIcons ===<br />
Beispiel für GPIO 12:<br />
attr <ESP> stateFormat {ReadingsVal($name,"presence","") eq "absent" ? "absent" : ReadingsVal($name,"GPIO12","")}<br />
attr <ESP> devStateIcon on:ios-on-green:off off:ios-off:on absent:10px-kreis-rot:statusRequest<br />
attr <ESP> eventMap /gpio 12 on:on/gpio 12 off:off/<br />
attr <ESP> webCmd :<br />
<br />
=== on-for-timer und off-for-timer ===<br />
Beispiel für GPIO 15:<br />
attr <ESP> /longpulse 15 on:on-for-time:slider,0,1,60/longpulse 15 off:off-for-time:slider,0,1,60/<br />
<br />
=== (on|off)-for-timer und devStateIcons ===<br />
Beispiel für GPIO 15:<br />
attr <ESP> eventMap /longpulse 15 on:on-for-time:slider,0,1,60/longpulse 15 off:off-for-time:slider,0,1,60/gpio 15 on:on/gpio 15 off:off/<br />
<br />
=== userSetCmds ===<br />
Mithilfe des Attributes userSetCmds kann man:<br />
*Einzelne ESP Easy Befehle nachrüsten<br />
*Eigene oder nicht unterstützte Plugins integrieren<br />
*Bereits integrierte Befehle verändern<br />
*Befehle einzelner Plugins mappen: Statt 'set <dev> plugin_a on' kann man so 'set <dev> on' verwenden. Das wird z.B. benötigt, um FHEMs setExtentions oder auch um FHEMWEB Widgets nutzen zu können.<br />
<br />
Die generelle Syntax des Attributes ist ein Perl Hash, der die Eigenschaften des ESP Easy Befehls/Plugins beschreibt.<br />
Folgende Eigenschaften (Keys) gibt es:<br />
*args: Anzahl der benötigten Parameter. Default: 0<br />
*url: Die aufzurufende URL. Default: /control?cmd=<br />
*widget: Das FHEMWEB Widget, dass beim FHEMWEB Setter des Befehls verwendet werden soll. Default: keines<br />
*usage: Diese Zeichenkette wird zum einen angezeigt, wenn ein falscher oder zu wenige Parameter beim Befehlsaufruf angeben wurden. Zum anderen haben folgende Zeichenketten eine besondere Bedeutung:<br />
**<0|1|off|on>: Innerhalb des FHEM Befehl kann on/off statt 0/1 angegeben werden. An die ESP Easy Firmware wird 0/1 gesendet.<br />
**<pin>: Bei dem Paramater handelt es sin um einen GPIO Port. Aliasnamen können verwendet werden. Siehe: get <dev> pinMap<br />
**<text>: Dieser Paramter wird url encoded an die ESP Easy Firmware gesendet. Wird für die Ausgabe auf (O)led Displays benötigt.<br />
*cmds: Diese Eigenschaft (key) muss ebenfalls ein Perl Hash sein. Dieser Key definiert die Unterbefehle des Plugins. Alle oben genannten Eigenschaften (Keys) können benutzt werden. Nur der Key 'url' kann nicht angegeben werden, da in diesem Fall die URL des Plugins verwendet wird.<br />
<br />
Ein einzelner neuer Befehl 'myCmd1':<br />
attr <dev> userSetCmds ( myCmd1 => {} )<br />
<br />
Ein einzelner neuer Befehl 'myCmd1'. Der erste Paramater enthält einen GPIO Port, der durch Aliasnamen ersetzt werden kann. Der zweite Paramater kann als on/off geschrieben werden, gesendet wird aber 1/0:<br />
attr <dev> userSetCmds ( myCmd1 => { usage => "<pin> <0|1|off|on>" } )<br />
<br />
Zwei neue Befehle, mit allen default Werten:<br />
attr <dev> userSetCmds ( myCmd1 => {}, myCmd2 => {} )<br />
<br />
Zwei neue Befehle, der zweite Befehl verwendet eine abweichende URL:<br />
attr <dev> userSetCmds ( myCmd1 => {}, myCmd2 => { url => "/?cmd=" } )<br />
<br />
Beispiel für das fiktive Plugin 'LED' mit den Unterbefehlen 'rgb' und 'ct'. Die Unterbefehle 'rgb' und 'ct' können ohne Angabe des Pluginnamens 'LED' verwendet werden. Zusätzlich werden in der FHEMWEB-Ansicht die Slider Widgets hsv/ct verwendet:<br />
<source lang="text"><br />
attr <dev> userSetCmds (<br />
LED => {<br />
args => 2,<br />
url => "/control?cmd=",<br />
usage => "<rgb|ct> <rrggbb|colortemp>",<br />
cmds => {<br />
rgb => { args => 1, usage => "<rrggbb>", widget => "colorpicker,HSV" },<br />
ct => { args => 1, usage => "<colortemp>", widget => "colorpicker,CT,2000,10,4000" }<br />
}<br />
}<br />
) <br />
</source><br />
<br />
=== useSetExtensions ===<br />
Mithilfe der FHEM setExtentions kann man die Befehle on-for-timer, off-for-timer, on-till, off-till, blink, intervals, toggle, etc nutzen. Im Gegensatz zu den ESP Easy Firmware Befehlen 'pulse', 'longpulse' und 'longpulse_ms' laufen die Timer nicht innerhalb der ESP Easy Firmware, sondern in FHEM. Mit allen Vor- und Nachteilen.<br />
Um die setExtensions nutzen zu können muss das Attribut 'useExtensions' auf 1 gesetzt sein. Weiterhin müssen die Befehle 'on' und 'off', für das entsprechende Device, verfügbar sein. Das kann man auf verschiedene Weisen realisieren:<br />
==== setExtensions mit eventMap ====<br />
In diesem Beispiel wird der Befehl 'set <dev> GPIO 15 on' mithilfe des globalen Attributs 'eventMap' auf den Befehl 'set <dev> on' gemappt. Gleiches gilt für 'off'.<br />
<source lang="text"><br />
attr <dev> useSetExtensions 1<br />
attr <dev> eventMap /gpio 15 on:^on$/gpio 15 off:^off$/<br />
</source><br />
==== setExtentions mit userSetCmds ====<br />
In diesem Beispiel wird nicht das globale Attribut 'eventMap' benutzt, sondern das ESPEasy Attribut 'userSetCmds', um die 'on' und 'off' Befehle bereitzustellen.<br />
<source lang="text"><br />
attr <dev> useSetExtensions 1<br />
attr <dev> userSetCmds ( on => {url=>"/control?cmd=gpio,15,1", args => -1}, off => {url=>"/control?cmd=gpio,15,0", args => -1} <br />
)<br />
</source><br />
<br />
==Logging==<br />
===ESPEasy Bridge===<br />
<source lang="text"><br />
2018.02.10 08:48:06.197 4: Connection accepted from eb_10.0.0.148_25654<br />
2018.02.10 08:48:06.199 4: ESPEasy eb_10.0.0.148_25654: Peer address accepted<br />
2018.02.10 08:48:06.199 5: ESPEasy eb_10.0.0.148_25654: Received header: {'Content-Length' => '298','Authorization' => 'Basic ***** ','Host' => '10.0.0.53','Connection' => 'close'}<br />
2018.02.10 08:48:06.199 5: ESPEasy eb_10.0.0.148_25654: Received content: {"module":"ESPEasy","version":"1.02","data":{"ESP":{"name":"BA_SEN1","unit":4,"version":9,"build":137,"sleep":0,"ip":"10.0.0.148"},"SENSOR":{"0":{"deviceName":"DHT22","valueName":"temperature","type":2,"value":"21.5"},"1":{"deviceName":"DHT22","valueName":"humidity","type":2,"value":"12.2"}}}}<br />
2018.02.10 08:48:06.200 4: ESPEasy eb_10.0.0.148_25654: Basic authentication accepted<br />
2018.02.10 08:48:06.200 4: ESPEasy eb_10.0.0.148_25654: Send http close '200 OK'<br />
2018.02.10 08:48:06.202 4: ESPEasy eb_10.0.0.148_25654: Src:'BA_SEN1'/'DHT22' => ident:BA_SEN1 dev:ESPEasy_BA_SEN1 combinedDevice:1<br />
2018.02.10 08:48:06.202 5: eb: dispatch BA_SEN1::10.0.0.148::1::0::1::i||unit||4||0|||i||sleep||0||0|||i||build||137||0|||i||version||9||0|||r||temperature||21.5||2|||r||humidity||12.2||2<br />
2018.02.10 08:48:06.209 4: ESPEasy eb_10.0.0.148_25654: Closing tcp session.<br />
</source><br />
<br />
Im Detail bedeuten die Logeinträge:<br />
<br />
;Connection accepted from eb_10.0.0.148_25654<br />
:Eine TCP Verbindung wurde vom ESP (IP: 10.0.0.148, source port: 25654) zur Bridge "eb" aufgebaut.<br />
<br />
;ESPEasy eb_10.0.0.148_25654<br />
:Es wurde ein temporäres ESPEasy Bridge Devices angelegt, das Daten von der IP 10.0.0.148 und Quellport 25654 empfängt.<br />
<br />
;Peer address accepted<br />
:Die IP Adresse des ESP wurde akzeptiert und die empfangenen Daten werden nun verarbeitet. Wenn die IP Adresse nicht akzeptiert wird, dann wird '''Peer address rejected''' gelogged.<br />
<br />
;<nowiki>Received header: {'Content-Length' => '298','Authorization' => 'Basic ***** ','Host' => '10.0.0.53','Connection' => 'close'}</nowiki><br />
:Diese ''received header'' Zeile enthält die Daten des Headers, die via HTTP vom ESP empfangen werden. Ein eventuell vorhandenes Passwort wird maskiert.<br />
<br />
;<nowiki>Received content: {"module":"ESPEasy","version":"1.02","data":"ESP":"name":"BA_SEN1","unit":4,"version":9,"build":137,"sleep":0,"ip":"10.0.0.148"},"SENSOR":"0":{"deviceName":"DHT22","valueName":"temperature","type":2,"value":"21.5"},"1":"deviceName":"DHT22","valueName":"humidity","type":2,"value":"12.2"}}}}</nowiki><br />
:Diese ''received content'' Zeile enthält die Daten, die vom ESP via HTTP empfangenen werden. Mehr oder weniger Klartext im JSON Format.<br />
<br />
;Basic authentication accepted<br />
:In diesem Schritt wird geprüft ob eine Authentifizierung erforderlich und im besten Fall auch korrekt ist.<br />
:Folgende Meldungen wären an dieser Stelle auch möglich:<br />
:*No basic authentication required (auf beiden Seiten ist keine basic auth eingerichtet)<br />
:*No basic authentication active but credentials received (auf FHEM Seite ist keine basic auth eingerichtet, der ESP sendet aber basic auth)<br />
:*Basic authentication rejected (Username oder Passwort passen nicht zusammen)<br />
<br />
;Send http close '200 OK'<br />
:"Quittung" an den ESP senden. Daraufhin wird der ESP die Verbindung beenden.<br />
<br />
;<nowiki>Src:'BA_SEN1'/'DHT22' => ident:BA_SEN1 dev:ESPEasy_BA_SEN1 combinedDevice:1</nowiki><br />
:Die Daten wurden vom ESP mit dem Namen BA_SEN1 und dem ESP Device DHT22 gesendet. Auf FHEM Seite werden die Daten dem Device mit dem Ident "BA_SEN1" zugewiesen. Dieses Ident wird vom FHEM Device ESPEasy_BA_SEN1 verwendet. Für diesen ESP ist das Attribut ''combineDevices'' wirksam. Wäre ''combineDevices'' nicht aktiv, dann würde das Ident "BA_SEN1_DHT22" lauten.<br />
<br />
;<nowiki>dispatch BA_SEN1::10.0.0.148::1::0::1::i||unit||4||0|||i||sleep||0||0|||i||build||137||0|||i||version||9||0|||r||temperature||21.5||2|||r||humidity||12.2||2</nowiki><br />
:Die Daten werden nun von der Bridge an das logische ESPEasy Device weitergegeben.<br />
:Im Details bedeuten die einzelnen Elemente dieser Zeichenkette:<br />
:*'''BA_SEN1::''': Daten an das FHEM Device mit dem Ident BA_SEN1 schicken.<br />
:*'''10.0.0.148::''': IP Adresse des ESPs<br />
:*'''1::''': autocreate enabled? ja<br />
:*'''0::''': autosave enabled? nein<br />
:*'''1::''': wird nicht mehr benutzt<br />
:*'''i||unit||4||0|||''': Der ESP hat die Unit Nummer 4<br />
:*'''i||sleep||1||0|||''': Ist der ESP für den deep sleep mode konfiguriert? ja<br />
:*'''i||build||137||0|||''': ESPEasy build version 137<br />
:*'''i||version||9||0|||''': ESPEasy Release 9<br />
:*'''r||temperature||21.5||2|||''': Readingname: temperature, Wert: 21.5, Sensortyp: 2<br />
:*'''r||humidity||12.2||2''': Readingname: humidity, Wert 12.2, Sensortyp: 2<br />
:Je nach ESPEasy Firmware Version können die Internals (Zeilen mit i am Anfang) auch <br />
zusätzliche/andere Informationen aufweisen.<br />
<br />
;Closing tcp session.<br />
:Die tcp Verbindung wird geschlossen, das temporäre ESPEasy Bridge Device wird gelöscht.<br />
<br />
===ESPEasy Device===<br />
<source lang="text"><br />
2018.02.10 10:08:41.235 5: ESPEasy ESPEasy_BA_SEN1: Received: BA_SEN1::10.0.0.148::1::0::1::i||unit||4||0|||i||sleep||0||0|||i||build||137||0|||i||version||9||0|||r||temperature||21.2||2|||r||humidity||10.3||2<br />
2018.02.10 10:08:41.236 4: ESPEasy ESPEasy_BA_SEN1: temperature: 21.2<br />
2018.02.10 10:08:41.237 4: ESPEasy ESPEasy_BA_SEN1: humidity: 10.3<br />
2018.02.10 10:08:41.237 5: ESPEasy ESPEasy_BA_SEN1: Internals: unit:4 sleep:0 build:137 version:9<br />
</source><br />
Im Detail:<br />
<br />
;<nowiki>Received: BA_SEN1::10.0.0.148::1::0::1::i||unit||4||0|||i||sleep||0||0|||i||build||137||0|||i||version||9||0|||r||temperature||21.2||2|||r||humidity||10.3||2</nowiki><br />
:Das ist wieder die, bereits oben beschriebene, ''dispatch'' Zeichenkette, die jetzt vom logischen Device empfangen wurde.<br />
<br />
;<nowiki>ESPEasy ESPEasy_BA_SEN1: temperature: 21.2</nowiki><br />
;<nowiki>ESPEasy ESPEasy_BA_SEN1: humidity: 10.3</nowiki><br />
:Die Readings ''temperature'' und ''humidity'' wurden aktualisiert.<br />
<br />
;<nowiki>ESPEasy ESPEasy_BA_SEN1: Internals: unit:4 sleep:1 build:137 version:9</nowiki><br />
:Die Internals ''unit'', ''sleep'', ''build'' und ''version'' wurden aktualisiert.<br />
<br />
===Zusätzliche Logeinträge===<br />
Wird ein Device via Autocreate angelegt, gibt es zusätzliche Einträge im Logfile<br />
<source lang="text"><br />
2018.02.10 10:23:52.243 4: ESPEasy eb_10.0.0.148_3446: Src:'BA_SEN1'/'DHT22' => ident:BA_SEN1 dev:undef combinedDevice:1<br />
2018.02.10 10:23:52.243 2: ESPEasy eb: Autocreate ESPEasy_BA_SEN1 ESPEasy 10.0.0.148 80 eb BA_SEN1<br />
2018.02.10 10:23:52.244 4: ESPEasy ESPEasy_BA_SEN1: Opened for BA_SEN1 10.0.0.148:80 using bridge eb<br />
2018.02.10 10:23:52.258 5: ESPEasy ESPEasy_BA_SEN1: received event: ATTR ESPEasy_BA_SEN1 setState 3<br />
2018.02.10 10:23:52.262 5: ESPEasy ESPEasy_BA_SEN1: received event: ATTR ESPEasy_BA_SEN1 Interval 300<br />
2018.02.10 10:23:52.262 5: ESPEasy ESPEasy_BA_SEN1: Start internalTimer +304 => 2018-02-10 10:28:57<br />
2018.02.10 10:23:52.266 5: ESPEasy ESPEasy_BA_SEN1: received event: ATTR ESPEasy_BA_SEN1 presenceCheck 1<br />
2018.02.10 10:23:52.269 5: ESPEasy ESPEasy_BA_SEN1: received event: ATTR ESPEasy_BA_SEN1 readingSwitchText 1<br />
2018.02.10 10:23:52.271 2: ESPEasy eb: Autosave is disabled: Do not forget to save changes.<br />
</source><br />
<br />
==Weblinks==<br />
*{{Link2CmdRef|Anker=ESPEasy|Lang=en|Label=FHEM ESPEasy Modul-Dokumentation}}<br />
*[https://www.letscontrolit.com/wiki/index.php/ESPEasy ESP Easy Firmware Wiki] <br />
*[https://www.letscontrolit.com/wiki/index.php/ESPEasy_Command_Reference ESP Easy Command Reference]<br />
*[https://www.letscontrolit.com/wiki/index.php/Tutorial_Rules ESP Easy Rules]<br />
<br />
==Credits==<br />
Vielen Dank an:<br />
<br />
*'''ESP Easy Team''', für die kontinuierliche Pflege und Erweiterungen der Software<br />
<br />
*'''Drhrin''', für die initiale Umsetzung dieses Wiki-Eintags</div>Maistahttp://wiki.fhem.de/w/index.php?title=AttrTemplate&diff=31658AttrTemplate2019-11-08T22:56:12Z<p>Maista: /* Eigene templates entwickeln */</p>
<hr />
<div>{{SEITENTITEL:AttrTemplate}}<br />
{{Infobox Modul<br />
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann<br />
|ModType=cmd<br />
|ModCmdRef=<br />
|ModForumArea=Automatisierung<br />
|ModTechName=AttrTemplate.pm <br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.<br />
<br />
Das Modul ''AttrTemplate'' ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl ''attrTemplate'' in einer Vielzahl von Modulen verfügbar.<br />
<br />
==Einführung==<br />
Ziel von ''attrTemplate'' ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. <br />
Teilt man entsprechende ''templates'', sollte jedoch deutlich darauf hingewiesen werden, wenn ein Template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.<br />
<br />
Um Ihnen die Auswahl zu erleichtern, kann <br />
* mit <code>set <Device-Name> attrTemplate ?</code> eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. <br />
* in der Detailansicht der Geräte über das Dropdownfeld ein ''template'' ausgewählt werden. Nun erhält man unmittelbar unter dem ''set''-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des ''template'' angezeigt, der bei Drücken auf ''set'' ausgeführt wird.<br />
Hat man ein passendes ''template'' gefunden, wird mit <code>set <Device-Name> attrTemplate <template_name></code> angewendet, wodurch die entsprechenden, in dem ''template'' hinterlegten Kommandos ausgeführt werden.<br />
<br />
== Syntax ==<br />
<br />
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden können:<br />
* leere Zeilen werden ignoriert<br />
* Zeilen die mit # anfangen sind Kommentare (s.u. ''desc:'')<br />
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: ''name: filter: prereq: par: desc: farewell: order:''<br />
** '''name:''' Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates<br />
** '''filter:''' devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim "set ?" ausgeführt.<br />
** '''prereq:''' ist entweder ein Perl-Ausdruck {}, oder ein ''devspec2array'', was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.<br />
** '''par:''' kann mehrfach vorkommen, Syntax: <code>par:<ParamaterName>:<Kommentar>:<Perl-Code></code>. ''Perl-Code'' versucht den Wert zu finden, falls nicht möglich (''return undef''), wird ein Dialog mit "Replace" angezeigt (bzw. Usage:... im telnet). ''ParameterName'' wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: ''DEVICE'' wird mit dem Namen des Gerätes ersetzt, wird ''DEVICE'' (z.B. für Modulnamen) als Text benötigt, muß es ''escaped'' werden (z.B. MQTT2_\DEVICE).<br />
** '''desc:''' Kommentar fuer <code>set attrTemplate help ?</code>. Die letzte Zeile mit # vor ''name:'' wird als ''desc:'' interpretiert, falls kein ''desc:'' vorhanden ist.<br />
** '''farewell:''' wird zum Schluss als Dialog (oder Text in telnet) angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.<br />
** '''order:''' bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird ''name:'' genommen.<br />
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man <code>set <Device-Name> attrTemplate TemplateName</code> ausführt.<br />
<br />
==Eigene Templates entwickeln==<br />
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen Templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen Templates nutzen. Hierfür können die vorhandenen Templates der im Unterverzeichnis ''fhem/FHEM/lib/AttrTemplate'' zu findenden Dateien als Basis dienen. Ihre Templates speichern Sie einfach als neue Datei mit der Endung ''.template'' im selben Verzeichnis und lesen diese mit <code>{ AttrTemplate_Initialize() }</code> neu ein. Danach können Sie diese direkt verwenden.<br />
<br />
Haben Sie ein Template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten)<br />
<br />
==Links==<br />
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}<br />
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen<br />
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.<br />
<references /><br />
[[Kategorie:FHEM-Verwendung]]<br />
[[Kategorie:HOWTOS]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=AttrTemplate&diff=31657AttrTemplate2019-11-08T22:55:58Z<p>Maista: /* Eigene templates entwickeln */</p>
<hr />
<div>{{SEITENTITEL:AttrTemplate}}<br />
{{Infobox Modul<br />
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann<br />
|ModType=cmd<br />
|ModCmdRef=<br />
|ModForumArea=Automatisierung<br />
|ModTechName=AttrTemplate.pm <br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.<br />
<br />
Das Modul ''AttrTemplate'' ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl ''attrTemplate'' in einer Vielzahl von Modulen verfügbar.<br />
<br />
==Einführung==<br />
Ziel von ''attrTemplate'' ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. <br />
Teilt man entsprechende ''templates'', sollte jedoch deutlich darauf hingewiesen werden, wenn ein Template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.<br />
<br />
Um Ihnen die Auswahl zu erleichtern, kann <br />
* mit <code>set <Device-Name> attrTemplate ?</code> eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. <br />
* in der Detailansicht der Geräte über das Dropdownfeld ein ''template'' ausgewählt werden. Nun erhält man unmittelbar unter dem ''set''-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des ''template'' angezeigt, der bei Drücken auf ''set'' ausgeführt wird.<br />
Hat man ein passendes ''template'' gefunden, wird mit <code>set <Device-Name> attrTemplate <template_name></code> angewendet, wodurch die entsprechenden, in dem ''template'' hinterlegten Kommandos ausgeführt werden.<br />
<br />
== Syntax ==<br />
<br />
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden können:<br />
* leere Zeilen werden ignoriert<br />
* Zeilen die mit # anfangen sind Kommentare (s.u. ''desc:'')<br />
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: ''name: filter: prereq: par: desc: farewell: order:''<br />
** '''name:''' Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates<br />
** '''filter:''' devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim "set ?" ausgeführt.<br />
** '''prereq:''' ist entweder ein Perl-Ausdruck {}, oder ein ''devspec2array'', was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.<br />
** '''par:''' kann mehrfach vorkommen, Syntax: <code>par:<ParamaterName>:<Kommentar>:<Perl-Code></code>. ''Perl-Code'' versucht den Wert zu finden, falls nicht möglich (''return undef''), wird ein Dialog mit "Replace" angezeigt (bzw. Usage:... im telnet). ''ParameterName'' wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: ''DEVICE'' wird mit dem Namen des Gerätes ersetzt, wird ''DEVICE'' (z.B. für Modulnamen) als Text benötigt, muß es ''escaped'' werden (z.B. MQTT2_\DEVICE).<br />
** '''desc:''' Kommentar fuer <code>set attrTemplate help ?</code>. Die letzte Zeile mit # vor ''name:'' wird als ''desc:'' interpretiert, falls kein ''desc:'' vorhanden ist.<br />
** '''farewell:''' wird zum Schluss als Dialog (oder Text in telnet) angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.<br />
** '''order:''' bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird ''name:'' genommen.<br />
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man <code>set <Device-Name> attrTemplate TemplateName</code> ausführt.<br />
<br />
==Eigene templates entwickeln==<br />
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen Templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen Templates nutzen. Hierfür können die vorhandenen Templates der im Unterverzeichnis ''fhem/FHEM/lib/AttrTemplate'' zu findenden Dateien als Basis dienen. Ihre Templates speichern Sie einfach als neue Datei mit der Endung ''.template'' im selben Verzeichnis und lesen diese mit <code>{ AttrTemplate_Initialize() }</code> neu ein. Danach können Sie diese direkt verwenden.<br />
<br />
Haben Sie ein Template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten)<br />
<br />
==Links==<br />
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}<br />
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen<br />
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.<br />
<references /><br />
[[Kategorie:FHEM-Verwendung]]<br />
[[Kategorie:HOWTOS]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=AttrTemplate&diff=31656AttrTemplate2019-11-08T22:54:42Z<p>Maista: /* Einführung */</p>
<hr />
<div>{{SEITENTITEL:AttrTemplate}}<br />
{{Infobox Modul<br />
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann<br />
|ModType=cmd<br />
|ModCmdRef=<br />
|ModForumArea=Automatisierung<br />
|ModTechName=AttrTemplate.pm <br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.<br />
<br />
Das Modul ''AttrTemplate'' ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl ''attrTemplate'' in einer Vielzahl von Modulen verfügbar.<br />
<br />
==Einführung==<br />
Ziel von ''attrTemplate'' ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. <br />
Teilt man entsprechende ''templates'', sollte jedoch deutlich darauf hingewiesen werden, wenn ein Template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.<br />
<br />
Um Ihnen die Auswahl zu erleichtern, kann <br />
* mit <code>set <Device-Name> attrTemplate ?</code> eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. <br />
* in der Detailansicht der Geräte über das Dropdownfeld ein ''template'' ausgewählt werden. Nun erhält man unmittelbar unter dem ''set''-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des ''template'' angezeigt, der bei Drücken auf ''set'' ausgeführt wird.<br />
Hat man ein passendes ''template'' gefunden, wird mit <code>set <Device-Name> attrTemplate <template_name></code> angewendet, wodurch die entsprechenden, in dem ''template'' hinterlegten Kommandos ausgeführt werden.<br />
<br />
== Syntax ==<br />
<br />
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden können:<br />
* leere Zeilen werden ignoriert<br />
* Zeilen die mit # anfangen sind Kommentare (s.u. ''desc:'')<br />
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: ''name: filter: prereq: par: desc: farewell: order:''<br />
** '''name:''' Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates<br />
** '''filter:''' devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim "set ?" ausgeführt.<br />
** '''prereq:''' ist entweder ein Perl-Ausdruck {}, oder ein ''devspec2array'', was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.<br />
** '''par:''' kann mehrfach vorkommen, Syntax: <code>par:<ParamaterName>:<Kommentar>:<Perl-Code></code>. ''Perl-Code'' versucht den Wert zu finden, falls nicht möglich (''return undef''), wird ein Dialog mit "Replace" angezeigt (bzw. Usage:... im telnet). ''ParameterName'' wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: ''DEVICE'' wird mit dem Namen des Gerätes ersetzt, wird ''DEVICE'' (z.B. für Modulnamen) als Text benötigt, muß es ''escaped'' werden (z.B. MQTT2_\DEVICE).<br />
** '''desc:''' Kommentar fuer <code>set attrTemplate help ?</code>. Die letzte Zeile mit # vor ''name:'' wird als ''desc:'' interpretiert, falls kein ''desc:'' vorhanden ist.<br />
** '''farewell:''' wird zum Schluss als Dialog (oder Text in telnet) angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.<br />
** '''order:''' bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird ''name:'' genommen.<br />
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man <code>set <Device-Name> attrTemplate TemplateName</code> ausführt.<br />
<br />
==Eigene templates entwickeln==<br />
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen templates nutzen. Hierfür können die vorhandenen templates der im Unterverzeichnis ''fhem/FHEM/lib/AttrTemplate'' zu findenden Dateien als Basis dienen. Ihre Templates speichern Sie einfach als neue Datei mit der Endung ''.template'' im selben Verzeichnis und lesen diese mit <code>{ AttrTemplate_Initialize() }</code> neu ein. Danach können Sie diese direkt verwenden.<br />
<br />
Haben Sie ein Template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten)<br />
<br />
==Links==<br />
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}<br />
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen<br />
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.<br />
<references /><br />
[[Kategorie:FHEM-Verwendung]]<br />
[[Kategorie:HOWTOS]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=AttrTemplate&diff=31655AttrTemplate2019-11-08T22:53:37Z<p>Maista: /* Eigene templates entwickeln */</p>
<hr />
<div>{{SEITENTITEL:AttrTemplate}}<br />
{{Infobox Modul<br />
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann<br />
|ModType=cmd<br />
|ModCmdRef=<br />
|ModForumArea=Automatisierung<br />
|ModTechName=AttrTemplate.pm <br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.<br />
<br />
Das Modul ''AttrTemplate'' ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl ''attrTemplate'' in einer Vielzahl von Modulen verfügbar.<br />
<br />
==Einführung==<br />
Ziel von ''attrTemplate'' ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. <br />
Teilt man entsprechende ''templates'', sollte jedoch deutlich darauf hingewiesen werden, wenn ein template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.<br />
<br />
Um Ihnen die Auswahl zu erleichtern, kann <br />
* mit <code>set <Device-Name> attrTemplate ?</code> eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. <br />
* in der Detailansicht der Geräte über das Dropdownfeld ein ''template'' ausgewählt werden. Nun erhält man unmittelbar unter dem ''set''-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des ''template'' angezeigt, der bei Drücken auf ''set'' ausgeführt wird.<br />
Hat man ein passendes ''template'' gefunden, wird mit <code>set <Device-Name> attrTemplate <template_name></code> angewendet, wodurch die entsprechenden, in dem ''template'' hinterlegten Kommandos ausgeführt werden.<br />
<br />
== Syntax ==<br />
<br />
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden können:<br />
* leere Zeilen werden ignoriert<br />
* Zeilen die mit # anfangen sind Kommentare (s.u. ''desc:'')<br />
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: ''name: filter: prereq: par: desc: farewell: order:''<br />
** '''name:''' Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates<br />
** '''filter:''' devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim "set ?" ausgeführt.<br />
** '''prereq:''' ist entweder ein Perl-Ausdruck {}, oder ein ''devspec2array'', was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.<br />
** '''par:''' kann mehrfach vorkommen, Syntax: <code>par:<ParamaterName>:<Kommentar>:<Perl-Code></code>. ''Perl-Code'' versucht den Wert zu finden, falls nicht möglich (''return undef''), wird ein Dialog mit "Replace" angezeigt (bzw. Usage:... im telnet). ''ParameterName'' wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: ''DEVICE'' wird mit dem Namen des Gerätes ersetzt, wird ''DEVICE'' (z.B. für Modulnamen) als Text benötigt, muß es ''escaped'' werden (z.B. MQTT2_\DEVICE).<br />
** '''desc:''' Kommentar fuer <code>set attrTemplate help ?</code>. Die letzte Zeile mit # vor ''name:'' wird als ''desc:'' interpretiert, falls kein ''desc:'' vorhanden ist.<br />
** '''farewell:''' wird zum Schluss als Dialog (oder Text in telnet) angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.<br />
** '''order:''' bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird ''name:'' genommen.<br />
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man <code>set <Device-Name> attrTemplate TemplateName</code> ausführt.<br />
<br />
==Eigene templates entwickeln==<br />
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen templates nutzen. Hierfür können die vorhandenen templates der im Unterverzeichnis ''fhem/FHEM/lib/AttrTemplate'' zu findenden Dateien als Basis dienen. Ihre Templates speichern Sie einfach als neue Datei mit der Endung ''.template'' im selben Verzeichnis und lesen diese mit <code>{ AttrTemplate_Initialize() }</code> neu ein. Danach können Sie diese direkt verwenden.<br />
<br />
Haben Sie ein Template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten)<br />
<br />
==Links==<br />
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}<br />
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen<br />
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.<br />
<references /><br />
[[Kategorie:FHEM-Verwendung]]<br />
[[Kategorie:HOWTOS]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=AttrTemplate&diff=31654AttrTemplate2019-11-08T22:52:13Z<p>Maista: /* Syntax */</p>
<hr />
<div>{{SEITENTITEL:AttrTemplate}}<br />
{{Infobox Modul<br />
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann<br />
|ModType=cmd<br />
|ModCmdRef=<br />
|ModForumArea=Automatisierung<br />
|ModTechName=AttrTemplate.pm <br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.<br />
<br />
Das Modul ''AttrTemplate'' ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl ''attrTemplate'' in einer Vielzahl von Modulen verfügbar.<br />
<br />
==Einführung==<br />
Ziel von ''attrTemplate'' ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. <br />
Teilt man entsprechende ''templates'', sollte jedoch deutlich darauf hingewiesen werden, wenn ein template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.<br />
<br />
Um Ihnen die Auswahl zu erleichtern, kann <br />
* mit <code>set <Device-Name> attrTemplate ?</code> eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. <br />
* in der Detailansicht der Geräte über das Dropdownfeld ein ''template'' ausgewählt werden. Nun erhält man unmittelbar unter dem ''set''-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des ''template'' angezeigt, der bei Drücken auf ''set'' ausgeführt wird.<br />
Hat man ein passendes ''template'' gefunden, wird mit <code>set <Device-Name> attrTemplate <template_name></code> angewendet, wodurch die entsprechenden, in dem ''template'' hinterlegten Kommandos ausgeführt werden.<br />
<br />
== Syntax ==<br />
<br />
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden können:<br />
* leere Zeilen werden ignoriert<br />
* Zeilen die mit # anfangen sind Kommentare (s.u. ''desc:'')<br />
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: ''name: filter: prereq: par: desc: farewell: order:''<br />
** '''name:''' Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates<br />
** '''filter:''' devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim "set ?" ausgeführt.<br />
** '''prereq:''' ist entweder ein Perl-Ausdruck {}, oder ein ''devspec2array'', was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.<br />
** '''par:''' kann mehrfach vorkommen, Syntax: <code>par:<ParamaterName>:<Kommentar>:<Perl-Code></code>. ''Perl-Code'' versucht den Wert zu finden, falls nicht möglich (''return undef''), wird ein Dialog mit "Replace" angezeigt (bzw. Usage:... im telnet). ''ParameterName'' wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: ''DEVICE'' wird mit dem Namen des Gerätes ersetzt, wird ''DEVICE'' (z.B. für Modulnamen) als Text benötigt, muß es ''escaped'' werden (z.B. MQTT2_\DEVICE).<br />
** '''desc:''' Kommentar fuer <code>set attrTemplate help ?</code>. Die letzte Zeile mit # vor ''name:'' wird als ''desc:'' interpretiert, falls kein ''desc:'' vorhanden ist.<br />
** '''farewell:''' wird zum Schluss als Dialog (oder Text in telnet) angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.<br />
** '''order:''' bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird ''name:'' genommen.<br />
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man <code>set <Device-Name> attrTemplate TemplateName</code> ausführt.<br />
<br />
==Eigene templates entwickeln==<br />
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen templates nutzen. Hierfür können die vorhandenen templates der im Unterverzeichnis ''fhem/FHEM/lib/AttrTemplate'' zu findenden Dateien als Basis dienen, Ihre templates speichern Sie einfach als neue Datei mit der Endung ''.template'' im selben Verzeichnis und lesen diese mit <code>{ AttrTemplate_Initialize() }</code> neu ein. Danach können Sie diese direkt verwenden.<br />
<br />
Haben Sie ein template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten) <br />
<br />
==Links==<br />
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}<br />
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen<br />
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.<br />
<references /><br />
[[Kategorie:FHEM-Verwendung]]<br />
[[Kategorie:HOWTOS]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=AttrTemplate&diff=31653AttrTemplate2019-11-08T22:51:35Z<p>Maista: /* Einführung */</p>
<hr />
<div>{{SEITENTITEL:AttrTemplate}}<br />
{{Infobox Modul<br />
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann<br />
|ModType=cmd<br />
|ModCmdRef=<br />
|ModForumArea=Automatisierung<br />
|ModTechName=AttrTemplate.pm <br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.<br />
<br />
Das Modul ''AttrTemplate'' ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl ''attrTemplate'' in einer Vielzahl von Modulen verfügbar.<br />
<br />
==Einführung==<br />
Ziel von ''attrTemplate'' ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. <br />
Teilt man entsprechende ''templates'', sollte jedoch deutlich darauf hingewiesen werden, wenn ein template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.<br />
<br />
Um Ihnen die Auswahl zu erleichtern, kann <br />
* mit <code>set <Device-Name> attrTemplate ?</code> eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. <br />
* in der Detailansicht der Geräte über das Dropdownfeld ein ''template'' ausgewählt werden. Nun erhält man unmittelbar unter dem ''set''-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des ''template'' angezeigt, der bei Drücken auf ''set'' ausgeführt wird.<br />
Hat man ein passendes ''template'' gefunden, wird mit <code>set <Device-Name> attrTemplate <template_name></code> angewendet, wodurch die entsprechenden, in dem ''template'' hinterlegten Kommandos ausgeführt werden.<br />
<br />
== Syntax ==<br />
<br />
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden kann:<br />
* leere Zeilen werden ignoriert<br />
* Zeilen die mit # anfangen sind Kommentare (s.u. ''desc:'')<br />
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: ''name: filter: prereq: par: desc: farewell: order:''<br />
** '''name:''' Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates<br />
** '''filter:''' devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim "set ?" ausgeführt.<br />
** '''prereq:''' ist entweder ein Perl-Ausdruck {}, oder ein ''devspec2array'', was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.<br />
** '''par:''' kann mehrfach vorkommen, Syntax: <code>par:<ParamaterName>:<Kommentar>:<Perl-Code></code>. ''Perl-Code'' versucht den Wert zu finden, falls nicht möglich (''return undef''), wird ein Dialog mit "Replace" angezeigt (bzw. Usage:... im telnet). ''ParameterName'' wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: ''DEVICE'' wird mit dem Namen des Gerätes ersetzt, wird ''DEVICE'' (z.B. für Modulnamen) als Text benötigt, muß es ''escaped'' werden (z.B. MQTT2_\DEVICE).<br />
** '''desc:''' Kommentar fuer <code>set attrTemplate help ?</code>. Die letzte Zeile mit # vor ''name:'' wird als ''desc:'' interpretiert, falls kein ''desc:'' vorhanden ist.<br />
** '''farewell:''' wird zum Schluss als Dialog (oder Text in telnet) angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.<br />
** '''order:''' bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird ''name:'' genommen.<br />
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man <code>set <Device-Name> attrTemplate TemplateName</code> ausführt.<br />
<br />
==Eigene templates entwickeln==<br />
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen templates nutzen. Hierfür können die vorhandenen templates der im Unterverzeichnis ''fhem/FHEM/lib/AttrTemplate'' zu findenden Dateien als Basis dienen, Ihre templates speichern Sie einfach als neue Datei mit der Endung ''.template'' im selben Verzeichnis und lesen diese mit <code>{ AttrTemplate_Initialize() }</code> neu ein. Danach können Sie diese direkt verwenden.<br />
<br />
Haben Sie ein template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten) <br />
<br />
==Links==<br />
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}<br />
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen<br />
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.<br />
<references /><br />
[[Kategorie:FHEM-Verwendung]]<br />
[[Kategorie:HOWTOS]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=AttrTemplate&diff=31652AttrTemplate2019-11-08T22:49:00Z<p>Maista: Tippfehler</p>
<hr />
<div>{{SEITENTITEL:AttrTemplate}}<br />
{{Infobox Modul<br />
|ModPurpose=Hilfsmodul bzw. Befehl, das/der die Einrichtung von Geräten erleichtern kann<br />
|ModType=cmd<br />
|ModCmdRef=<br />
|ModForumArea=Automatisierung<br />
|ModTechName=AttrTemplate.pm <br />
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])<br />
}}<br />
<br />
AttrTemplate ist ein Hilfsmodul, mit dessen Hilfe Geräte auf einfache Weise mit einer passenden Konfiguration versehen lassen.<br />
<br />
Das Modul ''AttrTemplate'' ist indirekt Bestandteil der SetExtensions, das Modul kann von Modulautoren aber auch ohne diese mit in beliebige (Geräte-) Module mit eingebaut werden. Über diesen Mechanismus ist der Befehl ''attrTemplate'' in einer Vielzahl von Modulen verfügbar.<br />
<br />
==Einführung==<br />
Ziel von ''attrTemplate'' ist es, den Nutzer bei der Konfiguration von Geräten zu unterstützen, indem vorrangig entsprechende [[Attribute]] gesetzt werden. Grundsätzlich ist es jedoch auch möglich, beliebige FHEM-Befehle oder Perl-Code im Rahmen von attrTemplate auszulösen. <br />
Teilt man entsprechende ''templates'', sollte jedoch deutlich darauf hingewiesen werden, wenn ein template etwas anderes tut als nur Attribute zu setzen, also insbesondere dauerhafte Konfigurationsänderungen in der Hardware selbst vorzunehmen.<br />
<br />
Um Ihnen die Auswahl zu erleichtern, kann <br />
* mit <code>set <Device-Name> attrTemplate ?</code> eine Liste der vorhandenen Templates samt kurzer Beschreibung aufgerufen werden. <br />
* in der Detailansicht der Geräte über das Dropdownfeld ein ''template'' ausgewählt werden; dann erhält man unmittelbar unter dem ''set''-Befehl ebenfalls entsprechende weitere Informationen sowie den Code des ''template'' angezeigt, der bei Drücken auf ''set'' ausgeführt wird.<br />
Hat man ein passendes ''template'' gefunden, wird mit <code>set <Device-Name> attrTemplate <template_name></code> angewendet, wodurch die entsprechenden, in dem ''template'' hinterlegten Kommandos ausgeführt werden.<br />
<br />
== Syntax ==<br />
<br />
{{Link2Forum|Topic=104804|Message=988100|LinkText=Hier}} hat Rudolf König die Syntax erläutert, die in den attrTemplate-Dateien verwendet werden kann:<br />
* leere Zeilen werden ignoriert<br />
* Zeilen die mit # anfangen sind Kommentare (s.u. ''desc:'')<br />
* Zeilen, die mit einem der folgenden Schlüsselwörter beginnen, werden speziell interpretiert: ''name: filter: prereq: par: desc: farewell: order:''<br />
** '''name:''' Name des Templates, markiert gleichzeitig das Ende des vorherigen Templates<br />
** '''filter:''' devspec2array Ausdruck, der beschreibt, für welche Geräte dieses Template anwendbar ist. Wird erst beim "set ?" ausgeführt.<br />
** '''prereq:''' ist entweder ein Perl-Ausdruck {}, oder ein ''devspec2array'', was genau ein Gerät spezifiziert. Wird beim Einlesen des template Files ausgeführt. Falls nicht wahr ist, werden die darauffolgenden Zeilen des Template nicht ausgeführt. Ist für sowas wie "setze zusätzlich Attribut XY falls die Installation HomeAssistant kennt" gedacht.<br />
** '''par:''' kann mehrfach vorkommen, Syntax: <code>par:<ParamaterName>:<Kommentar>:<Perl-Code></code>. ''Perl-Code'' versucht den Wert zu finden, falls nicht möglich (''return undef''), wird ein Dialog mit "Replace" angezeigt (bzw. Usage:... im telnet). ''ParameterName'' wird in jeder Befehlzeile ersetzt mit dem Wert. Zusätzlich: ''DEVICE'' wird mit dem Namen des Gerätes ersetzt, wird ''DEVICE'' (z.B. für Modulnamen) als Text benötigt, muß es ''escaped'' werden (z.B. MQTT2_\DEVICE).<br />
** '''desc:''' Kommentar fuer <code>set attrTemplate help ?</code>. Die letzte Zeile mit # vor ''name:'' wird als ''desc:'' interpretiert, falls kein ''desc:'' vorhanden ist.<br />
** '''farewell:''' wird zum Schluss als Dialog (oder Text in telnet) angezeigt, falls beim Anwenden der Befehle kein Fehler aufgetreten ist.<br />
** '''order:''' bestimmt die Reihenfolge, in der die Templates im [[FHEMWEB|Webfrontend]] angezeigt werden; falls nicht vorhanden, wird ''name:'' genommen.<br />
* alle anderen Zeilen werden als auszuführende Befehle interpretiert, wenn man <code>set <Device-Name> attrTemplate TemplateName</code> ausführt.<br />
<br />
==Eigene templates entwickeln==<br />
Wer plant, mehrere gleichartige Geräte anzulegen, aber andere Einstellungen zu wählen, als sie in den vorhandenen templates enthalten sind, kann hierfür ebenfalls die attrTemplate-Funktion mit eigenen templates nutzen. Hierfür können die vorhandenen templates der im Unterverzeichnis ''fhem/FHEM/lib/AttrTemplate'' zu findenden Dateien als Basis dienen, Ihre templates speichern Sie einfach als neue Datei mit der Endung ''.template'' im selben Verzeichnis und lesen diese mit <code>{ AttrTemplate_Initialize() }</code> neu ein. Danach können Sie diese direkt verwenden.<br />
<br />
Haben Sie ein template erstellt und möchten dieses teilen, erstellen Sie einfach einen Beitrag im entsprechenden Forenbereichen, für manche Module existieren auch spezielle Threads (siehe Linkliste unten) <br />
<br />
==Links==<br />
* {{Link2Forum|Topic=93370|LinkText=Ankündigung des Moduls im Forum}}<br />
* [[MQTT2_DEVICE#attrTemplate|Wiki zu attrTemplate und MQTT2_DEVICE]] - enthält auch Links zu speziellen Threads für bestimmte Device-Typen<br />
* {{Link2Forum|Topic=94495|LinkText=Thread für getestete Vorschläge (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=94494|LinkText=Thread für Fragen und Anregungen (MQTT2_DEVICE)}}.<br />
* {{Link2Forum|Topic=97694|LinkText=Thread für HTTPMOD}}.<br />
<references /><br />
[[Kategorie:FHEM-Verwendung]]<br />
[[Kategorie:HOWTOS]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=Blinken_-_Impulsgenerator_mit_variablem_Tastgrad&diff=31651Blinken - Impulsgenerator mit variablem Tastgrad2019-11-08T22:44:28Z<p>Maista: Code in <pre></p>
<hr />
<div>= Blinken - Impulsgenerator mit variablem Tastgrad =<br />
== Import ==<br />
Die folgende Definition kann als Testraum in die eigene FHEM-Installation ohne Seiteneffekte importiert werden, indem man auf das Pluszeichen oben links im Webinterface klickt. Falls dieses unsichtbar sein sollte, kann es z.B über den Style f18 sichtbar gemacht werden.<br />
[[Datei:Import nach FHEM1.png|mini|Import nach FHEM Schritt 1]]<br />
[[Datei:Importfenster.png|mini|Import nach FHEM Schritt 2]]<br />
<br />
<pre>defmod Pulse MSwitch # MSwitch_Self pulsedevice<br><br />
attr Pulse MSwitch_Debug 0<br><br />
attr Pulse MSwitch_Delete_Delays 1<br><br />
attr Pulse MSwitch_Eventhistory 0<br><br />
attr Pulse MSwitch_Expert 1<br><br />
attr Pulse MSwitch_Extensions 1<br><br />
attr Pulse MSwitch_Help 1<br><br />
attr Pulse MSwitch_Ignore_Types "TYPE=MSwitch"<br><br />
attr Pulse MSwitch_Include_Devicecmds 1<br><br />
attr Pulse MSwitch_Include_MSwitchcmds 0<br><br />
attr Pulse MSwitch_Include_Webcmds 0<br><br />
attr Pulse MSwitch_Inforoom MSwitch<br><br />
attr Pulse MSwitch_Lock_Quickedit 1<br><br />
attr Pulse MSwitch_Mode Full<br><br />
attr Pulse MSwitch_Safemode 1<br><br />
attr Pulse readingList onpulse offpulse<br><br />
attr Pulse room 07_Pulse<br><br />
attr Pulse setList onpulse:00:00:01,00:00:02,00:00:03,00:00:04,00:00:05 offpulse:00:00:01,00:00:02,00:00:03,00:00:04,00:00:05<br><br />
attr Pulse webCmd on:off:onpulse:offpulse<br><br />
attr Pulse webCmdLabel ::ontime:offtime<br><br />
</pre><br />
<pre>defmod pulsedevice MSwitch # no_device<br><br />
attr pulsedevice MSwitch_Debug 0<br><br />
attr pulsedevice MSwitch_Eventhistory 0<br><br />
attr pulsedevice MSwitch_Help 0<br><br />
attr pulsedevice MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br><br />
attr pulsedevice MSwitch_Inforoom MSwitch<br><br />
attr pulsedevice MSwitch_Mode Dummy<br><br />
attr pulsedevice room 07_Pulse<br><br />
attr pulsedevice setList on off<br><br />
</pre><br />
<pre>setstate Pulse off<br><br />
setstate Pulse 2019-11-03 14:17:18 .Device_Affected MSwitch_Self-AbsCmd1,MSwitch_Self-AbsCmd2,pulsedevice-AbsCmd1,pulsedevice-AbsCmd2<br><br />
setstate Pulse 2019-11-03 14:21:52 .Device_Affected_Details MSwitch_Self-AbsCmd1#[NF]exec_cmd_1#[NF]no_action#[NF]ID#[sp]1#[NF]#[NF]delay1#[NF]delay1#[NF][Pulse#[dp]onpulse]#[NF]00#[dp]00#[dp]00#[NF]#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]3#[ND]MSwitch_Self-AbsCmd2#[NF]exec_cmd_1#[NF]no_action#[NF]#[NF]#[NF]delay1#[NF]delay1#[NF][Pulse#[dp]offpulse]#[NF]00#[dp]00#[dp]00#[NF]#[NF]#[NF]0#[NF]0#[NF]1#[NF]1#[NF]#[NF]0#[NF]0#[NF]4#[ND]pulsedevice-AbsCmd1#[NF]on#[NF]off#[NF]#[NF]#[NF]delay1#[NF]delay1#[NF]00#[dp]00#[dp]00#[NF]00#[dp]00#[dp]00#[NF]#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]1#[ND]pulsedevice-AbsCmd2#[NF]off#[NF]no_action#[NF]#[NF]#[NF]delay2#[NF]delay1#[NF][Pulse#[dp]onpulse]#[NF]00#[dp]00#[dp]00#[NF]#[NF]#[NF]0#[NF]0#[NF]1#[NF]0#[NF]#[NF]0#[NF]0#[NF]2<br><br />
setstate Pulse 2019-11-03 12:31:25 .Device_Events no_trigger<br><br />
setstate Pulse 2019-11-03 12:31:25 .First_init done<br><br />
setstate Pulse 2019-11-03 12:31:25 .Trigger_cmd_off no_trigger<br><br />
setstate Pulse 2019-11-03 12:31:25 .Trigger_cmd_on no_trigger<br><br />
setstate Pulse 2019-11-03 12:31:25 .Trigger_off no_trigger<br><br />
setstate Pulse 2019-11-03 12:31:25 .Trigger_on no_trigger<br><br />
setstate Pulse 2019-11-03 12:31:25 .V_Check V2.00<br><br />
setstate Pulse 2019-11-03 14:18:43 .sortby show<br><br />
setstate Pulse 2019-11-03 12:31:25 Trigger_log off<br><br />
setstate Pulse 2019-11-03 14:21:24 last_activation_by manual<br><br />
setstate Pulse 2019-11-03 14:21:23 last_cmd 1<br><br />
setstate Pulse 2019-11-03 14:21:23 last_exec_cmd set Pulse exec_cmd_1 <br><br />
setstate Pulse 2019-11-03 14:21:05 offpulse 00:00:05<br><br />
setstate Pulse 2019-11-03 14:19:18 onpulse 00:00:02<br><br />
setstate Pulse 2019-11-03 14:21:24 state off<br><br />
</pre><br />
<pre>setstate pulsedevice on<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .Device_Affected no_device<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .Device_Events no_trigger<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .First_init done<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .Trigger_cmd_off no_trigger<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .Trigger_cmd_on no_trigger<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .Trigger_off no_trigger<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .Trigger_on no_trigger<br><br />
setstate pulsedevice 2019-11-03 12:32:30 .V_Check V2.00<br><br />
setstate pulsedevice 2019-11-03 12:32:30 Trigger_log off<br><br />
</pre><br />
<br />
== Inbetriebnahme ==<br />
Der Testraum 07_Puls enthält zwei konfigurierte MSwitch-Geräte, die die beabsichtigte Funktion zusammen bewirken. Pulse enthält die Logik, Pulsedevice dient der Statusausgabe des Generators. Als einziges muss in Pulse eine Auslösezeit in die obere Zeile (switch MSwitch on + execute 'cmd1' at :) im Format hh:mm:ss geschrieben werden, um die Impulsfolge zu starten.<br />
<br />
[[Datei:Pulse-Fenster-oben.png|mini|Pulse-Konfiguration 1. Teil]]<br />
[[Datei:Pulse-Fenster2.png|mini|Pulse-Konfiguration 2. Teil]]<br />
[[Datei:Pulsdevice.png|mini|Pulsdevice-Konfiguration]]<br />
<br />
Nach der Auslösung liefert das Pulsdevice eine endlose konfigurierbare Folge von Rechtecksignalen. Pulsdevice im Testraum in Aktion:<br />
<br />
[[Datei:Pulsdevice .png||Pulsdevice im Testraum in Aktion]]<br />
<br />
== Funktionsbeschreibung ==<br />
[[Datei:Kausakkette1.png|Trigger]]<br><br />
1. Auslösung des MSwitch-Gerätes 'Pulse' beim Erreichen der angegebenen Triggertime,<br><br />
2. Aktivieren des 1. Befehlszweiges 'cmd1' des MSwitch-Gerätes 'Pulse',<br />
<br />
[[Datei:Kausakkette2.png|Geräteauswahl]]<br><br />
3. Auswahl betroffener Geräte: 'MSwitch_Self -> pulse' und 'pulsedevice', Erzeugung je eines 'device action'-Rahmens<br />
<br />
[[Datei:Kausalkette3.png|Setzen der positiven Flanke des Rechtecksignals ]]<br><br />
4. unverzögertes Setzen des Status von 'pulsedevice' auf 'on', positive Flanke des Rechtecksignals<br />
<br />
[[Datei:Kausalkette4.png|Negative Flanke des Ausgangssignals]]<br><br />
5. um die Länge von 'onpulse' verzögertes Rücksetzen des Status von 'pulsdevice', negative Flanke des Rechtecksignals<br />
<br />
[[Datei:Kausalkette5.png|Pausenzeit]]<br><br />
6. um die Länge von 'offpulse' verzögertes Ausführen von 'Set exec_cmd_1', Verweis auf ID1, Pausenzeit vor nächstem Impuls<br />
<br />
[[Datei:Kausalkette6.png|x]]<br><br />
5.???,<br />
<br />
== Anpassung an eigene Anforderungen ==<br />
<br />
Um eigene Geräte für die Ausgabe benutzen zu können, muss:<br />
<br />
<code>Attribut Switch_Ignore_Types = TYPE=MSwitch</code> auf<br />
<br />
<code>Attribut Switch_Ignore_Types = notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul</code><br />
<br />
geändert werden. <br />
<br />
[[Datei:MSwitch Ignore Types geaendert.png|MSwitch_Ignore_Types geändert|938px]]<br />
<br />
Um den Verlust von Konfigurationsdaten zu vermeiden, lässt man das quickedit verriegelt und fügt eigene Zielgeräte per 'edit list' hinzu.<br />
[[Datei:Eigenes device.png|938px|Eigenes Device]]<br />
<br />
Die Bestätigung mit 'modify Devices' erzeugt pro neuem Gerät einen 'device action'-Rahmen, in den die Konfiguration von 'pulsedevice' übernommen werden kann. 'Modify action' übernimmt.<br />
<br />
[[Datei:Deviceaction uebernehmen.png|938px|Deviceaction übernehmen]]<br />
<br />
Der zweite notwendige Action-Rahmen für das eigene Device wird per 'add action ..' erzeugt.<br />
<br />
Das Attribut 'setlist' erlaubt die leichte Anpassung der auswählbaren Impuls- bzw. Pausenzeiten. Hier können auch Dezimalbrüche wie 0,5 angegeben werden.<br />
<br />
[[Datei:Bei der Arbeit.png|bei der Arbeit]]</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31650MSwitch2019-11-08T22:36:47Z<p>Maista: Neuer Link</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt. Hauptmerkmale sind die fast vollständige und die sehr umfangreiche Konfigurierbarkeit über das Webinterface.<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
{{Randnotiz | RNTyp=y | RNText=Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
[[Datei:1-2-3-4.png|rahmenlos]]<br />
}}<br />
<br />
<br />
<br />
<br />
== Grundsätzliche Überlegungen ==<br />
{{Randnotiz | RNTyp=y | RNText=Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar).}} <br />
<br />
1. Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen? <br />
[[Datei:MSwitch basic.svg|mini|240px|Stark vereinfachtes Struktogramm]]<br />
Im Rahmen 1 des Webinterfaces lässt sich der Trigger (Auslöser) bzw. eine Zeitabhängigkeit konfigurieren:<br />
<br />
** jedes Event aus dem Eventmonitor,<br />
** triggerunabhängige Zeiten, <br />
** triggerunabhängige Zufallszeiten,<br />
** triggerunabhängige Intervalle,<br />
** Kombinationen aus Triggern und Zeiten.<br />
<br />
2. Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Ersten Rahmen: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
3. Welche Kommandos sollen ausgelöst werden?<br />
: Im vierten Rahmen des Webinterfaces werden dann die konkreten Kommandos eingegeben. Man wählt dabei aus einer Liste wie auf der Geräteseite Kommandos aus. FreeCmd erlaubt geräteunabhängige Kommandos, beispielsweise reinen Perl-Code.<br />
<br />
4. Welche weiteren Bedingungen sollen noch gelten?<br />
: Zusätzlich pro Gerät eine oder mehrere Instanzen des vierten Rahmens:<br />
** ereignisgesteuerte Bedingungen,<br />
** zeitgesteuerte Bedingungen,<br />
** Verzögerungen,<br />
** Wiederholungen etc.<br />
<br />
==Definition und Einrichtung =={{Randnotiz | RNTyp=y | RNText=Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save. Die Speicherung erfolgt durch den Befehl Fhemsave.<br />
}}<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird in der aktuellen Version über FHEM Update verteilt. MSwitch kann mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in den zwei möglichen Zweigen entsprechend der Kommandos cmd1 und cmd2. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle':<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
== Webinterface ==<br />
MSwitch wird über das Webinterface eingerichtet. Es besteht aus vier Teilen. Änderungen in einem Abschnitt müssen auch dort gespeichert werden, bevor ein weiterer Teil bearbeitet wird, sonst gehen Änderungen verloren.{{Randnotiz | RNTyp=y | RNText=<code>attr <name> MSwitch_Help 1</code> führt dazu, dass im Modul selber eine sehr umfangreiche kontextsensitive Hilfe in Form von Fragezeichensymbolen angezeigt wird.}} <br />
<br />
[[Datei:1-2-3-4.png|rahmenlos|Webinterface]]<br />
=== Rahmen 1: Trigger Device und Trigger Time ===<br />
==== Trigger Device ====<br />
{{Randnotiz | RNTyp=y | RNText=Wenn das Attribut 'MSwitch_Expert' gesetzt ist kann man 'GLOBAL' auswählen. Dann werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
==== Trigger Device Global Whitelist ====<br />
Damit kann die Liste eingehender Events weiter eingeschränkt werden. Sobald mindestens ein Eintrag vorhanden sind, werden nur noch Events der hier benannten Devices verarbeitet. Zulässig ind Devicenamen und DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
Im unten gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt.}}In diesem Feld wird das Device per Dropdownfeld gewählt, dessen Events eine Aktion auslösen sollen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
<br />
==== Trigger Time ==== <br />
Trigger time bietet die Möglichkeit einer zeitabhängigen Steuerung. Dazu wird in die "at"-Zeile ein Termin in der Form [STUNDEN:MINUTEN|TAGE] eingetragen. Die Tage werden ab Montag von 1-7 gezählt. Mehrere Zeitvorgaben können direkt hintereinander geschrieben werden. Beispiele:<br />
* <code>[17:00|1][18:30|23]</code> löst montags um 17 Uhr und dienstags sowie mittwochs um 18:30 Uhr aus.<br />
* <code>[00:10*20:00-21:00]</code> führt den Schaltbefehl von 20 Uhr bis 21 Uhr alle 10 Minuten aus.<br />
* <code>[?20:00-21:00]</code> schaltet zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr einmalig. <br />
* <code>[20:00|$we]</code> nur am Wochenende um 20:00 wird geschaltet.<br />
<br />
==== Trigger Conditions ====<br />
<br />
Optionale zusätzliche Bedingungen in diesem Feld gelten nur für auslösende Device Trigger. Trigger Times haben keinen Einfluss, es sei denn, das Attribut MSwitch_Condition_Time ist gesetzt. Man kann mit AND / OR verknüpfte Bedingungen für die Auslösung in an DOIF angelehnter Syntax angeben. Leere Felder werden ignoriert. Werden Readings mit Strings wie 'on' oder 'off' abgefragt, ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden. Beispiele:{{Randnotiz | RNTyp=y | RNText=Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).}} <br />
* <code>[19:10-23:00] AND [Devicename:Reading] = 10</code> beide Bedingungen müssen erfüllt sein.<br />
* <code>[19:10-23:00] OR [Devicename:Reading] eq "on"</code> eine der Bedingungen muss erfüllt sein.<br />
* <code>[10:00-11:00|13]</code> schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
* <code>[{ sunset() }-23:00]</code> von Sonnenuntergang bis 23:00 Uhr.<br />
* <code>{ !$we }</code> löst den Schaltvorgang nur Werktagen an aus.<br />
* <code>{ $we }</code> löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
=== Rahmen 2: Trigger Details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Der Inhalt des zweiten Rahmens wird mit dem gewählten Trigger aus dem ersten Rahmen initialisiert. Events können zugeordnet werden. Im Beispiel wird cmd1 ausgelöst, wenn das Fenster offen ist. Cmd2 wird bei Temperaturunterschreitung ausgelöst.<br />
<br />
==== execute ====<br />
Diese vier Zeilen legen fest, welches ankommende Event welchen Befehlszweig auslösen soll. Die Event-Drop-Down-Liste enthält alle empfangenen Events dieses Devices. Fehlende Events können manuell hinzugefügt werden.<br />
<br />
* switch <MSwitch> on + execute 'cmd1' - MSwitch Statusänderung auf 'on'; cmd1 soll ausgeführt werden<br />
* switch <MSwitch> off + execute 'cmd2' - MSwitch Statusänderung auf 'off'; cmd2 soll ausgeführt werden; <br />
* execute 'cmd1' only - keine Statusänderung; cmd1 soll ausgeführt werden<br />
* execute 'cmd2' only - keine Statusänderung; cmd2 soll ausgeführt werden<br />
<br />
==== Save incomming events ====<br />
Alle ankommenden Events der konfigurierten Geräte werden für die Dropdownlisten gespeichert. Nach erfolgreicher Konfiguration sollte diese Option entfernt werden, um die Datenmenge zu reduzieren. Falls das Device Events während der Konfiguration nicht liefert, können sie manuell als kommagetrennte Liste hinzugefügt werden.<br />
<br />
==== add event ====<br />
{{Randnotiz | RNTyp=y | RNText=Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br />
- * - alle auftretende Events des entsprechenden Device<br />
- device:reading:wert (z.B. device:state:on ) - nur für das Event "device:state:on"<br />
- device:reading:* (z.B. device:state:* ) - Events "device:state:(on,off,etc.)<br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Events "device:state:left" oder "devicestate:right" etc.<br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
}} <br />
* * - alle auftretende Events des entsprechenden Device<br />
* reading:wert (z.B. state:on ) - nur auf das Event "state:on"<br />
* reading:* (z.B. state:* ) - Events "state:(on,off,etc.)<br />
* reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Events "state:left" oder "state:right" etc.<br />
==== test event ====<br />
Stehen Events zur Auswahl, kann die Konfiguration getestet werden. Durch Klick wird das Event simuliert und die dafür definierte Aktion ausgelöst. <br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt???<br />
<br />
==== clear saved event ====<br />
Es werden die nicht als Trigger wirkenden Events aus der Liste gelöscht.<br />
<br />
=== Rahmen 3: Affected devices ===<br />
{{Randnotiz | RNTyp=y | RNText=In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
}} <br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Auswahl der Devices, die auf die oben konfigurierten Events reagieren sollen. Um unbeabsichtigte Änderungen zu vermeiden ist die direkte Mehrfachauswahl gesperrt.<br />
<br />
=== Rahmen 4: Device Actions ===<br />
<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Die auszuführenden Aktionen der im dritten Rahmen gewählten Geräte. Leere Felder werden ignoriert.<br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
{{Randnotiz | RNTyp=y | RNText=Im Beispiel befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail).<br />
}} <br />
Man wählt den gewünschten Befehl aus den gespeicherten verfügbaren Möglichkeiten des betreffenden Device aus. <br />
<br />
* Im Sonderfall FreeCmd wird der Befehl als String eingegeben. <br />
* Das Attribut MSwitch_Extensions ergänzt die Schaltoption 'MSwitchToggle' in der Liste, um die Toggle-Funktion bei Geräten die sie nicht von Haus aus anbieten nachzurüsten. <br />
<br />
{{Randnotiz | RNTyp=y | RNText=Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
).<br />
}}<br />
<br />
==== cmd1/cmd2 condition ====<br />
<br />
{{Randnotiz | RNTyp=y | RNText=Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
}} <br />
Die Ausführung der Befehle kann '''pro gewählten Gerät''' analog Rahmen 1 von weiteren Bedingungen abhängig gemacht werden. Es gelten die gleichen Regeln und Beispiele wie im 'Rahmen 1 Trigger Conditions'. Sie können sinngemäß übernommen werden.<br />
<br />
Die Variable <code>$EVENT</code> enthält den auslösenden Trigger. Wenn unter 'Rahmen 1 Trigger Conditions' ein Wildcard verwendet wurde, kann nun feingefiltert werden, indem das konkrete Ereignis angegeben wird. <br />
<br />
Beispiel: <code>[$EVENT] eq "state:on"</code> würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war.<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen. Einzelheiten enthält auch das Funktions-Struktogramm.<br />
<br />
Statt einer direkten Zeitangabe kann hier auch auf eine verwiesen werden, indem in der Form [NAME.reading] ein Reading eines Devices wie z.B. [dummy.state] angegeben wird.<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiterer Rahmen 4 als Rahmen 4.1 für das gleiche Device angelegt werden, um z.B. einen weiteren Befehl gegebenenfalls zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der gewählte Rahmen 4 für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
<br />
Die Felder 'Repeats', 'Repeatdelay in s' und 'priority' stehen zur Verfügung, wenn das Attribut MSwitch_Expert gesetzt wurde. Diese bewirken eine n-fache Wiederholung des gesetzten Befehls mit m Sekunden Verzögerung. Das Auswahlfeld 'priority' erscheint bei jedem 'affectes device'. So kann die Reihenfolge der Befehlsabarbeitung beeinflusst werden.<br />
<br />
== Erweiterte Konfiguration ==<br />
<br />
=== Set-Befehle ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|set active||Setzt das MSwitch-Device in den Status 'active'.<br />
|-<br />
|set inactive||Setzt das Device in den Status 'inactive'. Es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
|-<br />
|set on<nowiki>|</nowiki>off [<parameter>]||Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt. Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
|-<br />
|set reload_timer||Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
|-<br />
|set change_renamed <oldname> <newname>||Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
|-<br />
|set exec_cmd1 <nowiki>|</nowiki> set exec_cmd1 ID [<ID>]||Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
|-<br />
|set MSwitch_backup||Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg. Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
|-<br />
|set del_delays <nowiki>|</nowiki> set exec_cmd1 ID [<ID>]||Löscht alle anstehenden, verzögerten Befehle (delays).<br />
|-<br />
|set reset_cmd_count: 1<nowiki>|</nowiki>2||Löscht das entsprechende EVT_CMD_COUNT - Reading; entspricht damit einer Rückstellung auf '0'.<br />
|-<br />
|set fakeevent [<device>]:<reading>:<arg>||Beispiel: <device> fakeevent state:on<br><br />
Das MSwitch Device reagiert so, als wäre statt des internen "fakes-Befehls" ohne FHEM-Systembeeinflussung dieses Event tatsächlich vom triggernden Gerät generiert worden. <br />
<br />
Der Name (<device>) muss bei GLOBALEN Triggern mit angegeben werden, sonst wird das Device automatisch gesetzt.<br />
Um z.B. einen Watchdog zu realisieren ist es eventuell nötig, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay Affected Device. Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. Möglicherweise steht dieser Befehl zukünftig nur noch zur Verfügung, wenn Safemode aktiviert ist.<br />
|}<br />
<br />
=== Get-Befehle ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|get show_timer [<show><delete>]||<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
|-<br />
|get restore_MSwitch_data [<this_device><nowiki>|</nowiki><all_devices>]||<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM..<br />
|-<br />
|get_config||Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
|-<br />
|get_support_info||Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
|-<br />
|get_MSwitch_preconf||Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
|}<br />
<br />
=== Attribute ===<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|MSwitch_Debug <0<nowiki>|</nowiki>1<nowiki>|</nowiki>2<nowiki>|</nowiki>3<nowiki>|</nowiki>4>||<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Der Inhalt der Protokolldatei wird direkt im Device angezeigt<br><br />
3 - Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt.<br><br />
4 - erweitertes Debugfür Entwickler mit wechselnden Funktionen<br><br />
|-<br />
|MSwitch_Expert <0<nowiki>|</nowiki>1>||<br />
* In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
* Die Felder 'Repeats' und 'Repeatdelay in s' stehen zur Verfügung. Dies bewirkt eine n-fache Wiederholung des gesetzten Befehls mit m Sekunden Verzögerung.<br />
<br />
* Das Auswahlfeld 'priority' erscheint bei jedem 'affectes device'. So kann die Reihenfolge der Befehlsabarbeitung beeinflusst werden.<br />
|-<br />
|MSwitch_Sequenz <Suchmuster> ??? ||<br />
Eine Schaltsequenz kann durch ein oder mehrere durch '/' getrennte Suchmuster angegeben werden. Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
Beispiel: <code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden. Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
|-<br />
|MSwitch_Sequence_time <Zeit in Sekunden>||Maximalzeit in Sekunden, um eine Sequenz vollständig auszuführen. (Was wenn diese Zeit überschritten wird???)<br />
|-<br />
|MSwitch_Extensions <0<nowiki>|</nowiki>1>||Es wird zusätzlich zu 'on' und 'off' die Schaltoption 'MSwitchToggle' in der Liste angeboten, um die Toggle-Funktion bei Geräten die sie nicht von Haus aus anbieten nachzurüsten.<br />
|-<br />
|MSwitch_Delete_Delays <0<nowiki>|</nowiki>1>||Eins bewirkt das Löschen aller anstehende Delays bei dem Auftreten eines erneuten passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorher getriggerten Event erhalten und werden ausgeführt. Empfohlene Einstellung: 1<br />
|-<br />
|MSwitch_Include_Devicecmds <0<nowiki>|</nowiki>1>||Bewirkt die Aufnahme aller Devices die bei Abfrage mit 'set DEVICE ?' einen eigenen Befehlssatz liefern in die Auswahlliste 'Affected Devices'. Bei Option '0' werden diese Devices in der Liste nicht mehr angeboten. Empfohlene Einstellung: 1<br />
|-<br />
|MSwitch_Include_Webcmds <0<nowiki>|</nowiki>1>||Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option '0' werden diese Devices nicht mehr angeboten, es sei denn, sie liefern mit 'set DEVICE ?' einen eigenen Befehlssatz. Empfohlene Einstellung: 0, Einsatz nach Bedarf.<br />
|-<br />
|MSwitch_Activate_MSwitchcmds <0<nowiki>|</nowiki>1>||Fügt jedem vorhandenen Device das Attribut 'MSwitchcmd' hinzu.<br />
|-<br />
|MSwitch_Include_MSwitchcmds <0<nowiki>|</nowiki>1> ||Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option '0' werden diese Devices nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz mit 'set DEVICE ?' liefern. Empfohlene Einstellung: 0, Einsatz nach Bedarf.<br />
|-<br />
|MSwitch_Lock_Quickedit <0<nowiki>|</nowiki>1>||Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option '1' ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden, um versehentliche Änderungen zu vermeiden. Die Auswahl einer Option ohne betätigte <Strg>-Taste bewirkt das Löschen aller bereits gesetzten Optionen. Empfohlene Einstellung: 1<br />
|-<br />
|MSwitch_Startdelay <0<nowiki>|</nowiki>10<nowiki>|</nowiki>20<nowiki>|</nowiki>30<nowiki>|</nowiki>60> ||MSwitch ignoriert nach einem FHEM-Neustart für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen geändert werden. Empfohlene Einstellung: 30<br />
|-<br />
|MSwitch_Ignore_Types||Beinhaltet eine durch Leerzeichen getrennte Liste von Device-''Typen'' welche nicht geschaltet werden oder nicht geschaltet werden können. Sie werden dann in den Auswahllisten ''nicht'' dargestellt, um die Auswahllisten übersichtlich zu halten.Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul. <br />
<br />
???Wenn statt des Devicetyps ein devspec z.B. "TYPE=watchdog" angegeben wird, ist zu beachten, dass alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!???<br />
<br />
|-<br />
|MSwitch_Trigger_Filter ||Beinhaltet eine kommagetrennte Liste von Events, die im Falle ihres Eingangs unberücksichtigt und ungespeichert bleiben. Wildcards wie '*' können angegeben werden. Empfohlene Einstellung: -<br />
|-<br />
|MSwitch_Wait <n in Sekunden>||Bei gesetztem Attribut nimmt das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events.<br />
<br />
|-<br />
|MSwitch_Event_Id_Distributor||??? Voraussetzung ist, dass das Attribut 'MSwitchExpert' auf '1' gesetzt ist. Es können auslösende Events auf ID-Aktionen umgeleitet werden. Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden (regex z.B. state:(on|off)) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohne ID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet: <code>state:on=>cmd1 ID 1,2</code> Entsprechend werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen. ???<br />
<br />
|-<br />
|MSwitch_Selftrigger_always <0<nowiki>|</nowiki>1> ||(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes '1' bewirkt, dass alle SET Aktionen des Devices einen internen Event ohne Auswirkungen auf das FHEM-System auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden. Auftretende auswertbare interne Events haben immer folgendes Format: <br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind. Der 'wait' Befehl/Attribut hat keine wirkung.<br />
|-<br />
|MSwitch_Mode <Notify<nowiki>|</nowiki>Full<nowiki>|</nowiki>Toggle<nowiki>|</nowiki>Dummy> ||Schaltet das Modul zwischen angepassten Weboberflächen-Modi um.<br />
<br />
Notify<br />
Das Device kann nicht manuell umgeschaltet werden. Es gibt nur die zwei ausführbaren Zweige "execute 'cmd1' commands" und "execute 'cmd2' commands". Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active' Dieser Mode ist ähnlich zu einem FHEM-Notify.<br />
<br />
Full<br />
Es stehen alle Funktionen zur Verfügung.<br />
Toggle<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'umgeschaltet', ??? entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt. ???<br />
Dummy<br />
ACHTUNG: Funktionsänderung mit V2.61 Der Mode 'Dummy' ist ein eingeschränkter Modus. Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen. Der Dummy-Mode kann nur in einem neu angelegten leeren MSwitch aktiviert und auch nicht wieder verlassen werden! Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) sind Umschalt-Optionen nicht mehr verfügbar.<br />
<br />
|-<br />
|MSwitch_Condition_Time <0<nowiki>|</nowiki>1> ||In der Grundeinstellung '0' werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung '1' wird diese Überprüfung wie für Events zugeschaltet.<br />
<br />
|-<br />
|MSwitch_Random_Time <HH:MM:SS-HH:MM:SS> || Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls (Delay) eine Zufallszeit generiert, die im Rahmen der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von '[random]' immer '00:00:00'<br />
<br />
|-<br />
|MMSwitch_Random_Number <n> ||Bei Aktivierung dieses Attributes mit einer beliebigen ganzen Zahl, werden vom Device die zwei Readings 'RandomNr' und 'RandomNr1' und mit Werten zwischen null und n angelegt. RandomNr wird vor jedem Ausführen eines Befehls, auch für unterschiedliche Geräte in einem Durchgang, neu generiert. RandomNr1 bleibt nach der Initialisierung konstant. Wenn auf dieses Readings in einer Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen wird, wird der Befehl nur ausgeführt, wenn ReadingNr1 gerade = 1 ist. Der Befehl wird somit nur mit einer Wahrscheinlichkeit von eins zu n ausgeführt.<br />
<br />
|-<br />
|MSwitch_Reset_EVT_CMD1(2)_COUNT ||Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt. Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
|-<br />
|MSwitch_Safemode <0<nowiki>|</nowiki>1> ||Bietet einen gewissen Schutz vor falschen Konfigurationen und dadurch entstehenden Endlosschleifen. Bei aktiviertem Attribut '1' beendet das Modul Endlosschleifen eines Devices. In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt. Es wird ein letztes Event generiert, auf das reagiert werden kann <code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code> Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis. In der Grundkonfiguration ist dieses Attribut nicht gesetzt. Es empfiehlt sich aber, bei neuen bzw. komplizierten Devices, dieses zumindest anfänglich zu aktivieren.<br />
|-<br />
|MSwitch_Read_Log<0<nowiki>|</nowiki>1> ||Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Der im Logeintrag vorhandene Devicename ist Bedingung für die Funktion.<br />
|-<br />
|MSwitch_Help<0<nowiki>|</nowiki>1> ||Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
|-<br />
|MSwitch_Comments<0<nowiki>|</nowiki>1> ||Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
|-<br />
|MSwitch_generate_Events<0<nowiki>|</nowiki>1> ||Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
|-<br />
|MSwitch_Startdelay||???Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das Device nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.??? (Hatten wir das nicht schon?)<br />
<br />
|-<br />
|MSwitch_Inforoom ||Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
<br />
|}<br />
<br />
== Integrierte Funktionen ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Name !! class="unsortable" | Beschreibung <br />
|-<br />
|Average||???<br />
|-<br />
<br />
|Difference||<br />
* Syntax: [DIFF<wert>:<reading>] > <differenz><br />
* Beispiel: [DIFF2:countdown] > 0<br />
* Reading: entspricht dem getriggerten Reading.<br />
* Wert: gespeicherter Wert (in diesem Fall der vorletzte).<br />
* Differenz: geforderte Differenz zwischen aktuellem und vorletztem Wert.<br />
* Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
Folgende Readings werden zur Verfügung gestellt:<br />
* DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
* DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
|-<br />
|Increase||???<br />
|-<br />
|Tendency||<br />
*Syntax: [TEND<wert>:<reading>] > <Mindestwert><br />
*Beispiel: [TEND2:countdown] > 2<br />
*Reading: entspricht dem getriggerten Reading.<br />
*Wert: Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen. Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte. Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
*Mindestwert: Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
|}<br />
<br />
== Funktions-Struktogramm ==<br />
[[Datei:MSwitch full.svg|Struktogramm des Funktionsprinzips]]<br />
<br />
== Anwendungs-Beispiele ==<br />
<br />
=== [[Blinken - Rechteckgenerator]] ===<br />
=== [[Blinken - Impulsgenerator mit variablem Tastgrad]] ===<br />
=== [[Linearschalter]] ===<br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}<br />
* {{Link2Forum|Topic=86199|Message=990265|LinkText=Bewegungsmelder}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31481MSwitch2019-11-01T20:15:46Z<p>Maista: /* MSwitch_Startdelay */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debug-Funktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt, dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Device intern, d.h es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber ausgewertet werden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut.<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden. Es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das Device nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt.<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31480MSwitch2019-11-01T20:02:25Z<p>Maista: /* Tipps, Tricks, Kurzbeispiele */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debug-Funktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt, dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Device intern, d.h es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber ausgewertet werden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut.<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden. Es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt.<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31479MSwitch2019-11-01T20:01:44Z<p>Maista: /* MSwitch_Debug (0:1:2:3:4) */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei. Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debug-Funktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt, dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Device intern, d.h es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber ausgewertet werden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut.<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden. Es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31478MSwitch2019-11-01T20:00:52Z<p>Maista: /* Notify */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt, dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Device intern, d.h es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber ausgewertet werden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut.<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden. Es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31477MSwitch2019-11-01T20:00:25Z<p>Maista: /* MSwitch_Selftrigger_always (0,1) */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt, dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Device intern, d.h es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber ausgewertet werden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut.<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31476MSwitch2019-11-01T20:00:06Z<p>Maista: /* MSwitch_Selftrigger_always (0,1) */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt, dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Device intern, d.h es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber ausgewertet werden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31475MSwitch2019-11-01T19:59:21Z<p>Maista: /* MSwitch_Selftrigger_always (0,1) */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt, dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Deviceintern, d.h es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber ausgewertet werden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst, die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31474MSwitch2019-11-01T19:58:01Z<p>Maista: /* MSwitch_Event_Id_Distributor */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden, für die eine ID definiert ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt , dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Deviceintern , d.H es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber augewertet weden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst , die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31473MSwitch2019-11-01T19:55:51Z<p>Maista: /* add event */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
Hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern. Manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden , für die eine ID definierrtt ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt , dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Deviceintern , d.H es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber augewertet weden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst , die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31472MSwitch2019-11-01T19:50:56Z<p>Maista: /* get_MSwitch_preconf */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden, wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
Diese kann durch ein einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern, manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden , für die eine ID definierrtt ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt , dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Deviceintern , d.H es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber augewertet weden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst , die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31471MSwitch2019-11-01T19:48:44Z<p>Maista: /* set fakeevent []:: */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden. Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden , wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
diese kann durch einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern, manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden , für die eine ID definierrtt ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt , dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Deviceintern , d.H es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber augewertet weden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst , die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maistahttp://wiki.fhem.de/w/index.php?title=MSwitch&diff=31470MSwitch2019-11-01T19:46:13Z<p>Maista: /* set change_renamed */</p>
<hr />
<div><br />
[[MSwitch]] ist ein Hilfsmodul, welches das Event- und/oder zeitgesteuerte Schalten von mehreren Devices oder das Ausführen von benutzerdefinierten Befehlssequenzen erlaubt.<br />
<br />
Die Stärke bzw. das Unterscheidungsmerkmal dieses Moduls liegt in der Konfigurierbarkeit über ein Webinterface. Diese Konfiguration kann jederzeit geändert oder erweitert werden. <br />
<br />
Byte09: ''Die Grundidee zu MSwitch kam mir, weil ich bei der Arbeit mit FHEM für meinen Geschmack zu viele Module für die verschiedenen Aufgaben brauchte - zu allem Überfluss alle mit unterschiedlicher Syntax. Zwar ist DOIF hiervon ausgenommen (da hiermit wohl auch fast jede Aufgabe lösbar ist), aber ich konnte mich leider nicht daran gewöhnen und somit wurde jedes DOIF für mich zu einem echten Projekt. Was ich wollte war ein Modul, mit dem ich alles erledigen kann. Daher entschloss ich mich schon nach fast einem knappen Jahr FHEM-Nutzung mein eigenes Modul zu schreiben, welches diese Anforderung erfüllt. MSwitch beinhaltet die Funktionalität aller bisherigen Hilfsmodule wie z.B. Notify, Doif, Watchdog, Dummy,( ab Modulversion 2.2 auch Sequenz ) es lassen sich all deren Funktionen umsetzen.''<br />
<br />
''MSwitch wird permanent - vorrangig nach meinen Bedürfnissen - weiterentwickelt, gerne nehme ich aber auch Anregungen von anderen Nutzern auf.''<br />
<br />
{{Infobox Modul<br />
|ModPurpose=MSwitch<br />
|ModType=h<br />
|ModForumArea=Automatisierung<br />
|ModTechName=98_MSwitch.pm<br />
|ModOwner=Byte09}}<br />
<br />
== Grundsätzliche Überlegungen ==<br />
Um das Modul zu nutzen, muss man zuerst folgende Fragen beantworten:<br />
<br />
* Welches Gerät soll auslösen oder zu welcher Zeit soll eine Auslösung erfolgen.<br />
: Dies ist der Trigger. Jedes Event aus dem Eventmonitor kann als Trigger dienen. Will man mehrere Geräte als gleichzeitige Auslöser betreiben, so muss das Device GLOBAL gewählt und die entsprechenden Geräte angegeben werden (dies erzeugt höhere Systemlast und ist nur im Expert-Modus verfügbar). Weiterhin kann auch zu fest definierten Zeiten, Zufallszeiten oder Intervallen, unabhängig von einem Trigger, geschaltet werden; auch eine Kombination beider Varianten ist möglich. Diese Einstellungen erfolgen im ersten Teil des Webinterfaces.<br />
<br />
* Welche Bedingungen sollen bei Auslösung erfüllt sein?<br />
: Wenn diese Bedingungen erfüllt sind, werden Kommandos ausgelöst. Die Bedingungen werden im zweiten Teil des Webinterfaces eingegeben. Dabei unterscheidet das Modul zwischen zwei Kommando-Kanälen (cmd1 und cmd2) und den dazugehörigen Geräten.<br />
<br />
* Welche Kommandos sollen ausgelöst werden?<br />
: Im dritten Teil des Webinterfaces werden dann die konkreten Kommandos eingegeben. Typischerweise wählt man dabei aus einer Liste der Kommandos aus, die die zugehörigen Geräte insgesamt aufweisen (also so, wie man auf den Geräteseiten selber Kommandos auswählt). Es gibt zudem ein so genanntes FreeCmd, das ein Geräteunabhängiges Kommando zulässt, beispielsweise reinen Perl-Code.<br />
<br />
* Welche weiteren Bedingungen sollen noch gelten?<br />
: Hier sind Ereignisgesteuerte wie auch Zeitgesteuerte Bedingungen möglich. Diese Bedingungen werden auch in dem dritten Teil des Webinterfaces eingetragen. So sind Verzögerungen und Wiederholungen und weitere Bedingungen möglich.<br />
<br />
== Voraussetzungen, Installation und Grundbefehle ==<br />
Das MSwitch-Modul ist ohne weitere Voraussetzungen nutzbar und wird derzeit in der Version 2.08 über FHEM Update verteilt. <br />
<br />
=== Definition und Einrichtung ===<br />
Mit Hilfe von MSwitch kann man mehrere Devices gleichzeitig schalten. Diese Schaltungen befinden sich in zwei möglichen Zweigen bei MSwitch. Dabei unterscheidet man im Modul zwischen den beiden Kommandos cmd1 und cmd2. Die zu einem Kommando gehörenden Geräte werden wir auch Zweig nennen. Die einzelnen Devices jedes Zweiges können mit weiteren Schaltbedingungen versehen werden (zeit- oder ereignisgesteuert). <br />
<br />
Folgende Möglichkeiten zum definieren des MSwitch Devices stehen zur Verfügung:<br />
:<code>define <name> MSwitch</code><br />
Es wird ein leeres Device angelegt, das dann komplett über das Webinterface konfigurierbar ist.<br />
<br />
Das define eines MSwitch Devices generiert lediglich eine 'leere Hülle'. Alle relevante Einstellungen werden in Readings und/oder Hashes gespeichert. Daher stehen relevanten Daten ''nicht'' in der fhem.cfg! Vielmehr finden sich diese Daten in der Datei fhem.save (die Speicherung erfolgt durch den Befehl Fhemsave).<br />
<br />
=== set-Befehle ===<br />
Es sind derzeit die folgenden set-Befehle implementiert.<br />
<br />
==== set active ====<br />
Setzt das Device in den Status 'active'.<br />
<br />
==== set inactive ====<br />
Setzt das Device in den Status 'inactive', es werden keine Befehle mehr ausgeführt. Dieser Status entspricht dem Attribut 'disable', ist aber nicht mit dem roten Fragezeichen (fhem save) verbunden.<br />
<br />
==== set on/off [<parameter>]====<br />
Setzt das Device in den Status 'on' oder 'off'. Alle Befehle der 'on/off-Zweige' werden ausgeführt.<br />
Optional kann den Befehlen 'on' und 'off' ein weiterer Parameter mit übergeben werden. Dieser wird im Reading 'Parameter' hinterlegt und es kann sofort in 'Freecmds' oder 'Conditions' darauf zugegriffen werden.<br />
<br />
==== set reload_timer ====<br />
Alle gesetzten Timer werden gelöscht und neu berechnet.<br />
<br />
==== set change_renamed <oldname> <newname> ====<br />
Sollten sich Devicenammen im ausführenden Teil geändert habe (affected Devices, Conditions, etc.) so kann das MSwitch mit diesem Befehl angepasst werden, ohne alle Einstellungen neu einstellen zu müssen.<br />
<br />
==== set exec_cmd1 / set exec_cmd1 ID [<ID>] ====<br />
Bewirkt das sofortige Ausführen des entsprechenden Befehlszweiges. Bei Angabe einer ID werden nur die Befehle mit der entsprechenden ID ausgeführt.<br />
<br />
==== set MSwitch_backup ====<br />
Erstellt eine Backup-Datei aller MSwitch Devices unter ./fhem/MSwitch_backup.cfg.<br />
<br />
Daten dieser Datei können im Bedarfsfall für einzelne oder gleichzeitig alle MSwitch Devices wieder zurückgespielt (hergestellt) werden.<br />
<br />
==== set del_delays ====<br />
Löscht alle anstehenden, verzögerten Befehle (delays).<br />
<br />
==== set reset_cmd_count:1,2 ====<br />
Löscht das entsprechende EVT_CMD_COUNT - Reading (entspricht Rückstellung auf '0').<br />
<br />
==== set fakeevent [<device>]:<reading>:<arg> ====<br />
Beispiel: <device> fakeevent state:on<br><br />
<br />
Ob der Name (<device>) angegeben werden muss, oder nicht, ist abhängig davon, ob auf ein einzelnes Device, oder GLOBAL getriggert wird. Bei GLOBALEN Triggern muss das Device mit angegeben werden, Wird auf ein Device getriggert, so wird das Device automatisch gesetzt.<br />
<br />
Mit diesem Befehl kann das MSwitch Device neu getriggert werden, indem hier ein Event 'gefaked' wird. Das MSwitch Device reagiert dann so, als wäre dieses Event vom getriggerten Gerät generiert worden. <br />
<br />
Dieses kann nötig sein, um z.B. einen Watchdog zu realisieren, in dem es nötig ist, dass sich das MSwitch Device mit einem bestimmten Event selber neu triggert - ggf. mit einem entsprechenden Delay (affected Device muss dafür u.A. des MSwitch Device selber sein).<br />
<br />
Es wird hierbei KEIN echtes Event generiert welches das System beeinflusst, sondern ausschließlich ein MSwitch-Interner Befehl umgesetzt!<br />
<br />
Bei dem Einsatz dieser Möglichkeit sollte das Attribut 'MSwitch_Safemode' UNBEDINGT aktiviert sein, da 'Experimente' hier schnell in einer Endlosschleife enden können, die nur durch ein Reboot unterbrochen werden kann. <br />
<br />
Ggf. werde ich hier sogar eine entsprechende Änderung vornehmen, dass dieser Befehl nur zur Verfügung steht, wenn Safemode aktiviert ist.<br />
<br />
=== get-Befehle ===<br />
==== get show_timer [<show><delete>] ====<br />
;Show<br />
:Zeigt alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren.<br />
;Delete<br />
:Löscht alle anstehenden (gesetzten) Timer des Devices, die aus zeitabhängigen oder verzögerten Schaltbefehlen resultieren. Schaltbefehle basierend auf rein zeitabhängigen Angaben werden neu berechnet und gesetzt.<br />
<br />
==== get restore_MSwitch_data [<this_device><all_devices>] ====<br />
;this_device<br />
:Stellt die Daten des Devices aus der Backupdatei wieder her, sofern diese in der Backupdatei gefunden werden (gesucht wird hier nach dem Namen des Devices).<br />
;all_devices<br />
:Stellt die Daten aller MSwitch Devices wieder her, sofern diese in der Backupdatei vorhanden sind. Diese Aktion kann einige Zeit in Anspruch nehmen und wird daher im Hintergrund (nonblocking) ausgeführt. Nach Beendigung erfolgt eine Benachrichtigung.<br />
<br />
Die Devices sind nach einem Restore funktionsfähig. Empfohlen wird ein Neustart von FHEM.<br />
<br />
==== get_config ==== <br />
Zeigt die Konfigurationsdatei des MSwitchdevices an; diese kann in dem Fenster editiert werden. Das sollte nur von erfahrenen Usern getan werden! Im Normalfall sollte das Device nur über die Weboberfläche konfiguriert werden und eine falsche Konfiguration kann hier zu einem FHEM Absturz führen.<br />
<br />
==== get_support_info ==== <br />
Öffnet ein Fenster mit einer formatierten Ansicht aller Einstellungen des Devices. Bei Supportanfragen sollte dieses immer mit geposted werden.<br />
<br />
==== get_MSwitch_preconf ====<br />
Lädt vorkonfigurierte MSwitch-Devices. Diese Option ist nur dann vorhanden , wenn das Aktualisieren dieser vorkonfigurierten Devices im FHEM Update aktiviert ist.<br />
<br />
diese kann durch einmaliges Update erfolgen mit:<br />
:<code>update all https://raw.githubusercontent.com/Byte009/MSwitch_Addons/master/controls_mswitchaddons.txt</code><br />
<br />
== Webinterface ==<br />
MSwitch wird im Wesentlichen über das Webinterface eingerichtet. Wählt man das folgende Attribut<br />
:<code>attr <name> MSwitch_Help 1</code><br />
so wird im Modul selber eine sehr umfangreiche Hilfe angezeigt. Über das gesamte Webinterface hinweg erscheinen kleine Fragezeichen, die man anklicken kann und die beschreiben, was in dem jeweiligen Textfeld sinnvollerweise einzugeben ist bzw. was das Modul an dieser Stelle erwartet.<br />
<br />
Das Webinterface besteht aus vier Teilen. Änderungen in jedem Abschnitt müssen in dem jeweiligen Teil bestätigt werden und auch nur diese werden gespeichert. Bevor ein weiterer Teil bearbeitet wird, sollten Änderungen gespeichert werden, sie gehen sonst verloren.<br />
<br />
=== Trigger device/time ===<br />
==== Trigger Device ====<br />
In diesem Feld wird das Device ausgewählt, dessen Events eine Aktion auslösen sollen. Dazu werden alle verfügbaren Devices in einem Dropdownfeld angeboten.<br />
<br />
Zusätzlich gibt es eine Auswahl 'GLOBAL', wenn das Attribut 'MSwitch_Expert' gesetzt ist. Bei Auswahl dieser Option werden '''alle''' von FHEM generierten Events durch das MSwitch Device weiterverarbeitet, eine weitere Begrenzung der aktivierenden Events kann (und sollte) dann in einem folgenden Eingabefeld erfolgen, um die Systemlast zu reduzieren.<br />
<br />
==== Trigger Device Global Whitelist ====<br />
Dieses Feld ist nur verfügbar, wenn als Trigger 'GLOBAL' gewählt wurde.<br />
<br />
Hier kann die Liste eingehender Events weiter eingeschränkt werden. Es handelt sich um eine Whitelist, d.h., wenn es keine Einträge gibt, werden Events aller Devices verarbeitet. Sobald ein oder mehrere Einträge gemacht werden, werden nur noch Events der hier benannten Devices verarbeitet. Als Angabe können hier Devices benannt werden oder ganze DeviceTypen (z.B. TYPE=FS20). Mehrere Angaben sind durch Komma zu trennen.<br />
<br />
[[Datei:MSwitchWebinterface1.png|400px|thumb|right|Webinterface, oben]]<br />
Im gezeigten Beispiel wurde GLOBAL gewählt, weil nicht ein einzelnes Device, sondern eine Kombination aus zwei Geräten auslösen soll. Es werden also alle Ereignisse betrachtet, wobei die Whitelist dann auf die Devices Schlafzimmer (ein Temperaturmessgerät) und Schlafzimmerfenster (ein [[HM-Sec-SCo Tür-Fensterkontakt, optisch|optischer Kontakt]]) einschränkt. <br />
<br />
==== Trigger time ==== <br />
Es besteht die Möglichkeit, das Modul (neben den Events) zu festen Zeiten auszulösen. Dann wären in die leer stehenden Zeilen bei "at" entsprechende Termine einzutragen. Zeitangaben erfolgen durch [STUNDEN:MINUTEN|TAGE], wobei die Tage von 1-7 gezählt werden (1 steht für Montag, 7 für Sonntag usw.). <br />
Mehrere Zeitvorgaben können direkt aneinandergereiht werden.<br />
<br />
Beispielsweise würde [17:00|1][18:30|23] den Trigger montags um 17 Uhr auslösen und dienstags sowie mittwochs um 18:30 Uhr.<br />
Bei [00:10*20:00-21:00] würde der Schaltbefehl von 21 Uhr bis 21 Uhr alle 10 Minuten ausgeführt. Bei [?20:00-21:00] würde der Schaltbefehl zu einem zufälligen Zeitpunkt zwischen 20 und 21 Uhr ausgeführt. [20:00|$we] bedeutet, dass nur am Wochenende um 20:00 geschaltet wird.<br />
<br />
==== Trigger conditions ====<br />
Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfüllt sein müssen.<br />
Diese Bedingungen sind eng an DOIF-Syntax angelehnt. Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich.<br />
<br />
Wird in diesem Feld keine Angabe gemacht, so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.<br />
<br />
;Zeitabhängigkeit<br />
:[19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum<br />
;Readingabhängige Trigger<br />
:[Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Trigger des Device erfolgt nur bei erfüllter Bedingung.<br />
:Werden Readings mit Strings abgefragt (on,off,etc.), ist statt des Gleichheitszeichens "=" der Operator "eq" zu nutzen, der String muss in Anführungszeichen "" gesetzt werden.<br />
;mehrere Beispiele<br />
:[19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
:[19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
:[10:00-11:00|13] - schaltet Montag und Mittwoch zwischen 10 Uhr und 11 Uhr.<br />
:[{ sunset() }-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
:{ !$we } löst den Schaltvorgang nur Werktagen an aus.<br />
:{ $we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus.<br />
<br />
Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (beispielsweise würde dann am Mittwoch noch der Schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
Bedingungen in diesem Feld gelten nur für auslösende Trigger eines Devices und haben keinen Einfluss auf zeitgesteuerte Auslöser.<br />
<br />
=== Trigger details ===<br />
[[Datei:MSwitchWebinterface2.png|600px|thumb|right|Webinterface, Mitte]]<br />
Während im obigen Feld das Device ausgewählt werden konnte, wird hier das Ereignis festgelegt. Das Eingabefeld besteht aus mehreren Einzelfeldern.<br />
<br />
Im abgebildeten Fall wird cmd1 ausgelöst, wenn der Zustand des Schlafzimmerfenster-Sensors meldet, dass das Fenster offen ist. Cmd2 wird ausgelöst, wenn die Temperatur des Schlafzimmersensors unter einen bestimmten Wert fallen wird.<br />
<br />
==== execute 'cmd1/cmd2' ====<br />
Hier kann aus einer vorbelegten Dropdownliste ausgewählt werden, welches ankommende Event den entsprechenden Befehlszweig auslösen soll. In dieser Liste werden bei entsprechender Einstellung alle ankommenden Events eines vorher definierten Devices gespeichert. In einem weiteren Feld (siehe unten) können Events manuell zugefügt werden.<br />
<br />
==== Save incomming events ====<br />
Bei Aktivierung dieser Option werden alle ankommenden Events des oben definierten Devices (oder Global) gespeichert und in entsprechenden Dropdownlisten angeboten.<br />
<br />
Da hier doch erhebliche Datenmengen anfallen können (je nach Device) wird empfohlen, diese Option nach der Konfiguration des Devices zu deaktivieren.<br />
<br />
==== add event ====<br />
hier besteht die Möglichkeit, unabhängig von der Option, ankommende Events automatisch zu speichern, manuell Events anzulegen, die in den Dropdownliste zur Auswahl angeboten werden, ohne das entsprechendes Event erst vom Device geliefert werden muss.<br />
<br />
Es können mehrere Events gleichzeitig eingegeben werden, eine Trennung erfolgt durch " , ".<br />
<br />
Hier ist zu unterscheiden, ob das gewählte triggernde Device ein einfaches Device ist oder ob der Trigger 'GLOBAL' ist.<br />
Bei triggernden Devices können Events in folgendem Formaten zugefügt werden:<br />
<br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- reading:wert (z.b. state:on ) - Aktion erfolgt nur auf das Event "state:on"<br><br />
- reading:* (z.b. state:* ) - Aktion erfolgt auf die Events "state:(on,off,etc.)<br><br />
- reading:(wert1/wert2/wert3) (z.b. state:(left/right) - Aktion erfolgt nur auf Events "state:left" oder "state:right" etc.<br><br />
<br><br />
Falls auf 'GLOBALE' Events getriggert wird, muss das auslösende Device vorangestellt werden:<br><br />
<br><br />
- * - Aktion erfolgt auf alle auftretende Events des entsprechenden Device<br><br />
- device:reading:wert (z.b. device:state:on ) - Aktion erfolgt nur auf das Event "device:state:on"<br><br />
- device:reading:* (z.b. device:state:* ) - Aktion erfolgt auf die Events "device:state:(on,off,etc.)<br><br />
- device:reading:(wert1/wert2/wert3) (z.b. device:state:(left/right) - Aktion erfolgt nur auf Events "device:state:left" oder "devicestate:right" etc.<br><br><br />
<br />
Das Device kann auch hier gegen "*" ersetzt werden (*:state:on). In diesem Fall erfolgt eine Aktion auf alle Events die z.B. "state:on" enthalten, egal welches Device triggert.<br />
<br />
==== test event ====<br />
Dieses Feld wird angeboten, wenn entsprechende vom Triggerdevice gelieferte Events gespeichert wurden.<br />
<br />
Durch Auslösen dieser Funktion wird das Event simuliert und entsprechende definierte Aktionen ausgelöst. Diese Funktion dient ausschließlich zum Testen der eingestellten Konfiguration. Alle entsprechenden Befehle werden ausgeführt, als würde das Event real eintreffen.<br />
<br />
==== apply filter to saved events ====<br />
Beschreibung folgt<br />
<br />
==== clear saved event ====<br />
Es werden alle gespeicherten Events gelöscht.<br />
<br />
Ausnahme: Events, die als Trigger eingestellt sind, bleiben erhalten.<br />
<br />
=== Affected devices ===<br />
[[Datei:MSwitch_Screen_5.png|mini|rechts|affected devices]]<br />
Dieser Abschnitt beinhaltet die Auswahl der Devices, die auf ein Event reagieren sollen.<br />
<br />
In dem Auswahlfeld werden alle Devices angeboten, die eines der folgenden Kriterien erfüllen:<br />
# Die Abfrage "set Device ?" liefert einen Befehlssatz<br />
# Das Attribut 'webcmd' des Devices enthält Einträge<br />
# Das Attribut 'MSwitch_Activate_MSwitchcmds' ist aktiviert und das Attribut 'MSwitchcmds' des betreffenden Devices enthält einen Befehlssatz<br />
<br />
Einzige Ausnahme ist der erste Listeneintrag 'FreeCMD'. Die Auswahl dieses Eintrages bietet später die Möglichkeit Befehle auszuführen, die nicht an ein Device gebunden sind. Der Code in einem FreeCmd kann entweder reiner FHEM-Code sein ( set device on ) oder reiner Perl-Code. Wenn es sich um reinen Perl-Code handelt, ist dieser in geschweifte Klammen zu setzen { Perl-Code }.<br />
<br />
=== Device actions ===<br />
[[Datei:Webinterface3.png|mini|rechts|device_actions]]<br />
Hier stellt man die auszuführenden Aktionen der eingestellten Devices ein. Im ersten Abschnitt oben befindet sich ein FreeCmd, mit dem beliebige Kommandos eingetragen werden können. Im abgebildeten Beispiel ist dies sogar selbst definierter Perl-Code (die Funktion DebianMail sendet eine Mail). <br />
<br />
==== MSwitch cmd1/cmd2: ====<br />
Man wählt den Befehl aus dem betreffenden Device aus. Bei freien Textfeldern (wie im Fall des FreeCmd) wird der Befehl eingegeben.<br />
<br />
Es werden alle verfügbaren Befehle des Devices zur Auswahl angeboten. Je nach Attribut-Einstellungen werden Einträge aus entsprechenden 'webcmds" oder 'MSwitchcmds' einbezogen. In Abhängigkeit des Befehls stehen unter Umständen weitere Felder oder Widgets zur Verfügung.<br />
<br />
05.04.2018 NEU: Auswahlfeld 'MSwitchtoggle' -> Beschreibung wird noch ergänzt !<br />
<br />
==== cmd1/cmd2 condition ====<br />
Mit diesem Feld kann die Ausführung des Befehls von weiteren Bedingungen abhängig gemacht werden. Bei der Abfrage von Readings nach Strings (on, off, etc.) ist statt "=" "eq" zu nutzen und der String muss in "x" gesetzt werden. Es ist auf korrekte Eingabe der Leerzeichen zu achten.<br />
<br />
#Zeitabhängiges schalten: [19:10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum<br />
#Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq "x" - Schaltbefehl erfolgt nur bei erfüllter Bedingung.<br />
<br />
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangabe gemacht werden.<br />
<br />
Beispielsweise würde [10:00-11:00|13] den Schaltvorgang nur Montag und Mittwoch zwischen 10 Uhr und 11 Uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag.<br />
<br />
Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich:<br />
* [19:10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein.<br />
* [19:10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein.<br />
* [{sunset()}-23:00] - von Sonnenuntergang bis 23:00 Uhr.<br />
* { !$we } löst den Schaltvorgang nur Werktagen aus<br />
* { $we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus<br />
<br />
'''Achtung:''' Bei Anwendung der geschweiften Klammern zur Einleitung eines Perl Ausdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten.<br />
<br />
Überschreitet die Zeitangabe die Tagesgrenze (24:00 Uhr), so gelten die angegebenen Tage noch bis zum Ende der angegebenen Schaltzeit (zum Beispiel würde auch am Mittwoch noch der Schaltvorgang erfolgen, wenn als Tagesvorgabe Dienstag gesetzt wurde).<br />
<br />
; $EVENT:<br />
: Die Variable EVENT enthält den auslösenden Trigger, d.h. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen.<br />
<br />
[$EVENT] eq "state:on" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger "state:on" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines Wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*).<br />
<br />
==== cmd1/cmd2 delay ====<br />
Ein Eintrag in diesem Feld führt zur verzögerten Ausführung des Befehls nach Eintreffen des Events. Dabei kann der Befehl ohne weitere Prüfung der Bedingung ausgelöst werden. Es ist aber auch möglich, dass die Bedingung bei Ausführung erneut geprüft wird. Die Zeitangabe muss im Format hh:mm:ss vorliegen.<br />
<br />
Statt einer unmittelbaren Zeitangabe kann hier auch ein Verweis auf ein Reading eines Devices erfolgen :<br><br />
[NAME.reading] des Devices ->z.B. [dummy.state]<br />
<br />
==== add action ====<br />
Mit diesem Button kann ein weiteres Eingabefeld für das entsprechende Device angelegt werden, um z.B. einen weiteren Befehl (ggf.) zeitverzögert auszuführen.<br />
<br />
==== delete this action ====<br />
Mit diesem Button wird der entsprechende Befehl für das Device gelöscht.<br />
<br />
==== check condition ====<br />
[[Datei:MSwitch_Screen_7.png|mini|rechts|check]]<br />
Die angegebenen 'conditions' werden in Zusammenhang mit ggf. ausgewählten Devices auf Syntax und Ergebnis geprüft. Es erfolgt eine Ausgabe des Prüfungsergebnisses.<br />
<br />
==== Repeat und Repeatdelay ====<br />
Man kann mehrfache Wiederholungen erzwingen. Repeat gibt dabei an, wie oft das Kommando wiederholt wird (Anzahl). Repeatdelay gibt an, wie viel Sekunden zwischen einzelnen Wiederholungen liegen sollen.<br />
<br />
== Attribute ==<br />
Folgende Attribute stehen zur Verfügung:<br />
<br />
=== MSwitch_Debug (0:1:2:3:4) ===<br />
0 - Abgeschaltet<br><br />
1 - Schaltet Felder zum testen der Conditionstrings etc. an<br><br />
2 - Alle ausgehenden Befehle werden nur simuliert und nicht ausgeführt. Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
2 - Es erfolgt eine Protokollierung in einer separaten Datei . Diese wird direkt im Device angezeigt<br><br />
4 - erweiterte Debugfunktion (nur für Entwicklung - wechselnde Funktion )<br><br />
<br />
=== MSwitch_Expert (0:1) ===<br />
In der Liste der möglichen Trigger erscheint das Selectfeld 'GLOBAL'. Dieses ermöglicht das Setzen eines Triggers auf alle Events und damit nicht nur auf einzelne Devices. In einem weiteren Feld kann eine weitere Selektion der triggernden Events erfolgen.<br />
<br />
Es stehen weitere Felder 'Repeats' und 'Repeatdelay in sec' zur Verfügung. Eine hier getätigte Einstellung bewirkt X-fache Wiederholung von gesetzten Befehlen im Abstand der gesetzten Sekunden.<br />
<br />
Weiterhin kann über das Auswahlfeld 'priotity' bei jedem 'affectes device' die Reihenfolge beim abarbeiten der Befehle beeinflusst werden.<br />
<br />
=== MSwitch_Sequenz <Suchmuster> ===<br />
In diesem Attribut können ein oder mehrere Suchmuster angegeben werden ,die eine Schaltsequenz darstellen und vom Device erkannt werden.<br />
<br />
Die Angabe muss folgende Syntax haben:<br />
:<code>Device1:reading1:event1 Device1:reading1:event1-2 Device1:reading1:event1-3/..../....</code><br />
<br />
mehrere Suchmuster müssen durch "/" getrennt werden.<br />
<br />
Beispiel:<br />
:<code>Dummy:state:on Dummy:state:off Dummy:state:on</code><br />
<br />
Erkennt das Device dieses Suchmuster in den Schaltvorgängen des Devices (Dummy), wird das Reading "SEQUENCE" auf "match" gesetzt, das Reading "SEQUENCE_NUMBER" auf die Nummer der gefundenen Sequenz, wenn es mehrere Suchmuster gibt. Beide Readings können in den "Conditions" eines Schaltbefehles abgefragt werden.<br />
<br />
=== MSwitch_Sequence_time <Zeit in Sekunden> ===<br />
Beinhaltet die Zeit in Sekunden, die es dauern darf, um eine Sequenz vollständig auszuführen.<br />
<br />
=== MSwitch_Extensions (0:1) ===<br />
Es wird eine zusätzliche Schaltoption 'MSwitchToggle' in den Geräten angeboten. Diese kann genutzt werden, wenn zuschaltende Geräte eine Togglefunktion nicht von Haus aus anbieten.<br />
<br />
Eine Angabe muss in folgendem Format gemacht werden:<br />
:<code>on/off/state/suchmuster1/suchmuster2</code>, wobei die letzten drei Angaben optional sind.<br />
<br />
Funktion: Bei Ausführung des Befehls wird das Gerät 'on' oder 'off' geschaltet (on/off), Voraussetzung ist, dass der 'state' dieses Gerätes auch den 'state on' oder 'off' annimmt. Sollte dieses nicht der Fall sein, so kann mit dem Feld 'state' angegeben werden, in welchem Reading der aktuelle Status vorkommt und wie dieser lautet (suchmuster1/suchmuster2). Dieses 'state' kann mehrere Angaben enthalten, das Vorkommen der Suchmuster ist aber Voraussetzung.<br />
<br />
=== MSwitch_Delete_Delays (0:1) ===<br />
Bewirkt das Löschen aller anstehende Timer (Delays) bei dem Auftreten eines erneuten, passenden Events. Bei der Option '0' bleiben bereits gesetzte Delays aus einem vorherigen, getriggertem Event erhalten und werden ausgeführt.<br />
<br />
Empfohlene Einstellung (1)<br />
<br />
=== MSwitch_Include_Devicecmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz liefern (bei Abfrage set DEVICE ?).<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten.<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Include_Webcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut Webcmd hinterlegt haben. Die in Webcmd hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten.<br />
<br />
Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Activate_MSwitchcmds (0:1) ===<br />
Fügt jedem vorhandenen Device as Attribut 'MSwitchcmd' hinzu.<br />
<br />
=== MSwitch_Include_MSwitchcmds (0:1) ===<br />
Bewirkt die Aufnahme aller Devices in die Auswahlliste 'Affected Devices', die einen eigenen Befehlssatz in dem Attribut MSwitchcmds hinterlegt haben. Die in MSwitchcmds hinterlegten 'Befehle' werden in den Auswahlfeldern angeboten. Bei gesetzter Option (0) werden diese Devices nicht mehr berücksichtigt und somit nicht mehr Angeboten, wenn sie nicht zusätzlich einen eigenen Befehlssatz (set DEVICE ?) liefern.<br />
<br />
Empfohlene Einstellung (0), Einsatz nach Bedarf.<br />
<br />
=== MSwitch_Lock_Quickedit (0:1) ===<br />
Voreinstellung für die Auswahlliste 'Affected Devices'. Bei der Option (1) ist diese voreingestellt gesperrt und kann nur über einen zusätzlichen Button geändert werden. Da es sich hier um ein Feld mit der Möglichkeit einer Mehrfacheingabe handelt handelt ist die Voreinstellung 1, um versehentliche nicht gewünschte Änderungen zu vermeiden (Auswahl einer Option ohne 'Strg' bewirkt das löschen aller bereits gesetzten Optionen).<br />
<br />
Empfohlene Einstellung (1).<br />
<br />
=== MSwitch_Startdelay (0:10:20:30:60) ===<br />
Diese Einstellung beeinflusst den Start von MSwitch nach einem FHEM Start. MSwitch ignoriert für die angegebene Zeit in Sekunden alle eingehenden Events um u.a. Startverzögerungen zu vermeiden. Bei nicht gesetztem Attribut gilt hier eine Zeit von 30 Sekunden. Diese sollte auch nur in Ausnahmefällen bzw. bei besonderem Bedarf geändert werden.<br />
<br />
Empfohlene Einstellung (30).<br />
<br />
=== MSwitch_Ignore_Types ===<br />
Beinhaltet eine Liste von Device''typen'', die in den Auswahllisten ''nicht'' dargestellt werden. Hier ist es sinnvoll, Devicetypen einzutragen, die in aller Regel nicht geschaltet werden oder nicht geschaltet werden können, um die Auswahllisten übersichtlicher zu halten. Einzelne Devicetypen sind durch Leerzeichen zu trennen.<br />
<br />
Voreinstellung: notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul.<br />
<br />
Eine Angabe kann hier in 2 Arten getätigt werden:<br />
# eine Liste von devicetypen.<br />
# Angabe einer devspec z.B. "TYPE=watchdog". Hier ist zu beachten, dass in diesem Fall alle Geräte in die Ignoreliste einbezogen werden, die NICHT der devspec entsprechen. Weiterhin muss die devspec in Anführungszeichen gesetzt werden!<br />
<br />
=== MSwitch_Trigger_Filter ===<br />
Beinhaltet eine Liste von Events, die bei eingehenden Events unberücksichtigt bleiben. Diese werde dann auch nicht gespeichert.<br />
<br />
Hier kann mit Wildcards (*) gearbeitet werden. Einzelne Events sind durch Komma ',' zu trennen.<br />
<br />
Empfohlene Einstellung (keine).<br />
<br />
=== MSwitch_Wait (sec)===<br />
Bei gesetztem Attribut (Zeit in Sekunden) nimmt Das MSwitch Device für den eingestellten Zeitraum keine Befehle mehr entgegen und ignoriert eingehende Events<br />
<br />
=== MSwitch_Event_Id_Distributor ===<br />
Dieses Attribut hat nur dann eine Funktion, wenn auch das Attribut 'MSwitchExpert' auf '1' gesetzt ist.<br />
Hier können verschiedene auslösende Events auf Aktionen mit angegebenen IDs umgeleitet werden.<br />
<br />
Sollte bei den 'trigger details :' in einem Zweig ( cmd1 ) z.B. auf mehrere Events getriggert werden ( regex z.B. state:(on|off) ) so werden für beide Events jeweils der Zweig 'cmd1' - alle Aktionen ohneID - ausgeführt. Durch entsprechende Einträge kann für entsprechende Events auf eine Aktion umgeleitet werden , für die eine ID definierrtt ist. Die Syntax lautet:<br />
:<code>state:on=>cmd1 ID 1,2</code><br />
<br />
Hier werden bei auslösendem Event 'state:on' nur die Aktionen aus cmd1 mit den IDs 1 und 2 ausgeführt. Mehrere Angaben sind durch new Line zu trennen.<br />
<br />
=== MSwitch_Selftrigger_always (0,1)===<br />
(dieses Attribut steht ab Modulversion 2.5 zur Verfügung)<br />
<br />
Die Aktivierung dieses Attributes (1) bewirkt , dass alle SET Aktionen des Devices einen (internen) Event auslösen, auf die das Device selber reagiert. Diese Option kann zusätzlich zu einem vorhandenen Trigger aktiviert werden.<br />
<br />
Diese Events sind lediglich Deviceintern , d.H es werden keine Modulübergreifenden Events ausgelöst.<br />
<br />
Auftretende und auswertbare interne Events haben immer folgendes Format und können darüber augewertet weden.<br />
<br />
MSwitch_Self:aktion:wert <br />
MSwitch_Self:pct:100<br />
<br />
Es werden nur interne Events für set-Aktionen ausgelöst , die im Attribut setlist hinterlegt sind.<br />
<br />
Als weitere Besonderheit unterliegen diese internen Events nicht dem 'wait' Befehl/Attribut<br />
<br />
=== MSwitch_Mode (Notify,Full,Toggle,Dummy)===<br />
Schaltet das Modul zwischen verschiedenen Modi um, mit entsprechend angepasster Weboberfläche.<br />
<br />
==== Notify ====<br />
Das Device kann nicht manuell umgeschaltet werden, es gibt nur zwei ausführbare Zweige (execute 'cmd1' commands und execute 'cmd2' commands). Der Status des Devices wird nicht als 'on' oder 'off' angezeigt, sondern lediglich als 'active'<br />
<br />
Dieser Mode ist am ehesten mit einem Notify zu Vergleichen.<br />
==== Full ====<br />
Es stehen alle Funktionen zur Verfügung.<br />
==== Toggle ====<br />
Sehr vereinfachter Mode. Es stehen keine verschiedenen Zweige zur Verfügung. Hier ist das Device manuell schaltbar und wird bei jedem definierten Event 'Umgeschaltet', entsprechend definierte Befehle für 'cmd1' oder 'cmd2' werden ausgeführt.<br />
==== Dummy====<br />
ACHTUNG: Funktionsänderung mit V2.61<br />
<br />
Der Mode 'Dummy' ist ein eingeschränkter Modus. <br />
Dieser bietet die Funktionalität eines Dummys kombiniert mit der Funktionalität eines Notifys und kann somit die gerne genutzte Kombination Dummy-Notify gegen ein Device ersetzen.<br />
<br />
Achtung: Devices die einmal in dem Modus 'Dummy' gesetzt wurden können nicht wieder in einen anderen Mode geschaltet werden ! <br />
<br />
Der Dummy-Mode kann nur in einem neu angelegtem, leeren MSwitch aktiviert werden. Sobald ein angelegtes MSwitch einmal verändert wurde (modify trigger etc.) ist ein Umschalten nicht mehr möglich und die Option nicht mehr verfügbar.<br />
<br />
=== MSwitch_Condition_Time (0,1)===<br />
In der Grundeinstellung (0) werden für das zeitgesteuerte Schalten keine definierten Conditionen im Feld 'Trigger condition' überprüft, sondern die Schaltbefehle werden in jedem Fall ausgeführt. Mit der Einstellung (1) wird diese Überprüfung auch für zeitgesteuerte Befehle zugeschaltet.<br />
<br />
=== MSwitch_Random_Time (HH:MM:SS-HH:MM:SS)===<br />
Bei Aktivierung wird vor jedem Ausführen eines verzögerten Befehls ( Delay ) eine Zufallszeit generiert, die im Rahme der hier angegebenen Zeitspanne liegt. Auf diese Zufallszahl kann in den Delays zugegriffen werden, durch die Angabe '[random]' statt einer direkten Zeitangabe. Bei nicht gesetztem Attribut ergibt die Angabe von ' [random] ' hier immer '00:00:00'<br />
<br />
=== MSwitch_Random_Number ===<br />
Bei Aktivierung dieses Attributes (der Inhalt kann einen beliebige Zahl sein) werden vom Device 2 Readings angelegt (Device:RandomNr) und (Device:RandomNr1). RandomNr wird vor jedem Ausführen eines Befehls aktualisiert und neu generiert, d.h wenn ein MSwitch Device mehrere Geräte schaltet, wird (auch in einem Durchgang) vor jedem Befehl dieses Reading neu gesetzt. RandomNr1 wird lediglich bei Ausführung des MSwitch Devices einmal neu gesetzt, d.h. nicht vor jedem Befehl der ausgeführt wird.<br />
Die Readings werden mit einer Zufallszahl zwischen 0 und dem hier eingestellten Wert gesetzt.<br />
<br />
Auf diese Readings kann in jeder Condition mit z.B. '[$NAME:ReadingNr1] = 1' zugegriffen werden.<br />
<br />
D.h., das in der Condition angegebene Reading ( [$NAME:ReadingNr1] ) muss in diesem Fall den Wert 1 angenommen haben, ansonsten wird der Befehl nicht ausgeführt. <br />
Der Befehl wird somit nur mit einer Wahrscheinlichkeit von 1 zu ( gesetzter Wert im Attr. ) ausgeführt.<br />
<br />
=== MSwitch_Reset_EVT_CMD1(2)_COUNT ===<br />
Bei Aktivierung dieses Attributes steht in den Readings das Reading 'EVT_CMD1_COUNT' bzw. 'EVT_CMD2_COUNT' zur Verfügung. Dieses kann in den Conditions genutzt werden, um z.B. nur bei jedem x-ten Eintreffen eines auslösenden Events einen Befehl auszuführen. Bei jedem Eintreffen eines gültigen Events werden die Zähler um 1 erhöht (für den jeweiligen Zweig). <br />
Ist hier der Wert '0' eingetragen, wird der Zähler fortlaufend (endlos) erhöht. Wird ein Wert größer 0 eingetragen, wird der Zähler mit Erreichen dieses Wertes automatisch wieder auf Null gesetzt.<br />
<br />
Mit Löschen dieses Attributes werden die entsprechenden Readings ebenfalls gelöscht.<br />
<br />
=== MSwitch_Safemode (0:1)===<br />
Bietet einen (gewissen) Schutz vor falschen Konfigurationen und somit entstehenden Endlosschleifen.<br />
Bei aktiviertem Attribut (1) erkennt das Modul Endlosschleifen eines Devices und beendet diese.<br />
<br />
In diesem Fall erfolgt ein Logeintrag und das Device wird per Attribut auf 'Disabled' gesetzt.<br />
Es wird ein letztes Event generiert, auf das reagiert werden kann:<br />
:<code>2018-05-31 09:39:21 MSwitch <NAME> Safemode: on</code><br />
Im Webinterface erfolgt bei betroffenem Device ein entsprechender Hinweis.<br />
<br />
In der Grundkonfiguration ist dieses Attribut nicht gesetzt, es empfiehlt sich aber, bei neuen (komplizierten) Devices, dieses - zumindest anfänglich - zu aktivieren.<br />
<br />
=== MSwitch_Read_Log(0:1)===<br />
Ermöglicht den Zugriff auf das Logfile als Trigger.<br />
<br />
Hier gibt es mehrere Konfigurationsmöglichkeiten:<br />
* Bei aktiviertem Attribut enthält die Auswahl des Triggerdevices die Option 'LOGFILE'. Bei dieser Auswahl werde alle Logeinträge erkannt und in ein internes Event umgewandelt, auf das regiert werden kann.<br />
* bei aktiviertem Attribut und der Auswahl 'GLOBAL' im 'Trigger_Device' wird auf ALLE Events und alle Logeinträge reagiert.<br />
* bei aktiviertem Attribut und der Auswahl eines bestimmten Devices im 'Trigger_Device' wird auf alle Events und auf alle Logeinträge des gewählten Devices reagiert. Hier ist zu beachten, dass FHEM mir keine Möglichkeit bietet, wirklich herauszufinden, welches Device denn nun einen Logeintrag generiert hat. D.h., dieses wird vom Vorhandensein des Namens im Logeintrag abhängig gemacht und MSwitch reagiert nur dann auf einen Logeintrag, wenn der Name des Devices in diesem Eintrag vorhanden ist.<br />
<br />
=== MSwitch_Help(0:1)===<br />
Schaltet Hilfebuttons zu den einzelnen Eingabefeldern an oder aus.<br />
<br />
=== MSwitch_Comments(0:1)===<br />
Schaltet Kommentarfelder zu den einzelnen 'affected_devices an.<br />
<br />
=== MSwitch_generate_Events(0:1)===<br />
Reduziert bei Einstellung '1' die vom MSwitch-Devices erzeugten Events auf ein absolutes Minimum. Insbesondere bei Verwendung von 'MSwitch_Read_Log' zu empfehlen.<br />
<br />
=== MSwitch_Startdelay ===<br />
Bestimmt die Verzögerungszeit des MSwitches nach FHEM-Start in Sekunden. In diesem Zeitraum reagiert das ??Event??(Red: ist hier "Device" gemeint?) nicht auf Events. Die Vorgabe ist hier zehn Sekunden. Diese wird auch dann angenommen, wenn das Attribut nicht gesetzt ist.<br />
<br />
=== MSwitch_Inforoom ===<br />
Mit diesem Attribut wird die Raumansicht eines mit dem Attribut bestimmten Raumes verändert. Dadurch sollen die wichtigsten Informationen aller MSwitch-Devices auf eine Seite dargestellt werden. Zur Nutzung sollten alle MSwitch-Devices (zusätzlich) in einen Raum sortiert werden und dieser Raum im Attribut eingestellt werden.<br />
<br />
Wichtig: Eine Änderung dieses Attributes bewirkt immer eine Änderung dieses Attributes in ''allen'' MSwitch devices: Es muss nur in einem Device gesetzt oder gelöscht werden um alle Devices zu erfassen.<br />
<br />
<gallery><br />
MSwitch_Screen_1.png|Raumansicht des Raumes MSwitch mit gesetztem Attribut 'MSwitch'<br />
MSwitch_Screen_2.png|Raumansicht des Raumes MSwitch ohne gesetztes Attribut<br />
</gallery><br />
<br />
Es werden folgende Informationen bereitgestellt:<br />
* Infobutton zeigt den im Device gespeicherten Textes des Attributes 'comment'<br />
* Device und Events, die das Device triggern<br />
* Zeiten, zu denen verschiedene Zweige des Devices ausgeführt werden<br />
* Devices, die durch das MSwitch Device geschaltet werden<br />
* State des Devices<br />
<br />
== Integrierte Funktionen ==<br />
<br />
=== Average ===<br />
Folgt<br />
<br />
=== Tendency ===<br />
<br />
Syntax:<br />
[TEND<wert>:<reading>] > <Mindestwert><br />
<br />
Beispiel:<br />
[TEND2:countdown] > 2<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall werden die letzten 4 Werte herangezogen.<br><br />
Paar 1 = Aktueller und letzter Wert, Paar 2 = Die 2 vorherigen Werte.<br><br />
Bei TEND3 werden die letzten 6 Werte zur Paarbildung genutzt.<br />
<br />
Mindestwert:<br />
Der Wertunterschied zwischen den Wertepaaren, der minimal erreicht sein muss, um eine Tendenz zu erkennen.<br />
<br />
Rechenzeichen (><):<br />
Dieses ist hier nicht als Rechenzeichen zu werten, sonder als Tendenz-Anzeige. ( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz).<br />
<br />
Schaltung erfolgt einmalig bei Erkennung der gesuchten Tendenz.<br />
Danach erfolgt keine Schaltung mehr, solange bis eine Tendenz-Umkehr erfolgt ist.<br />
Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenz-Umkehr in gesuchte Richtung.<br />
<br />
=== Difference ===<br />
<br />
Syntax:<br />
[DIFF<wert>:<reading>] > <differenz><br />
<br />
Beispiel:<br />
[DIFF2:countdown] > 0<br />
<br />
Reading:<br />
Entspricht dem getriggerten Reading.<br />
<br />
Wert:<br />
Gespeicherter Wert (in diesem Fall der vorletzte).<br />
<br />
Differenz:<br />
Geforderter Differenz zwischen aktuellem und vorletztem Wert.<br />
<br />
Schaltung erfolg wenn diese Bedingung 'wahr' ist.<br />
<br />
Folgende Readings werden zur Verfügung gestellt:<br />
<br />
DIFFERENCE (true/false) - Schaltbedingung erkannt ja/nein<br />
<br />
DIFFDIRECTION (up/down) - Richtung der erkannten Bedingung (steigend/fallend)<br />
<br />
=== Increase ===<br />
Folgt<br />
<br />
== Tipps, Tricks, Kurzbeispiele ==<br />
Wird stetig ergänzt .<br />
<br />
=== Blinken - Falls nicht im Device vorhanden ===<br />
[[Datei:MSwitch MSwitchblink.png|center|704px]]<br />
<br clear=all><br />
Lässt ein beliebiges Device 5 mal togglen, mit einem Intervall von 0.5 Sekunden (Blinkzeit somit 2,5 Sekunden)<br><br />
Die MSwitchtoggle-Funktion muss per ATTR aktiviert werden.<br><br />
Die Repeatfunktion ist nur im Expertmode verfügbar, auch per ATTR einstellbar.<br />
<br />
=== Linearschalter ===<br />
Umsetzung eines Linearschalters mit MSwitch.<br />
<br />
Eingang: Beliebiges Reading als numerischer Wert.<br />
<br />
Ausgang: Wird entsprechend Linear / oder umgekehrt Linear zum Eingang geschaltet.<br />
<br />
Folgend die Rawdefinition des MSwitchdevices und zweier Dummys (selbsterklärend)<br />
<br />
Alle Devices werden im Raum Lineartest angelegt, die Dummy müssen zuerst angelegt werden.<br />
<br />
<pre>defmod linearausgang dummy<br />
attr linearausgang room Lineartest<br />
attr linearausgang setList state:slider,0,1,100<br />
attr linearausgang webCmd state<br />
setstate linearausgang state 57<br />
setstate linearausgang 2018-06-06 18:06:12 state state 57</pre><br />
<br />
<pre>defmod lineareingang dummy<br />
attr lineareingang room Lineartest<br />
attr lineareingang setList state:slider,0,1,15000<br />
attr lineareingang webCmd state<br />
setstate lineareingang 6422<br />
setstate lineareingang 2018-06-06 18:06:12 state 6422</pre><br />
<br />
<pre>defmod Linearschalter MSwitch lineareingang # linearausgang FreeCmd<br />
attr Linearschalter MSwitch_Debug 0<br />
attr Linearschalter MSwitch_Delete_Delays 1<br />
attr Linearschalter MSwitch_Expert 0<br />
attr Linearschalter MSwitch_Extensions 0<br />
attr Linearschalter MSwitch_Help 0<br />
attr Linearschalter MSwitch_Ignore_Types notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
attr Linearschalter MSwitch_Include_Devicecmds 1<br />
attr Linearschalter MSwitch_Include_MSwitchcmds 0<br />
attr Linearschalter MSwitch_Include_Webcmds 0<br />
attr Linearschalter MSwitch_Inforoom MSwitch<br />
attr Linearschalter MSwitch_Lock_Quickedit 1<br />
attr Linearschalter MSwitch_Mode Notify<br />
attr Linearschalter room Lineartest<br />
<br />
setstate Linearschalter active<br />
setstate Linearschalter 2018-06-06 18:03:50 .Device_Affected FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
setstate Linearschalter 2018-06-06 18:04:35 .Device_Affected_Details FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 );;my $emin=0;;my $emax=15000;;my $amin=100;;my $amax=0;;$eingang = $emin if $eingang < $emin;;$eingang = $emax if $eingang > $emax;;my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin;;readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 );;},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter:to_set],,delay1,delay1,000000,000000,,,0,0<br />
setstate Linearschalter 2018-06-06 18:06:12 .Device_Events no_trigger<br />
setstate Linearschalter 2018-06-04 18:24:21 .First_init done<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_cmd_on *<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_condition <br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_off no_trigger<br />
setstate Linearschalter 2018-06-06 18:00:47 .Trigger_on no_trigger<br />
setstate Linearschalter 2018-06-06 17:58:56 .Trigger_time <br />
setstate Linearschalter 2018-06-04 18:24:21 .V_Check V 0.3<br />
setstate Linearschalter 2018-06-06 18:06:12 EVENT state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTFULL lineareingang:state: 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART1 lineareingang<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART2 state<br />
setstate Linearschalter 2018-06-06 18:06:12 EVTPART3 6422<br />
setstate Linearschalter 2018-06-06 18:06:12 Exec_cmd set linearausgang state [Linearschalter:to_set]<br />
setstate Linearschalter 2018-06-06 17:58:56 Trigger_device lineareingang<br />
setstate Linearschalter 2018-06-06 18:00:47 Trigger_log off<br />
setstate Linearschalter 2018-06-06 18:06:12 last_event state: 6422<br />
setstate Linearschalter 2018-06-04 18:39:56 state active<br />
setstate Linearschalter 2018-06-06 18:06:12 to_set 57</pre><br />
<br />
MSwitch -Configfile (bei Bedarf)<br />
<pre>#V V1.54<br />
#S .Device_Affected -> FreeCmd-AbsCmd1,FreeCmd-AbsCmd2,linearausgang-AbsCmd1<br />
#S .Device_Affected_Details -> FreeCmd-AbsCmd1,cmd,cmd,{my $eingang =ReadingsVal( "lineareingang"## "state"## 0 )[S]my $emin=0[S]my $emax=15000[S]my $amin=100[S]my $amax=0[S]$eingang = $emin if $eingang < $emin[S]$eingang = $emax if $eingang > $emax[S]my $y= (($amax-$amin)/($emax-$emin)*($eingang-$emin))+$amin[S]readingsSingleUpdate( $hash## "to_set"## int ($y)## 1 )[S]},,delay1,delay1,000000,000000,,,0,0|FreeCmd-AbsCmd2,cmd,cmd,,,delay1,delay1,000000,000000,,,0,0|linearausgang-AbsCmd1,state,no_action,[Linearschalter.to_set],,delay1,delay1,000000,000000,,,0,0<br />
#S .Device_Events -> no_trigger<br />
#S .First_init -> done<br />
#S .Trigger_Whitelist -> undef<br />
#S .Trigger_cmd_off -> no_trigger<br />
#S .Trigger_cmd_on -> *<br />
#S .Trigger_condition -> <br />
#S .Trigger_off -> no_trigger<br />
#S .Trigger_on -> no_trigger<br />
#S .Trigger_time -> <br />
#S .V_Check -> V 0.3<br />
#S Trigger_device -> lineareingang<br />
#S Trigger_log -> off<br />
#S last_event -> state: 6422<br />
#S state -> active<br />
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul<br />
#A MSwitch_Include_MSwitchcmds -> 0<br />
#A MSwitch_Debug -> 0<br />
#A MSwitch_Help -> 0<br />
#A MSwitch_Include_Devicecmds -> 1<br />
#A MSwitch_Extensions -> 0<br />
#A MSwitch_Include_Webcmds -> 0<br />
#A room -> Lineartest<br />
#A MSwitch_Inforoom -> MSwitch<br />
#A MSwitch_Expert -> 0<br />
#A MSwitch_Lock_Quickedit -<br />
</pre><br />
<br />
== Links ==<br />
* Thread über das Modul im {{Link2Forum|Topic=86199|LinkText=FHEM Forum}}<br />
* {{Link2Forum|Topic=100119|Message=936495|LinkText=Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden}}<br />
* {{Link2Forum|Topic=86199|Message=930133|LinkText=Schalten von vier Kanälen mit einem MSwitch-Device}}<br />
* {{Link2Forum|Topic=99219|Message=926652|LinkText=Batterie-Überwachung. 1xTäglich per Telegram senden}}<br />
* {{Link2Forum|Topic=101091|Message=945389|LinkText=Licht (Alarm) in einem bestimmten Zeitraum schalten}}<br />
* {{Link2Forum|Topic=100949|Message=944284|LinkText=Über Dummy-Schalter ein Timer (EIN/AUS) aktivieren}}<br />
* {{Link2Forum|Topic=103083|Message=967710|LinkText=Ladezeit von Akku ermitteln u. Steckdose entsprechend schalten}}</div>Maista