<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pula</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pula"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Pula"/>
	<updated>2026-04-11T02:17:53Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=24590</id>
		<title>FHEM Tablet UI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&amp;diff=24590"/>
		<updated>2018-01-17T23:35:33Z</updated>

		<summary type="html">&lt;p&gt;Pula: neues widget todoist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Oberfläche für FHEM&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModFTopic=34233&lt;br /&gt;
|ModForumArea=Frontends&lt;br /&gt;
|ModTechName=n.a.&lt;br /&gt;
|ModOwner=setstate ({{Link2FU|7023|Forum}})&lt;br /&gt;
}}&lt;br /&gt;
[[FHEM Tablet UI]] (FTUI) ist ein leichtgewichtiges aber funktionsreiches Frontend-Framework zum Steuern und Überwachen von in FHEM integrierten Geräten. Es basiert auf HTML/CSS/JavaScript und stellt somit keine zusätzlichen Anforderungen an den FHEM-Server.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe zahlreicher Widgets, die sehr leicht mit HTML Code konfiguriert werden können, ist es möglich, innerhalb kurzer Zeit ein den eigenen Wünschen entsprechendes User-Interface aufzubauen.&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb ist nur eine FHEM-Installation mit [[HTTPSRV|HTTPSRV-Modul]] sowie ein gängiger Webbrowser notwendig.&lt;br /&gt;
&lt;br /&gt;
Mit wenigen Anpassungen ist es auch möglich das UI auf anderen Webservern (Apache, u.a.) zu betreiben. Somit können FHEM und FHEM Tablet UI auch auf getrennten Systemen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
[[File:tablet_ui.png|thumb|500px|center|Beispiel für ein mit [[FHEM Tablet UI]] erstelltes User-Interface]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|Design-Möglichkeiten erklären, Navigationsmethoden ausformulieren}} &lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Die Installation von FHEM Tablet UI erzeugt keinen großen Aufwand und besteht im Großen und Ganzen aus drei Schritten:&lt;br /&gt;
*Dateien aus dem GitHub-Repository herunterladen&lt;br /&gt;
*FHEM konfigurieren ([[HTTPSRV]]-Device erstellen, [[FHEMWEB]]-Attribut longpoll einstellen)&lt;br /&gt;
*Eine Beispieldatei anlegen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Hinweis|Diese Anleitung geht davon aus, dass FHEM unter Debian nach der Anleitung [https://debian.fhem.de Stable build using apt] installiert wurde.&lt;br /&gt;
Ist dies nicht der Fall, muss der Pfad &#039;&#039;&#039;/opt/fhem&#039;&#039;&#039; dementsprechend angepasst werden.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Zuerst müssen alle Dateien von FHEM Tablet UI in das FHEM-Verzeichnis &#039;&#039;&#039;/opt/fhem/www&#039;&#039;&#039; kopiert werden. Das geht mit folgendem &#039;&#039;&#039;update&#039;&#039;&#039;-Befehl über die FHEM-Befehlszeile.&lt;br /&gt;
:&amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Datei:FTUI_Installation_01.png|thumb|none|Schritt 1: Dateien kopieren]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Anschließend ist ein neues [[HTTPSRV]]-Device in FHEM anzulegen, welches auf den Ordner mit den gerade heruntergeladenen Dateien verweist.&lt;br /&gt;
:&amp;lt;code&amp;gt;define TABLETUI HTTPSRV ftui/ ./www/tablet/ Tablet-UI&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Datei:FTUI_Installation_02.png|thumb|none|Schritt 2: HTTPSRV-Device anlegen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; Damit FHEM Tablet UI mit FHEM kommunizieren kann, ist noch die &#039;&#039;&#039;longpoll&#039;&#039;&#039;-Einstellung im [[FHEMWEB]] Device festzulegen.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WEB longpoll websocket&amp;lt;/code&amp;gt;&lt;br /&gt;
:bzw. bei Problemen mit &#039;&#039;websocket&#039;&#039;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr WEB longpoll 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Datei:FTUI_Installation_03.png|thumb|none|Schritt 3: longpoll einstellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; Weil FTUI noch nichts anzuzeigen hat, wird die Datei &#039;&#039;&#039;/opt/fhem/www/tablet/index-example.html&#039;&#039;&#039; nach &#039;&#039;&#039;/opt/fhem/www/tablet/index.html&#039;&#039;&#039; kopiert.&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo cp -a /opt/fhem/www/tablet/index-example.html /opt/fhem/www/tablet/index.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[Datei:FTUI_Installation_04.png|thumb|none|Schritt 4: index.html erstellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; Abschließend muss FHEM noch &#039;&#039;&#039;neu gestartet&#039;&#039;&#039; werden (&#039;&#039;shutdown restart&#039;&#039;) da das Attribut &#039;&#039;&#039;longpoll&#039;&#039;&#039; geändert wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit ist FHEM Tablet UI bereit zur Verwendung und kann durch Aufruf der URL &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;http://&amp;lt;fhem-server&amp;gt;:8083/fhem/ftui&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039; oder den Link im FHEM-Menü geöffnet werden&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Ein Update von FTUI kann ebenfalls über die FHEM-Kommandozeile erfolgen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Update der geänderten Dateien durch Eingabe von:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine weitere Option ist das Hinzufügen des FTUI-Git-Repositories zum allgemeinem Update-Vorgang von FHEM. Dabei wird dann bei einem FHEM-Update auch gleich FHEM Tablet UI aktualisiert, bzw. die Änderungen angezeigt.&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
===DOCTYPE===&lt;br /&gt;
In allen HTML-Dateien, die im Browser geladen werden und das typische HTML-Gerüst besitzen (also alle Hauptseiten, jedoch keine Template-Dateien), sollte eine &#039;&#039;Document Type Declaration&#039;&#039; (DTDT) eingefügt werden. Mit ihr wird festgelegt, welche &#039;&#039;Document Type Definition&#039;&#039; hier verwendet wird (das kommt aus der Metasprache XML), konkret also, in welcher Version der nachfolgende HTML-Code vom Browser interpretiert werden soll. Lässt man die DTDT weg, oder definiert sie auf verschiedenen Seiten unterschiedlich, kann ein und der selbe HTML-Code zu unterschiedlichen Darstellungen führen. Die DTDT erfolgt immer auf der ersten Zeile, noch vor dem &amp;lt;code&amp;gt;&amp;lt;html&amp;gt;&amp;lt;/code&amp;gt;-Tag. Nachfolgend wird HTML5 verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;...&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===META-Parameter===&lt;br /&gt;
Das Tablet UI lässt sich über die META-Parameter konfigurieren. Diese Parameter sind in jeder &#039;&#039;&#039;.html&#039;&#039;&#039; Datei (z.B. index.html) im Abschnitt &#039;&#039;&#039;&amp;lt;head&amp;gt;&#039;&#039;&#039; einzutragen. Ausgenommen davon sind Dateien, die als Template, Pagebutton-Zielseiten oder ähnliches eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
Die Parameter sind immer nach diesem Schema aufgebaut:&lt;br /&gt;
 &amp;lt;meta name=&amp;quot;[Parameter-Name]&amp;quot; content=&amp;quot;[Parameter-Wert]&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verbindung zu FHEM===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Parameter-Name!!Standard-Wert!!Mögliche Werte!!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|web_device||WEB||String||FHEM-Device, welches für das Polling verwendet wird&lt;br /&gt;
|-&lt;br /&gt;
|longpoll||1||0, 1||&lt;br /&gt;
&#039;&#039;&#039;0&#039;&#039;&#039;: Longpoll deaktiviert; alle 30s ein Shortpoll (Neuladen der gesamten Statusänderungen)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1&#039;&#039;&#039;: Longpoll aktiv; geänderte Stati werden sofort aktualisiert, zusätzlich werden alle 15min die gesamten Statusänderungen geladen.&lt;br /&gt;
|-&lt;br /&gt;
|longpoll_type||websocket||websocket, ajax, 0||&lt;br /&gt;
&#039;&#039;&#039;websocket&#039;&#039;&#039;: Für die Aktualisierung der Daten wird das Websocket-Protokoll verwendet. Werden vom Browser keine Websockets unterstützt, gibt es einen automatischen Fallback auf Ajax.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ajax&#039;&#039;&#039;: Ajax wird für die Aktualisierung verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0&#039;&#039;&#039;: Longpoll deaktiviert, Shortpoll wird verwendet.&lt;br /&gt;
|-&lt;br /&gt;
|longpoll_filter||.*||RegEx||Event-Filter. Kann verwendet werden, wenn z.B. Devices, die in FTUI angezeigt werden, in einem eigenen FHEM-Room sind.&lt;br /&gt;
|-&lt;br /&gt;
|longpoll_maxage||240||Integer||Kommen in diesem Zeitraum (Sekunden) keine Longpoll-Events bei FTUI an, wird die Verbindung als &amp;quot;disconnected&amp;quot; angesehen und ein neuer Verbindungsversuch wird gestartet.&lt;br /&gt;
|-&lt;br /&gt;
|shortpoll_interval||900||Integer||Zeitraum in Sekunden, nach dem ein vollständiger Refresh stattfindet&lt;br /&gt;
|-&lt;br /&gt;
|shortpoll_only_interval||30||Integer||Zeitraum in Sekunden, nach dem ein vollständiger Refresh stattfindet, sollte Longpoll deaktiviert sein&lt;br /&gt;
|-&lt;br /&gt;
|fhemweb_url||/fhem/||Integer||URL zu FHEM. Wird benötigt wenn FTUI auf einem anderen als dem FHEM Server läuft oder nicht im Standard-Pfad installiert ist. &lt;br /&gt;
Hinweis: Wenn FHEM auf einem anderem Server/Domain läuft muss man das &amp;quot;CORS&amp;quot; Attribut im FHEMWEB Modul (s.o.) auf 1 setzen, sonst bekommt man Cross Origin Fehler. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Funktionalität===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Parameter-Name!!Standard-Wert!!Mögliche Werte!!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|debug||0||0 - 5||Log-Level&lt;br /&gt;
|-&lt;br /&gt;
|toast||5||Integer||Anzahl an gleichzeitig angezeigten Toast-Nachrichten. Um keine anzuzeigen, ist der Wert auf 0 zu setzen.&lt;br /&gt;
|-&lt;br /&gt;
|toast_position||bottom-left||||Position im Browserfenster, wo die Toast-Nachrichten angezeigt werden.&lt;br /&gt;
|-&lt;br /&gt;
|lang||de||de||Sprache der Oberfläche (für z.B. Datums-/Zeitfunktionen)&lt;br /&gt;
|-&lt;br /&gt;
|username||||String||Benutzername für eine Basic-Authentifierung *&lt;br /&gt;
|-&lt;br /&gt;
|password||||String||Passwort für eine Basic-Authentifizierung *&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;*&#039;&#039;&#039; Derzeit wird die Basic-Authentifizierung in Kombination mit WebSockets nicht unterstützt. Die Verwendung von &#039;&#039;&#039;longpoll=1&#039;&#039;&#039; (ajax) ist daher notwendig.&lt;br /&gt;
&lt;br /&gt;
===Toast-Nachrichten===&lt;br /&gt;
[[Datei:Ftui_toast.png|thumb|Toast-Nachrichten]]&lt;br /&gt;
Tablet-UI liefert Informationen darüber, was im Moment gerade passiert. Das geschieht über Toast-Nachrichten, die in der Standardeinstellung unten links im Browser auftauchen.&lt;br /&gt;
&lt;br /&gt;
Wird beispielsweise ein Gerät eingeschaltet, so erscheint eine kleine Nachricht mit dem abgesetzten Befehl. Auch Fehlermeldungen und Statusinformationen werden angezeigt. Ob überhaupt und was konkret angezeigt wird, richtet sich nach dem eingestellten Debug-Level (siehe oben). Beim Debug-Level 5 werden alle Nachrichten angezeigt, bei 0 keine.&lt;br /&gt;
&lt;br /&gt;
Die Position der Toast-Nachrichten kann über den Meta-Tag &amp;lt;code&amp;gt;meta name=&#039;toast_position&#039;&amp;lt;/code&amp;gt; festgelegt werden. Für oben-mittig müsste folgender Code eingefügt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;meta name=&#039;toast_position&#039; content=&#039;top-center&#039;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möglich sind folgende Positionen:&lt;br /&gt;
* &amp;lt;code&amp;gt;top-left&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;top-right&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bottom-left&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bottom-right&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;top-center&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bottom-center&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mid-center&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die maximale Anzahl an Nachrichten, die gleichzeitig angezeigt werden können, lässt sich mit &amp;lt;code&amp;gt;meta name=&#039;toast&#039;&amp;lt;/code&amp;gt; Sind maximal 2 Nachrichten gewünscht, muss folgender Meta-Tag gesetzt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;meta name=&#039;toast&#039; content=&#039;2&#039;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Navigationsmethoden==&lt;br /&gt;
{{Todo|Dieser Abschnitt dient derzeit lediglich als Sammlung von Stichpunkten und muss vollständig überarbeitet werden.}} &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterschied zwischen Pagetab und Pagebutton:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pagetab:&#039;&#039;&#039; Ganze Seite austauschen -&amp;gt; Menü muss auf jede Seite&lt;br /&gt;
[[FTUI_Widget_Pagetab]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pagebutton:&#039;&#039;&#039; Teil der Seite austauschen -&amp;gt; Menü nur in erster Seite&lt;br /&gt;
[[FTUI_Widget_Pagebutton]]&lt;br /&gt;
&lt;br /&gt;
==Gestaltung==&lt;br /&gt;
===Layout-Optionen===&lt;br /&gt;
* [[FTUI Layout Gridster|Gridster]]&lt;br /&gt;
* [[FTUI Layout Flex|Flex]]&lt;br /&gt;
* [[FTUI Layout Sheet|Tabelle]]&lt;br /&gt;
* [[FTUI Layout Row|Reihen]]&lt;br /&gt;
&lt;br /&gt;
=== Farben ===&lt;br /&gt;
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form, als RGB-Wert oder mit dem Farbnamen anzugeben. Zum Beispiel: &lt;br /&gt;
&lt;br /&gt;
*HEX: #ADD8E6&lt;br /&gt;
*RBG: rgb(173, 216, 230)&lt;br /&gt;
*Namen: lightblue&lt;br /&gt;
&lt;br /&gt;
Knallige Farben wie &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: #ff0000;&amp;quot;&amp;gt;#ff0000&amp;lt;/span&amp;gt;&#039;&#039;&#039; für Rot oder &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color: #00ff00;&amp;quot;&amp;gt;#00ff00&amp;lt;/span&amp;gt;&#039;&#039;&#039; für Grün sollten vermieden werden.&lt;br /&gt;
Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.&lt;br /&gt;
&lt;br /&gt;
Empfohlene Farben sind z.B.:&lt;br /&gt;
&lt;br /&gt;
*Orange: &amp;lt;span style=&amp;quot;color: #aa6900;&amp;quot;&amp;gt;#aa6900&amp;lt;/span&amp;gt;&lt;br /&gt;
*Rot: &amp;lt;span style=&amp;quot;color: #ad3333;&amp;quot;&amp;gt;#ad3333&amp;lt;/span&amp;gt;&lt;br /&gt;
*Grün: &amp;lt;span style=&amp;quot;color: #32a054;&amp;quot;&amp;gt;#32a054&amp;lt;/span&amp;gt;&lt;br /&gt;
*Blau: &amp;lt;span style=&amp;quot;color: #6699FF;&amp;quot;&amp;gt;#6699FF&amp;lt;/span&amp;gt;&lt;br /&gt;
*Grau: &amp;lt;span style=&amp;quot;color: #8C8C8C;&amp;quot;&amp;gt;#8C8C8C&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hilfreich bei der Suche nach den Farbwerten ist zum Beispiel der Color-Picker auf dieser Seite: http://www.colorpicker.com. Für die Suche nach Farben, die einen guten Kontrast bilden, diese Webseite: http://vanisoft.pl/~lopuszanski/public/colors/&lt;br /&gt;
&lt;br /&gt;
Im Ordner &#039;&#039;css&#039;&#039; der FTUI Installation finden sich einige vorbereitete Farbschemas. Diese können mit einem zusätzlichen Eintrag im &amp;lt;nowiki&amp;gt;&amp;lt;head&amp;gt;&amp;lt;/nowiki&amp;gt;-Bereich der FTUI-Seite(n) aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
Hier am Beispiel eines blauen Farbschemas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
   [...]&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/fhem/tablet/css/fhem-blue-ui.css&amp;quot; /&amp;gt;&lt;br /&gt;
   [...]&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Schema-Dateien ändern alle Widgets. Einzelne Widgets können durch Hinzufügen der jeweiligen [[#CSS-Klassen|CSS-Klasse]] geändert werden.&lt;br /&gt;
&lt;br /&gt;
===CSS-Styles===&lt;br /&gt;
Das Layout und das Aussehen des UI kann durch diverse vorgegebene CSS-Klassen beeinflusst werden. Die verfügbaren Klassen sind im Abschnitt [[#CSS-Klassen|CSS-Klassen]] aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Soll das Aussehen des UI durch eigene CSS-Klassen oder durch Überschreiben der vorhandenen verändert werden, kann eine eigene CSS-Datei erstellt werden, die dann bei einem eventuellen Update von FTUI nicht überschrieben wird. Diese Datei muss den Dateinamen &#039;&#039;&#039;fhem-tablet-ui-user.css&#039;&#039;&#039; haben und im Ordner &#039;&#039;&#039;/fhem/tablet/css&#039;&#039;&#039; abgelegt werden. Sie wird dann beim Aufruf von FTUI automatisch mitgeladen.&lt;br /&gt;
&lt;br /&gt;
=== CSS-Klassen ===&lt;br /&gt;
Nicht alle Widgets unterstützen alle hier angegebenen Klassen. Welche genau unterstützt werden, kann auf der jeweiligen Widget-Seite nachgelesen werden.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|sheet/row/cell-Layout&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|sheet}}{{FTUI Klasse|row}}{{FTUI Klasse|cell}}{{FTUI Klasse|cell-1-x}}{{FTUI Klasse|cell-x}}{{FTUI Klasse|left-align}}{{FTUI Klasse|right-align}}{{FTUI Klasse|bottom-align}}{{FTUI Klasse|top-align}}{{FTUI Klasse|center-align}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|row/col-Layout&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|col}}{{FTUI Klasse|col-1-x}}{{FTUI Klasse|col-x}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|hbox/vbox-Layout&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|vbox}}{{FTUI Klasse|hbox}}{{FTUI Klasse|card}}{{FTUI Klasse|phone-width}}{{FTUI Klasse|full-height}}{{FTUI Klasse|full-width}}{{FTUI Klasse|grow-0}}{{FTUI Klasse|grow-1}}{{FTUI Klasse|grow-2}}{{FTUI Klasse|grow-x}}{{FTUI Klasse|items-top}}{{FTUI Klasse|items-center}}{{FTUI Klasse|items-bottom}}{{FTUI Klasse|items-space-between}}{{FTUI Klasse|items-space-around}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|Generelle Klassen für die Positionierung&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|inline}}{{FTUI Klasse|newline}}{{FTUI Klasse|top-space}}{{FTUI Klasse|top-space-2x}}{{FTUI Klasse|top-space-3x}}{{FTUI Klasse|left-space}}{{FTUI Klasse|left-space-2x}}{{FTUI Klasse|left-space-3x}}{{FTUI Klasse|right-space}}{{FTUI Klasse|right-space-2x}}{{FTUI Klasse|right-space-3x}}{{FTUI Klasse|top-narrow}}{{FTUI Klasse|top-narrow-2x}}{{FTUI Klasse|top-narrow-10}}{{FTUI Klasse|left-narrow}}{{FTUI Klasse|left-narrow-2x}}{{FTUI Klasse|left-narrow-3x}}{{FTUI Klasse|right-narrow}}{{FTUI Klasse|right-narrow-2x}}{{FTUI Klasse|right-narrow-3x}}{{FTUI Klasse|centered}}{{FTUI Klasse|wider}}{{FTUI Klasse|narrow}}{{FTUI Klasse|fullsize}}{{FTUI Klasse|compressed}}{{FTUI Klasse|height-narrow}}{{FTUI Klasse|w1x}}{{FTUI Klasse|w2x}}{{FTUI Klasse|w3x}}{{FTUI Klasse|maxw40}}{{FTUI Klasse|doublebox-v}}{{FTUI Klasse|doublebox-h}}{{FTUI Klasse|triplebox-v}}{{FTUI Klasse|right}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|Vordergrundfarben&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|red}}{{FTUI Klasse|green}}{{FTUI Klasse|blue}}{{FTUI Klasse|lightblue}}{{FTUI Klasse|orange}}{{FTUI Klasse|gray}}{{FTUI Klasse|lightgray}}{{FTUI Klasse|white}}{{FTUI Klasse|black}}{{FTUI Klasse|mint}}{{FTUI Klasse|yellow}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|Hintergrundfarben&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|bg-red}}{{FTUI Klasse|bg-green}}{{FTUI Klasse|bg-blue}}{{FTUI Klasse|bg-lightblue}}{{FTUI Klasse|bg-orange}}{{FTUI Klasse|bg-gray}}{{FTUI Klasse|bg-lightgray}}{{FTUI Klasse|bg-white}}{{FTUI Klasse|bg-black}}{{FTUI Klasse|bg-mint}}{{FTUI Klasse|bg-yellow}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|Rahmen&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|verticalLine}}{{FTUI Klasse|border-black}}{{FTUI Klasse|border-white}}{{FTUI Klasse|border-orange}}{{FTUI Klasse|border-red}}{{FTUI Klasse|border-green}}{{FTUI Klasse|border-mint}}{{FTUI Klasse|border-lightblue}}{{FTUI Klasse|border-blue}}{{FTUI Klasse|border-gray}}{{FTUI Klasse|border-yellow}}{{FTUI Klasse|border-lightgray}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|Größen&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|mini}}{{FTUI Klasse|tiny}}{{FTUI Klasse|small}}{{FTUI Klasse|normal}}{{FTUI Klasse|large}}{{FTUI Klasse|big}}{{FTUI Klasse|bigger}}{{FTUI Klasse|tall}}{{FTUI Klasse|great}}{{FTUI Klasse|grande}}{{FTUI Klasse|gigantic}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|Schriftstil&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|thin}}{{FTUI Klasse|bold}}{{FTUI Klasse|darker}}{{FTUI Klasse|truncate}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|Sonstiges&lt;br /&gt;
|-&lt;br /&gt;
!class=&amp;quot;mw-collapsible-content&amp;quot;|Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|blank}}{{FTUI Klasse|transparent}}{{FTUI Klasse|half-transparent}}{{FTUI Klasse|blurry}}{{FTUI Klasse|shake}}{{FTUI Klasse|fail-shake}}{{FTUI Klasse|marquee}}{{FTUI Klasse|icon round}}{{FTUI Klasse|icon square}}{{FTUI Klasse|readonly}}{{FTUI Klasse|blink}}{{FTUI Klasse|rotate-90}}{{FTUI Klasse|horizontal}}{{FTUI Klasse|circleborder}}{{FTUI Klasse|autohide}}{{FTUI Klasse|notransmit}}{{FTUI Klasse|tab}}{{FTUI Klasse|FS20}}{{FTUI Klasse|value}}{{FTUI Klasse|novalue}}{{FTUI Klasse|timestamp}}{{FTUI Klasse|percent}}{{FTUI Klasse|nocache}}{{FTUI Klasse|fade}}{{FTUI Klasse|rotate}}{{FTUI Klasse|nolabels}}{{FTUI Klasse|default}}{{FTUI Klasse|prefetch}}{{FTUI Klasse|circulate}}{{FTUI Klasse|valueonly}}{{FTUI Klasse|positiononly}}{{FTUI Klasse|lineIndicator}}{{FTUI Klasse|barIndicator}}{{FTUI Klasse|roundIndicator}}{{FTUI Klasse|dim-tick}}{{FTUI Klasse|dim-front}}{{FTUI Klasse|dim-back}}{{FTUI Klasse|hue-tick}}{{FTUI Klasse|hue-front}}{{FTUI Klasse|hue-back}}{{FTUI Klasse|warn}}{{FTUI Klasse|activate}}{{FTUI Klasse|labelright}}{{FTUI Klasse|interlock}}{{FTUI Klasse|keepopen}}{{FTUI Klasse|noshade}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
FTUI bringt einige Icons-&amp;quot;Schriftarten&amp;quot; mit, die für die Darstellung genützt werden können. Diese werden automatisch beim Start des UI eingebunden, sobald ein entsprechendes Icon-Präfix im Code der Seite vorkommt.&lt;br /&gt;
&lt;br /&gt;
Verfügbare Icon-Schriftarten sind:&lt;br /&gt;
* Eingebaute Icons &#039;&#039;ftui-windows&#039;&#039; und &#039;&#039;ftui-door&#039;&#039;. Präfix &#039;&#039;&#039;ftui-&#039;&#039;&#039;. Beispiel: &amp;lt;code&amp;gt;data-icon=&amp;quot;ftui-door&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* [http://fontawesome.io/icons/ Font-Awesome]: Mehr als 500 Icons zur Auswahl. Präfix &#039;&#039;&#039;fa-&#039;&#039;&#039;. Beispiel: &amp;lt;code&amp;gt;data-icon=&amp;quot;fa-volume-up&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://material.io/icons/ Material Icons]: Mehr als 900 Icons zur Auswahl. Präfix &#039;&#039;&#039;mi-&#039;&#039;&#039;. Beispiel: &amp;lt;code&amp;gt;data-icon=&amp;quot;mi-local_gas_station&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* FHEM und OpenAutomation Icons: Präfix &#039;&#039;&#039;fs-&#039;&#039;&#039; und &#039;&#039;&#039;oa-&#039;&#039;&#039;. Beispiel: &amp;lt;code&amp;gt;data-icon=&amp;quot;oa-secur_locked&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://erikflowers.github.io/weather-icons/ Weather-Icons]: Präfix &#039;&#039;&#039;wi-&#039;&#039;&#039;. Beispiel: &amp;lt;code&amp;gt;data-icon=&amp;quot;wi-day-rain-mix&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ können auch Bilder Icons (bspw. png) über CSS verwendet werden. Bspw:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
        .logo-fhem {&lt;br /&gt;
            background: url(https://wiki.fhem.de/fhemlogo.png) no-repeat;&lt;br /&gt;
            width: 120px;&lt;br /&gt;
            height: 132px;&lt;br /&gt;
            background-size: contain;&lt;br /&gt;
        }&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;symbol&amp;quot; data-icon=&amp;quot;logo-fhem&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Widgets ==&lt;br /&gt;
===Allgemeine Attribute===&lt;br /&gt;
Jedes Widget kann über verschiedene Attribute konfiguriert werden. Folgende Attribute gelten für alle Widgets:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+allgemeine Attribute&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-type&lt;br /&gt;
|Widget-Typ&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-device&lt;br /&gt;
|FHEM-Name des Gerätes (mit dem Befehl &#039;list&#039; bekommt man im FHEM die kpl. Liste)&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |class&lt;br /&gt;
|CSS-Klassen für Aussehen und Formatierung des Widgets&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Daten Empfangen&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get&lt;br /&gt;
|Reading Name&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-on&lt;br /&gt;
|Wert für den Status on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-get-off&lt;br /&gt;
|Wert für den Status off&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Daten Senden&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set&lt;br /&gt;
|Reading Name&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-on&lt;br /&gt;
|Wert für den Status on&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |data-set-off&lt;br /&gt;
|Wert für den Status off&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Widget-spezifische Attribute können auf der jeweiligen Widget-Seite nachgelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== Integrierte Widgets ===&lt;br /&gt;
Folgende Widgets sind direkt in FHEM Tablet UI integriert und können &amp;quot;out of the box&amp;quot; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
* [[FTUI Widget Button|button]]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen FHEM-Befehl absetzen kann&lt;br /&gt;
* [[FTUI Widget Checkbox|checkbox]]: Umschalter zwischen zwei definierten Zuständen&lt;br /&gt;
* [[FTUI Widget Circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des &#039;circle&#039; im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden &lt;br /&gt;
* [[FTUI Widget Clock|clock]]: Stellt eine einfach Uhr zur Verfügung&lt;br /&gt;
* [[FTUI Widget Colorwheel|colorwheel]]: Farbpalette zur Auswahl von Farben&lt;br /&gt;
* [[FTUI Widget Controlbutton|controlbutton]]: iOS-ähnlicher Button zum Schalten zwischen zwei Zuständen (z.B. on / off)&lt;br /&gt;
* [[FTUI Widget Controller|controller]]: iOS-ähnlicher vertikaler Schieberegler zum Einstellen eines Wertes&lt;br /&gt;
* [[FTUI Widget Datetimepicker|datetimepicker]]: Erstellt eine Auswahl für Datum/Uhrzeit&lt;br /&gt;
* [[FTUI Widget Departure|departure]]: Abfahrtszeiten öffentlicher Verkehrsmittel&lt;br /&gt;
* [[FTUI Widget Dimmer|dimmer]]: Ein-/Aus-Button mit integriertem Schieberegler für z.B. einen Dim-Wert&lt;br /&gt;
* [[FTUI Widget Eventmonitor|eventmonitor]]:&lt;br /&gt;
* [[FTUI Widget Homestatus|homestatus]]: Auswahl für vier oder fünf definierte Stati eines Objects (z.B.: FHEM Residents)&lt;br /&gt;
* [[FTUI Widget Html|html]]:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/iframe iframe]: Widget zum Einbinden externer Inhalte in einem Iframe&lt;br /&gt;
* [[FTUI Widget Image|image]]: Zeigt ein Bild, dessen URL fest vorgegeben oder aus einem Device-Reading gelesen werden kann&lt;br /&gt;
* [[FTUI Widget Input|input]]: Erstellen eines Texteingabefeldes&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld&lt;br /&gt;
* [[FTUI Widget Klimatrend|klimatrend]]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt&lt;br /&gt;
* [[FTUI Widget Knob|knob]]: Erstellt einen Statusbalken auf einer Kreisbahn&lt;br /&gt;
* [[FTUI Widget Label|label]]: Reading als Text anzeigen&lt;br /&gt;
* [[FTUI Widget Level|level]]: Vertikale oder horizontale Leiste zur Anzeige von Werten zwischen einem Minimal- und einem Maximalwert&lt;br /&gt;
* [[FTUI Widget Link|link]]: Erstellt einen Link oder Button zum Aufrufen von URLs oder Senden von Befehlen an FHEM&lt;br /&gt;
* [[FTUI Widget Medialist|medialist]]:&lt;br /&gt;
* [[FTUI Widget Multistatebutton|multistatebutton]]: Variante des push-Widgets, welches den set-Befehl abhängig vom gelesenen Status ändert&lt;br /&gt;
* [[FTUI Widget Notify|notify]]: Blendet ein Hinweisfenster im Browser ein&lt;br /&gt;
* [[FTUI Widget Pagebutton|pagebutton]]: Button, mit dem auf andere Seiten gesprungen werden kann. Eignet sich gut für eine Navigation&lt;br /&gt;
* [[FTUI Widget Pagetab|pagetab]]: Tauscht den Inhalt einer Seite durch den einer anderen. Eignet sich gut für ein Navigationsmenü&lt;br /&gt;
* [[FTUI Widget Playstream|playstream]]: Abspielen eines Webradio-Streams per Button&lt;br /&gt;
* [[FTUI Widget Popup|popup]]: Öffnet ein Popup nach einem Klick auf ein Widget oder HTML-Element &lt;br /&gt;
* [[FTUI Widget Progress|progress]]: Zeigt einen Prozentwert in Form einer runden Fortschrittsleiste&lt;br /&gt;
* [[FTUI_Widget_Push|push]]: Button, mir dem ein Befehl an FHEM gesendet werden kann&lt;br /&gt;
* [[FTUI Widget Range|range]]: Erstellt vertikale Balken, die einen Wertebereich in unterschiedlichen Farben darstellen&lt;br /&gt;
* [[FTUI Widget Readingsgroup|readingsgroup]]: Zeigt eine Readingsgroup an, wie sie in FHEM definiert wurde&lt;br /&gt;
* [[FTUI Widget Rotor|rotor]]: Animiertes Umschalten von zwei oder mehr Widgets an einer Position&lt;br /&gt;
* [[FTUI Widget Scale|scale]]: Vertikale oder horizontale Leiste zur Anzeige von Werten zwischen einem Minimal- und einem Maximalwert&lt;br /&gt;
* [[FTUI_Widget_Select|select]]: Combobox, die eine Liste an Werten zur Auswahl anzeigt&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: Zum Anzeigen und Einstellen einer Uhrzeit&lt;br /&gt;
* [[FTUI Widget Simplechart|simplechart]]: Einfaches XY-Diagramm zur Anzeige eines Wertes, der direkt aus einem FHEM-Logfile gelesen wird&lt;br /&gt;
* [[FTUI Widget Slideout|slideout]]:&lt;br /&gt;
* [[FTUI Widget Slider|slider]]: Vertikaler Schieberegler zum Einstellen eines Wertes &lt;br /&gt;
* [[FTUI Widget Spinner|spinner]]: Element um Werte durch Drücken auf Plus- und Minus- oder Höher-/Tiefer-Icons zu ändern&lt;br /&gt;
* [[FTUI Widget Swiper|swiper]]: Bietet die Möglichkeit, durch Wischen zwischen verschiedenen Seiten zu wechseln&lt;br /&gt;
* [[FTUI Widget Switch|switch]]: Button um zwischen zwei Zuständen zu schalten (z.B. on / off)&lt;br /&gt;
* [[FTUI Widget Symbol|symbol]]: Status eines Devices als Symbol darstellen (z.B. Fenster offen)&lt;br /&gt;
* [[FTUI Widget Thermostat|thermostat]]: Anzeige für Heizungsthermostate, mit der die gewünschte Temperatur eingestellt werden kann&lt;br /&gt;
* [[FTUI Widget Volume|volume]]: Einstellscheibe zur Änderung eines einzelnen Wertes&lt;br /&gt;
* [[FTUI Widget Weather|weather]]: Wettersymbol anzeigen&lt;br /&gt;
* [[FTUI Widget WindDirection|wind_direction]]: Anzeige der Windrichtung auf einer Windrose&lt;br /&gt;
&lt;br /&gt;
===3rd Party Widgets===&lt;br /&gt;
Für diese Widgets kann nicht sichergestellt werden, dass sie mit der jeweils aktuellen Version von FTUI funktionieren.&lt;br /&gt;
* [[FTUI Widget Agenda|agenda]]: Zeigt Kalendereinträge in einer Listenform an&lt;br /&gt;
* [[FTUI Widget Calview|calview]]: Zeigt Einträge aus einem [[CALVIEW]]-Device an&lt;br /&gt;
* [[FTUI Widget Chart|chart]]: Diagramm mit ähnlichen Möglichkeiten wie die FHEM-Plots&lt;br /&gt;
* [[FTUI Widget Classchanger|classchanger]]: Ändert seine CSS-Klassen je nach Status eines Devices&lt;br /&gt;
* [[FTUI Widget Clicksound|clicksound]]: Mit dem Widget &amp;quot;clicksound&amp;quot; können Sounds an Click-Events von Elementen gebunden werden.&lt;br /&gt;
* [[FTUI Widget Filelog|filelog]]:&lt;br /&gt;
* [[FTUI Widget Fullcalview|fullcalview]]:&lt;br /&gt;
* [[FTUI Widget Gds|gds]]:&lt;br /&gt;
* [https://forum.fhem.de/index.php/topic,78379.msg703359.html#msg703359 gmaps]: Kartendarstellung mit Google Maps API&lt;br /&gt;
* [[FTUI Widget Highchart|highchart]]:&lt;br /&gt;
* [[FTUI Widget Highchart3d|highchart3d]]:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. &lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.&lt;br /&gt;
* [[FTUI Widget Loading|loading]]:&lt;br /&gt;
* [[FTUI Widget Meteogram|meteogram]]:&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: Zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an.&lt;br /&gt;
* [https://forum.fhem.de/index.php/topic,79283.msg712855.html#msg712855 pinpad]: Pinpad für z.B. eine Alarmanlage&lt;br /&gt;
* [https://forum.fhem.de/index.php/topic,76643.msg685472.html#msg685472 postme]: Liste des PostMe-Devices anzeigen&lt;br /&gt;
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads&lt;br /&gt;
* [[FTUI Widget Screensaver|screensaver]]:&lt;br /&gt;
* [https://forum.fhem.de/index.php/topic,73497.0.html scrolllabel]: Texte in Laufschrift darstellen&lt;br /&gt;
* [[FTUI Widget Svgplot|svgplot]]:&lt;br /&gt;
* [https://forum.fhem.de/index.php?topic=82883.msg750237#msg750237 todoist]: einfaches widget für todoist&lt;br /&gt;
* [[FTUI Widget Tts|tts]]: Sprachausgabe eines Textes aus einem Reading auf dem Endgerät.&lt;br /&gt;
* [[FTUI Widget UWZ|uwz]]: Anzeige der Warnungen der Unwetterzentrale&lt;br /&gt;
* [[FTUI Widget Wakeup|wakeup]]:&lt;br /&gt;
* [https://github.com/svenson08/ftui-weekdaytimer-widget wdtimer]: Visualisierung des [[WeekdayTimer]] Modul&lt;br /&gt;
* [[FTUI Widget Weekprofile|weekprofile]]: Visualisierung des [[weekprofile]] Moduls&lt;br /&gt;
&lt;br /&gt;
==Templates==&lt;br /&gt;
Kommt ein bestimmtes &amp;quot;Code-Fragment&amp;quot; auf mehreren Seiten oder öfter pro Seite vor, bietet FTUI die Option, Templates zu erstellen. Diese werden einmal gebaut und können dann mit dem Attribut &#039;&#039;&#039;data-template&#039;&#039;&#039; nach Belieben in eine Seite eingefügt werden. Dabei besteht auch die Möglichkeit, Variablen zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Variablennamen sollten möglichst eindeutig und unverwechselbar gewählt werden, da bei der Verwendung von Templates im Prinzip Suchen &amp;amp; Ersetzen angewendet wird. Verwendet man beispielsweise die Variablen &#039;&#039;&#039;dev:Thermostat_Kueche&#039;&#039;&#039; und &#039;&#039;&#039;dev_temp:temperatue&#039;&#039;&#039;, so kann es passieren, dass die Ergebnisse im erzeugten Code dann &#039;&#039;&#039;Thermostat_Kueche&#039;&#039;&#039; und &#039;&#039;&#039;Thermostat_Kueche_temp&#039;&#039;&#039; lauten, statt wie gewünscht &#039;&#039;&#039;Thermostat_Kueche&#039;&#039;&#039; und &#039;&#039;&#039;temperature&#039;&#039;&#039;. Um dies zu vermeiden, sollten die Variablen besser &#039;&#039;&#039;device:Thermostat_Kueche&#039;&#039;&#039; und &#039;&#039;&#039;temp:temperatue&#039;&#039;&#039; lauten.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden ein paar Beispiele, wie Templates verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
===Einzelnes Widget===&lt;br /&gt;
Soll ein Widget an mehreren Stellen in exakt der selben Ausführung eingebunden werden, kann diese Widget in einer eigenen Datei erstellt und diese dann auf den Zielseiten automatisch mitgeladen werden.&lt;br /&gt;
&lt;br /&gt;
;Template-Seite&lt;br /&gt;
Die Template-Seite soll in diesem Beispiel &#039;&#039;template_symbol.html&#039;&#039; genannt werden. Diese wird daher zuerst im FTUI-Verzeichnis erstellt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;symbol&amp;quot;&lt;br /&gt;
     data-device=&amp;quot;dummy1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Haupt-Seite&lt;br /&gt;
Die oben erstellte Template-Seite kann nun in jeder gewünschten Seite eingebunden werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; highlight=&amp;quot;6&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gridster&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li data-row=&amp;quot;1&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizey=&amp;quot;1&amp;quot; data-sizex=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;div data-template=&amp;quot;template_symbol.html&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gridster-Element===&lt;br /&gt;
Natürlich kann auch ein ganzes Gridster-Element - in diesem Fall ein Menü - als Template eingebunden werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li data-row=&amp;quot;1&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;1&amp;quot; data-sizey=&amp;quot;4&amp;quot; data-template=&amp;quot;menu.html&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Widget-Gruppen ===&lt;br /&gt;
Die Template-Datei des [[#Einzelnes Widget|ersten Beispiels]] kann natürlich auch mehrere Widgets auf einmal enthalten.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung von Variablen ===&lt;br /&gt;
==== Einfaches Beispiel ====&lt;br /&gt;
Oft wird ein und dasselbe Widget für verschiedenen Devices verwendet. Um nicht für jedes Device das Widget neu kopieren zu müssen (bzw. bei Änderungen alle Seiten ausbessern zu müssen), kann ein Template verwendet werden, dem einfach per Parameter mitgeteilt wird, von welchem Device es gerade die Daten empfangen soll.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird ein Template erzeugt, dass nur die Temperatur verschiedenen Thermostate mittels eines [[FTUI Widget Label|Label-Widgets]] anzeigt.&lt;br /&gt;
&lt;br /&gt;
;Template-Seite&lt;br /&gt;
Die Template-Seite enthält nur ein einfaches Label-Widget und wird in diesem Beispiel &#039;&#039;template_label.html&#039;&#039; genannt. Um sie für mehrere Devices verwenden zu können, wird im Attribut &#039;&#039;&#039;data-device&#039;&#039;&#039; der Name des eigentlichen Devices durch den Parameter &#039;&#039;&#039;par01&#039;&#039;&#039; ersetzt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; highlight=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot;&lt;br /&gt;
     data-device=&amp;quot;par01&amp;quot;&lt;br /&gt;
     data-get=&amp;quot;measured-temp&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Haupt-Seite&lt;br /&gt;
Auf der Haupt-Seite wird die Template-Seite mit dem Attribut &#039;&#039;&#039;data-template&#039;&#039;&#039; eingebunden und ihr via Attribut &#039;&#039;&#039;data-parameter&#039;&#039;&#039; das jeweils gewünschte Device übergeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;div data-template=&amp;quot;template_label.html&amp;quot; data-parameter=&#039;{&amp;quot;par01&amp;quot;:&amp;quot;Thermostat1&amp;quot;}&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-template=&amp;quot;template_label.html&amp;quot; data-parameter=&#039;{&amp;quot;par01&amp;quot;:&amp;quot;Thermostat2&amp;quot;}&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div data-template=&amp;quot;template_label.html&amp;quot; data-parameter=&#039;{&amp;quot;par01&amp;quot;:&amp;quot;Thermostat3&amp;quot;}&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wetter-Slider mit Template ====&lt;br /&gt;
In diesem Beispiel wird ein [[FTUI Widget Slider|Slider-Widget]] erstellt, welches die verschiedenen Tage eines Wetterberichtes anzeigt. Dabei wird für den Wetterbericht des jeweiligen Tages immer dasselbe Template verwendet um nicht für jeden Tag ein eigenes Widget schreiben zu müssen.&lt;br /&gt;
&lt;br /&gt;
;Template-Seite&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;par01&amp;quot; data-unit=&amp;quot;&amp;amp;deg;C&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;inline&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;par02&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;div data-type=&amp;quot;weather&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;par02&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       min:&amp;amp;nbsp;&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;par03&amp;quot; data-unit=&amp;quot;&amp;amp;deg;C&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;par04&amp;quot; data-substitution=&amp;quot;toDate().eeee()+&#039;,&#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;AgroWeather&amp;quot; data-get=&amp;quot;par04&amp;quot; data-substitution=&amp;quot;toDate().ddmm()&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Haupt-Seite&lt;br /&gt;
In der Haupt-Seite wird das Template dann für jede Slider-Seite eingebunden und das Reading für den jeweiligen Tag via Parameter übergeben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;swiper&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li data-template=&amp;quot;templates/wetter.html&amp;quot; data-parameter=&#039;{&amp;quot;par01&amp;quot;:&amp;quot;fc0_tempMax&amp;quot;,&amp;quot;par02&amp;quot;:&amp;quot;fc0_weatherDay&amp;quot;,&amp;quot;par03&amp;quot;:&amp;quot;fc0_tempMin&amp;quot;,&amp;quot;par04&amp;quot;:&amp;quot;fc0_date&amp;quot;}&#039;&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li data-template=&amp;quot;templates/wetter.html&amp;quot; data-parameter=&#039;{&amp;quot;par01&amp;quot;:&amp;quot;fc1_tempMax&amp;quot;,&amp;quot;par02&amp;quot;:&amp;quot;fc1_weatherDay&amp;quot;,&amp;quot;par03&amp;quot;:&amp;quot;fc1_tempMin&amp;quot;,&amp;quot;par04&amp;quot;:&amp;quot;fc1_date&amp;quot;}&#039;&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li data-template=&amp;quot;templates/wetter.html&amp;quot; data-parameter=&#039;{&amp;quot;par01&amp;quot;:&amp;quot;fc2_tempMax&amp;quot;,&amp;quot;par02&amp;quot;:&amp;quot;fc2_weatherDay&amp;quot;,&amp;quot;par03&amp;quot;:&amp;quot;fc2_tempMin&amp;quot;,&amp;quot;par04&amp;quot;:&amp;quot;fc2_date&amp;quot;}&#039;&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li data-template=&amp;quot;templates/wetter.html&amp;quot; data-parameter=&#039;{&amp;quot;par01&amp;quot;:&amp;quot;fc3_tempMax&amp;quot;,&amp;quot;par02&amp;quot;:&amp;quot;fc3_weatherDay&amp;quot;,&amp;quot;par03&amp;quot;:&amp;quot;fc3_tempMin&amp;quot;,&amp;quot;par04&amp;quot;:&amp;quot;fc3_date&amp;quot;}&#039;&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaScript-Funktionen ==&lt;br /&gt;
Neben den Widgets können auch einige JavaScript-Funktionen verwendet werden, um Befehle an FHEM zu senden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Folgende Zeile setzt einen direkten Befehl an FHEM ab (&amp;lt;code&amp;gt;set dummy1 off&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;div onclick=&amp;quot;ftui.setFhemStatus(&#039;set dummy1 off&#039;)&amp;quot;&amp;gt;Dummy1 aus&amp;lt;/div&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Zeile veranlasst FHEM dazu, eine Funktion aus der 99_myUtils.pm auszuführen (&amp;lt;code&amp;gt;myUtils_HeizungUpDown(&amp;quot;WZ.Thermostat_Climate&amp;quot;,&amp;quot;up&amp;quot;)&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;div onclick=&amp;quot;ftui.setFhemStatus(&#039;{myUtils_HeizungUpDown(&amp;amp;quot;WZ.Thermostat_Climate&amp;amp;quot;,&amp;amp;quot;up&amp;amp;quot;)}&#039;)&amp;quot;&amp;gt;+&amp;lt;/div&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel, wie ein Kommando an FHEM gesendet wird und gleichzeitig der Wert eines bereits in FTUI angezeigten Readings verwendet werden kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;label&amp;quot; data-device=&amp;quot;dummy1&amp;quot; data-get=&amp;quot;temperature&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div onClick=&amp;quot;ftui.setFhemStatus(&#039;set dummy2 &#039;+ftui.getDeviceParameter(&#039;dummy1&#039;,&#039;temperature&#039;).val);&amp;quot;&amp;gt;Senden&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigene Widgets erstellen ==&lt;br /&gt;
Wie eigenen Widgets für FTUI erstellt werden können, ist auf der Seite [[FTUI eigene Widgets]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM Tablet UI FAQ]] zusammengestellt.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]&lt;br /&gt;
* {{Link2Forum|Topic=34233|LinkText=Forums-Beitrag}}&lt;br /&gt;
* [[FTUI_Snippets|Snippets]]&lt;br /&gt;
* [http://knowthelist.github.io/fhem/tablet/demo_widgets.html Live-Demos]&lt;br /&gt;
* [https://waschto.eu/fhem-und-tabletui-livedemo/ FHEM und TabletUI Live-Demo]&lt;br /&gt;
* {{Link2Forum|Topic=37378|LinkText=User-Demos}}&lt;br /&gt;
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23931</id>
		<title>FTUI eigene Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23931"/>
		<updated>2017-12-29T21:38:08Z</updated>

		<summary type="html">&lt;p&gt;Pula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eigene Widgets für [[FHEM Tablet UI]] zu erstellen ist relativ einfach. Dafür muss nur eine widget_mywidget.js im js-Folder neben den anderen Widgets angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine Minimalvariante einer widget_mywidget.js-Datei könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        alert(&#039;init called&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        alert(&#039;update called for&#039; + device + &#039;:&#039; + reading );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende der Datei steht die Definition der Public-Parameter. Neben dem Namen müssen mindestens die beiden Funktionen &#039;&#039;&#039;init()&#039;&#039;&#039; und &#039;&#039;&#039;update()&#039;&#039;&#039; implementiert sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;init()&#039;&#039;&#039; wird einmal gleich nach dem Laden des Plugins aufgerufen, &#039;&#039;&#039;update()&#039;&#039;&#039; jedesmal, wenn Änderungen von Readings passieren. &lt;br /&gt;
&lt;br /&gt;
Dieses FTUI-Plugin kann man jetzt so einbinden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn das Plugin für ein UI-Control sein soll, das mehrfach auf der Seite vorkommt, kann man im &#039;&#039;&#039;init()&#039;&#039;&#039; per &#039;&#039;&#039;each()&#039;&#039;&#039; durch alle Elemente iterieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
     me.elements = $(&#039;[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;);&lt;br /&gt;
     me.elements.each(function (index) {&lt;br /&gt;
         alert(&#039;init #&#039; + index + &#039; called&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Plugin Daten abrufen soll, die NICHT in einem Reading von FHEM enthalten sind, empfiehlt es sich, eine Klasse zu definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;neueklasse&amp;quot; data-type=&amp;quot;blabla&amp;quot; data-device=&#039;test-device&#039; data-get=&#039;neueklasse&#039;&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im JS kann man dann so diese Elemente auswählen bzw ihnen etwas zuweisen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (elem.is(&#039;.neueklasse&#039;)) {&lt;br /&gt;
   elem.html(text);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht vergessen: Wenn hier Daten aus Readings abgefragt werden sollen, müssen diese Readings in init() abonniert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   elem.initData(&#039;reading123&#039;, &#039;testreading&#039;);&lt;br /&gt;
   me.addReading(elem, &#039;reading123&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann in der Update-Routine muss auf diese Readings geprüft werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
me.elements.filterDeviceReading(&#039;reading123&#039;, dev, par)&lt;br /&gt;
		  .add(me.elements.filterDeviceReading(&#039;testreading&#039;, dev, par))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nur dann werden die Elemente bei Updates aus fhem auch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Ausserdem empfiehlt es sich natürlich in fhem bei den betroffenen Devices ein&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr device event-on-change-reading .*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zu machen!&lt;br /&gt;
&lt;br /&gt;
Updates werden aber nur gerufen, wenn man die entsprechenden Readings beim &#039;&#039;&#039;init()&#039;&#039;&#039; abonniert. Das passiert mit &#039;&#039;&#039;addReading();&#039;&#039;&#039; (Funktion ist enthalten im Base-Widget: Modul_widget) &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel fügen wir das Reading hinzu, das im Attribut &#039;&#039;&#039;data-get&#039;&#039;&#039; angegeben ist. Wir legen gleich noch als Default das Reading &#039;STATE&#039; fest, für den Fall, dass data-get im HTML Code fehlt. Das passiert mit &#039;&#039;&#039;elem.initData();&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
&lt;br /&gt;
    me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
    me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
        var elem = $(this);  &lt;br /&gt;
        elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
        me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann können wir unter &#039;&#039;&#039;update()&#039;&#039;&#039; auf die Notifizierungen warten. Wir filtern mit &#039;&#039;&#039;elements.filterDeviceReading()&#039;&#039;&#039; die Elemente heraus, die unter &#039;&#039;&#039;data-get&#039;&#039;&#039; das aktualisierte Reading haben und holen mit &#039;&#039;&#039;elem.getReading().val&#039;&#039;&#039; den aktuell bekannten Wert aus dem lokalen Cache. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;elem.getReading().date&#039;&#039;&#039; würde den Zeitstempel des Readings liefern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function update(device, reading) {&lt;br /&gt;
     me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
         .each(function (index) {&lt;br /&gt;
             var elem = $(this);&lt;br /&gt;
             var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
             if (value) {&lt;br /&gt;
                 elem.html(value);&lt;br /&gt;
             }&lt;br /&gt;
         });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst sieht unser FTUI Plugin jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
&lt;br /&gt;
        me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
        me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
            var elem = $(this);  &lt;br /&gt;
            elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
            me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
            .each(function (index) {&lt;br /&gt;
                var elem = $(this);&lt;br /&gt;
                var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
                if (value) {&lt;br /&gt;
                    elem.html(value);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im HTML würde man das jetzt so nutzen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot; data-device=&#039;AvReceiver&#039; data-get=&#039;volume&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23930</id>
		<title>FTUI eigene Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23930"/>
		<updated>2017-12-29T21:36:37Z</updated>

		<summary type="html">&lt;p&gt;Pula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eigene Widgets für [[FHEM Tablet UI]] zu erstellen ist relativ einfach. Dafür muss nur eine widget_mywidget.js im js-Folder neben den anderen Widgets angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine Minimalvariante einer widget_mywidget.js-Datei könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        alert(&#039;init called&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        alert(&#039;update called for&#039; + device + &#039;:&#039; + reading );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende der Datei steht die Definition der Public-Parameter. Neben dem Namen müssen mindestens die beiden Funktionen &#039;&#039;&#039;init()&#039;&#039;&#039; und &#039;&#039;&#039;update()&#039;&#039;&#039; implementiert sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;init()&#039;&#039;&#039; wird einmal gleich nach dem Laden des Plugins aufgerufen, &#039;&#039;&#039;update()&#039;&#039;&#039; jedesmal, wenn Änderungen von Readings passieren. &lt;br /&gt;
&lt;br /&gt;
Dieses FTUI-Plugin kann man jetzt so einbinden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn das Plugin für ein UI-Control sein soll, das mehrfach auf der Seite vorkommt, kann man im &#039;&#039;&#039;init()&#039;&#039;&#039; per &#039;&#039;&#039;each()&#039;&#039;&#039; durch alle Elemente iterieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
     me.elements = $(&#039;[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;);&lt;br /&gt;
     me.elements.each(function (index) {&lt;br /&gt;
         alert(&#039;init #&#039; + index + &#039; called&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Plugin Daten abrufen soll, die NICHT in einem Reading von FHEM enthalten sind, empfiehlt es sich, eine Klasse zu definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;neueklasse&amp;quot; data-type=&amp;quot;blabla&amp;quot; data-device=&#039;test-device&#039; data-get=&#039;neueklasse&#039;&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im JS kann man dann so diese Elemente auswählen bzw ihnen etwas zuweisen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (elem.is(&#039;.neueklasse&#039;)) {&lt;br /&gt;
   elem.html(text);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht vergessen: Wenn hier Daten aus Readings abgefragt werden sollen, müssen diese Readings in init() abonniert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   elem.initData(&#039;reading123&#039;, &#039;testreading&#039;);&lt;br /&gt;
   me.addReading(elem, &#039;reading123&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann in der Update-Routine muss auf diese Readings geprüft werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
me.elements.filterDeviceReading(&#039;reading123&#039;, dev, par)&lt;br /&gt;
		  .add(me.elements.filterDeviceReading(&#039;testreading&#039;, dev, par))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nur dann werden die Elemente bei Updates aus fhem auch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Ausserdem empfiehlt es sich natürlich in fhem bei den betroffenen Devices ein&lt;br /&gt;
&lt;br /&gt;
event-on-change-reading .*&lt;br /&gt;
&lt;br /&gt;
zu machen ;-)&lt;br /&gt;
&lt;br /&gt;
Updates werden aber nur gerufen, wenn man die entsprechenden Readings beim &#039;&#039;&#039;init()&#039;&#039;&#039; abonniert. Das passiert mit &#039;&#039;&#039;addReading();&#039;&#039;&#039; (Funktion ist enthalten im Base-Widget: Modul_widget) &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel fügen wir das Reading hinzu, das im Attribut &#039;&#039;&#039;data-get&#039;&#039;&#039; angegeben ist. Wir legen gleich noch als Default das Reading &#039;STATE&#039; fest, für den Fall, dass data-get im HTML Code fehlt. Das passiert mit &#039;&#039;&#039;elem.initData();&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
&lt;br /&gt;
    me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
    me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
        var elem = $(this);  &lt;br /&gt;
        elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
        me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann können wir unter &#039;&#039;&#039;update()&#039;&#039;&#039; auf die Notifizierungen warten. Wir filtern mit &#039;&#039;&#039;elements.filterDeviceReading()&#039;&#039;&#039; die Elemente heraus, die unter &#039;&#039;&#039;data-get&#039;&#039;&#039; das aktualisierte Reading haben und holen mit &#039;&#039;&#039;elem.getReading().val&#039;&#039;&#039; den aktuell bekannten Wert aus dem lokalen Cache. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;elem.getReading().date&#039;&#039;&#039; würde den Zeitstempel des Readings liefern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function update(device, reading) {&lt;br /&gt;
     me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
         .each(function (index) {&lt;br /&gt;
             var elem = $(this);&lt;br /&gt;
             var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
             if (value) {&lt;br /&gt;
                 elem.html(value);&lt;br /&gt;
             }&lt;br /&gt;
         });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst sieht unser FTUI Plugin jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
&lt;br /&gt;
        me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
        me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
            var elem = $(this);  &lt;br /&gt;
            elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
            me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
            .each(function (index) {&lt;br /&gt;
                var elem = $(this);&lt;br /&gt;
                var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
                if (value) {&lt;br /&gt;
                    elem.html(value);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im HTML würde man das jetzt so nutzen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot; data-device=&#039;AvReceiver&#039; data-get=&#039;volume&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23929</id>
		<title>FTUI eigene Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23929"/>
		<updated>2017-12-29T21:35:29Z</updated>

		<summary type="html">&lt;p&gt;Pula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eigene Widgets für [[FHEM Tablet UI]] zu erstellen ist relativ einfach. Dafür muss nur eine widget_mywidget.js im js-Folder neben den anderen Widgets angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine Minimalvariante einer widget_mywidget.js-Datei könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        alert(&#039;init called&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        alert(&#039;update called for&#039; + device + &#039;:&#039; + reading );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende der Datei steht die Definition der Public-Parameter. Neben dem Namen müssen mindestens die beiden Funktionen &#039;&#039;&#039;init()&#039;&#039;&#039; und &#039;&#039;&#039;update()&#039;&#039;&#039; implementiert sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;init()&#039;&#039;&#039; wird einmal gleich nach dem Laden des Plugins aufgerufen, &#039;&#039;&#039;update()&#039;&#039;&#039; jedesmal, wenn Änderungen von Readings passieren. &lt;br /&gt;
&lt;br /&gt;
Dieses FTUI-Plugin kann man jetzt so einbinden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn das Plugin für ein UI-Control sein soll, das mehrfach auf der Seite vorkommt, kann man im &#039;&#039;&#039;init()&#039;&#039;&#039; per &#039;&#039;&#039;each()&#039;&#039;&#039; durch alle Elemente iterieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
     me.elements = $(&#039;[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;);&lt;br /&gt;
     me.elements.each(function (index) {&lt;br /&gt;
         alert(&#039;init #&#039; + index + &#039; called&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Plugin Daten abrufen soll, die NICHT in einem Reading von FHEM enthalten sind, empfiehlt es sich, eine Klasse zu definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;neueklasse&amp;quot; data-type=&amp;quot;blabla&amp;quot; data-device=&#039;wzcore&#039; data-get=&#039;cm&#039;&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im JS kann man dann so diese Elemente auswählen bzw ihnen etwas zuweisen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (elem.is(&#039;.neueklasse&#039;)) {&lt;br /&gt;
   elem.html(text);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht vergessen: Wenn hier Daten aus Readings abgefragt werden sollen, müssen diese Readings in init() abonniert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   elem.initData(&#039;reading123&#039;, &#039;testreading&#039;);&lt;br /&gt;
   me.addReading(elem, &#039;reading123&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und dann in der Update-Routine muss auf diese Readings geprüft werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
me.elements.filterDeviceReading(&#039;reading123&#039;, dev, par)&lt;br /&gt;
		  .add(me.elements.filterDeviceReading(&#039;testreading&#039;, dev, par))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Nur dann werden die Elemente bei Updates aus fhem auch aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Ausserdem empfiehlt es sich natürlich in fhem bei den betroffenen Devices ein&lt;br /&gt;
&lt;br /&gt;
event-on-change-reading .*&lt;br /&gt;
&lt;br /&gt;
zu machen ;-)&lt;br /&gt;
&lt;br /&gt;
Updates werden aber nur gerufen, wenn man die entsprechenden Readings beim &#039;&#039;&#039;init()&#039;&#039;&#039; abonniert. Das passiert mit &#039;&#039;&#039;addReading();&#039;&#039;&#039; (Funktion ist enthalten im Base-Widget: Modul_widget) &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel fügen wir das Reading hinzu, das im Attribut &#039;&#039;&#039;data-get&#039;&#039;&#039; angegeben ist. Wir legen gleich noch als Default das Reading &#039;STATE&#039; fest, für den Fall, dass data-get im HTML Code fehlt. Das passiert mit &#039;&#039;&#039;elem.initData();&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
&lt;br /&gt;
    me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
    me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
        var elem = $(this);  &lt;br /&gt;
        elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
        me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann können wir unter &#039;&#039;&#039;update()&#039;&#039;&#039; auf die Notifizierungen warten. Wir filtern mit &#039;&#039;&#039;elements.filterDeviceReading()&#039;&#039;&#039; die Elemente heraus, die unter &#039;&#039;&#039;data-get&#039;&#039;&#039; das aktualisierte Reading haben und holen mit &#039;&#039;&#039;elem.getReading().val&#039;&#039;&#039; den aktuell bekannten Wert aus dem lokalen Cache. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;elem.getReading().date&#039;&#039;&#039; würde den Zeitstempel des Readings liefern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function update(device, reading) {&lt;br /&gt;
     me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
         .each(function (index) {&lt;br /&gt;
             var elem = $(this);&lt;br /&gt;
             var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
             if (value) {&lt;br /&gt;
                 elem.html(value);&lt;br /&gt;
             }&lt;br /&gt;
         });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst sieht unser FTUI Plugin jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
&lt;br /&gt;
        me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
        me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
            var elem = $(this);  &lt;br /&gt;
            elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
            me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
            .each(function (index) {&lt;br /&gt;
                var elem = $(this);&lt;br /&gt;
                var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
                if (value) {&lt;br /&gt;
                    elem.html(value);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im HTML würde man das jetzt so nutzen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot; data-device=&#039;AvReceiver&#039; data-get=&#039;volume&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23928</id>
		<title>FTUI eigene Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23928"/>
		<updated>2017-12-29T21:31:15Z</updated>

		<summary type="html">&lt;p&gt;Pula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eigene Widgets für [[FHEM Tablet UI]] zu erstellen ist relativ einfach. Dafür muss nur eine widget_mywidget.js im js-Folder neben den anderen Widgets angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine Minimalvariante einer widget_mywidget.js-Datei könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        alert(&#039;init called&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        alert(&#039;update called for&#039; + device + &#039;:&#039; + reading );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende der Datei steht die Definition der Public-Parameter. Neben dem Namen müssen mindestens die beiden Funktionen &#039;&#039;&#039;init()&#039;&#039;&#039; und &#039;&#039;&#039;update()&#039;&#039;&#039; implementiert sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;init()&#039;&#039;&#039; wird einmal gleich nach dem Laden des Plugins aufgerufen, &#039;&#039;&#039;update()&#039;&#039;&#039; jedesmal, wenn Änderungen von Readings passieren. &lt;br /&gt;
&lt;br /&gt;
Dieses FTUI-Plugin kann man jetzt so einbinden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn das Plugin für ein UI-Control sein soll, das mehrfach auf der Seite vorkommt, kann man im &#039;&#039;&#039;init()&#039;&#039;&#039; per &#039;&#039;&#039;each()&#039;&#039;&#039; durch alle Elemente iterieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
     me.elements = $(&#039;[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;);&lt;br /&gt;
     me.elements.each(function (index) {&lt;br /&gt;
         alert(&#039;init #&#039; + index + &#039; called&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Plugin Daten abrufen soll, die NICHT in einem Reading von FHEM enthalten sind, empfiehlt es sich, eine Klasse zu definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;neueklasse&amp;quot; data-type=&amp;quot;blabla&amp;quot; data-device=&#039;wzcore&#039; data-get=&#039;cm&#039;&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im JS kann man dann so diese Elemente auswählen bzw ihnen etwas zuweisen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (elem.is(&#039;.neueklasse&#039;)) {&lt;br /&gt;
   elem.html(text);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht vergessen: Wenn hier Daten aus Readings abgefragt werden sollen, müssen diese Readings in init() abonniert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   elem.initData(&#039;reading123&#039;, &#039;testreading&#039;);&lt;br /&gt;
   me.addReading(elem, &#039;reading123&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Updates werden aber nur gerufen, wenn man die entsprechenden Readings beim &#039;&#039;&#039;init()&#039;&#039;&#039; abonniert. Das passiert mit &#039;&#039;&#039;addReading();&#039;&#039;&#039; (Funktion ist enthalten im Base-Widget: Modul_widget) &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel fügen wir das Reading hinzu, das im Attribut &#039;&#039;&#039;data-get&#039;&#039;&#039; angegeben ist. Wir legen gleich noch als Default das Reading &#039;STATE&#039; fest, für den Fall, dass data-get im HTML Code fehlt. Das passiert mit &#039;&#039;&#039;elem.initData();&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
&lt;br /&gt;
    me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
    me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
        var elem = $(this);  &lt;br /&gt;
        elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
        me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann können wir unter &#039;&#039;&#039;update()&#039;&#039;&#039; auf die Notifizierungen warten. Wir filtern mit &#039;&#039;&#039;elements.filterDeviceReading()&#039;&#039;&#039; die Elemente heraus, die unter &#039;&#039;&#039;data-get&#039;&#039;&#039; das aktualisierte Reading haben und holen mit &#039;&#039;&#039;elem.getReading().val&#039;&#039;&#039; den aktuell bekannten Wert aus dem lokalen Cache. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;elem.getReading().date&#039;&#039;&#039; würde den Zeitstempel des Readings liefern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function update(device, reading) {&lt;br /&gt;
     me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
         .each(function (index) {&lt;br /&gt;
             var elem = $(this);&lt;br /&gt;
             var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
             if (value) {&lt;br /&gt;
                 elem.html(value);&lt;br /&gt;
             }&lt;br /&gt;
         });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst sieht unser FTUI Plugin jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
&lt;br /&gt;
        me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
        me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
            var elem = $(this);  &lt;br /&gt;
            elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
            me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
            .each(function (index) {&lt;br /&gt;
                var elem = $(this);&lt;br /&gt;
                var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
                if (value) {&lt;br /&gt;
                    elem.html(value);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im HTML würde man das jetzt so nutzen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot; data-device=&#039;AvReceiver&#039; data-get=&#039;volume&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23927</id>
		<title>FTUI eigene Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_eigene_Widgets&amp;diff=23927"/>
		<updated>2017-12-29T21:28:05Z</updated>

		<summary type="html">&lt;p&gt;Pula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eigene Widgets für [[FHEM Tablet UI]] zu erstellen ist relativ einfach. Dafür muss nur eine widget_mywidget.js im js-Folder neben den anderen Widgets angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Eine Minimalvariante einer widget_mywidget.js-Datei könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        alert(&#039;init called&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        alert(&#039;update called for&#039; + device + &#039;:&#039; + reading );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende der Datei steht die Definition der Public-Parameter. Neben dem Namen müssen mindestens die beiden Funktionen &#039;&#039;&#039;init()&#039;&#039;&#039; und &#039;&#039;&#039;update()&#039;&#039;&#039; implementiert sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;init()&#039;&#039;&#039; wird einmal gleich nach dem Laden des Plugins aufgerufen, &#039;&#039;&#039;update()&#039;&#039;&#039; jedesmal, wenn Änderungen von Readings passieren. &lt;br /&gt;
&lt;br /&gt;
Dieses FTUI-Plugin kann man jetzt so einbinden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn das Plugin für ein UI-Control sein soll, das mehrfach auf der Seite vorkommt, kann man im &#039;&#039;&#039;init()&#039;&#039;&#039; per &#039;&#039;&#039;each()&#039;&#039;&#039; durch alle Elemente iterieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
     me.elements = $(&#039;[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;);&lt;br /&gt;
     me.elements.each(function (index) {&lt;br /&gt;
         alert(&#039;init #&#039; + index + &#039; called&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Plugin Daten abrufen soll, die NICHT in einem Reading von FHEM enthalten sind, empfiehlt es sich, eine Klasse zu definieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;neueklasse&amp;quot; data-type=&amp;quot;blabla&amp;quot; data-device=&#039;wzcore&#039; data-get=&#039;cm&#039;&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im JS kann man dann so diese Elemente auswählen bzw ihnen etwas zuweisen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (elem.is(&#039;.neueklasse&#039;)) {&lt;br /&gt;
   elem.html(text);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Updates werden aber nur gerufen, wenn man die entsprechenden Readings beim &#039;&#039;&#039;init()&#039;&#039;&#039; abonniert. Das passiert mit &#039;&#039;&#039;addReading();&#039;&#039;&#039; (Funktion ist enthalten im Base-Widget: Modul_widget) &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel fügen wir das Reading hinzu, das im Attribut &#039;&#039;&#039;data-get&#039;&#039;&#039; angegeben ist. Wir legen gleich noch als Default das Reading &#039;STATE&#039; fest, für den Fall, dass data-get im HTML Code fehlt. Das passiert mit &#039;&#039;&#039;elem.initData();&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function init() {&lt;br /&gt;
&lt;br /&gt;
    me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
    me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
        var elem = $(this);  &lt;br /&gt;
        elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
        me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann können wir unter &#039;&#039;&#039;update()&#039;&#039;&#039; auf die Notifizierungen warten. Wir filtern mit &#039;&#039;&#039;elements.filterDeviceReading()&#039;&#039;&#039; die Elemente heraus, die unter &#039;&#039;&#039;data-get&#039;&#039;&#039; das aktualisierte Reading haben und holen mit &#039;&#039;&#039;elem.getReading().val&#039;&#039;&#039; den aktuell bekannten Wert aus dem lokalen Cache. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;elem.getReading().date&#039;&#039;&#039; würde den Zeitstempel des Readings liefern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function update(device, reading) {&lt;br /&gt;
     me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
         .each(function (index) {&lt;br /&gt;
             var elem = $(this);&lt;br /&gt;
             var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
             if (value) {&lt;br /&gt;
                 elem.html(value);&lt;br /&gt;
             }&lt;br /&gt;
         });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusammengefasst sieht unser FTUI Plugin jetzt so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var Modul_mywidget = function () {&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
&lt;br /&gt;
        me.elements = $(&#039;div[data-type=&amp;quot;&#039; + me.widgetname + &#039;&amp;quot;]&#039;, me.area);&lt;br /&gt;
        me.elements.each(function (index) {&lt;br /&gt;
&lt;br /&gt;
            var elem = $(this);  &lt;br /&gt;
            elem.initData(&#039;get&#039;, &#039;STATE&#039;);&lt;br /&gt;
&lt;br /&gt;
            me.addReading(elem, &#039;get&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update(device, reading) {&lt;br /&gt;
        me.elements.filterDeviceReading(&#039;get&#039;, device, reading)&lt;br /&gt;
            .each(function (index) {&lt;br /&gt;
                var elem = $(this);&lt;br /&gt;
                var value = elem.getReading(&#039;get&#039;).val;&lt;br /&gt;
                if (value) {&lt;br /&gt;
                    elem.html(value);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var me = $.extend(new Modul_widget(), {&lt;br /&gt;
        widgetname: &#039;mywidget&#039;,&lt;br /&gt;
        init: init,&lt;br /&gt;
        update: update,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    return me;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im HTML würde man das jetzt so nutzen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;mywidget&amp;quot; data-device=&#039;AvReceiver&#039; data-get=&#039;volume&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=CsrfToken-HowTo&amp;diff=20610</id>
		<title>CsrfToken-HowTo</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=CsrfToken-HowTo&amp;diff=20610"/>
		<updated>2017-03-07T19:42:37Z</updated>

		<summary type="html">&lt;p&gt;Pula: python-routinen eingebaut&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:csrfToken-HowTo}}&lt;br /&gt;
FHEM hat mit der Version 5.8 eine Sicherheitsmaßnahme scharfgeschaltet, den csrfToken.&lt;br /&gt;
Dieser Token wird bei jedem Neustart von FHEM neu gebildet.&lt;br /&gt;
&lt;br /&gt;
Dieses Feature erhöht die Sicherheit, führt aber dazu, dass man nicht mehr mit einem einfachen http Link auf das FHEMWEB zugreifen kann.&lt;br /&gt;
&lt;br /&gt;
==Einzeiler==&lt;br /&gt;
&lt;br /&gt;
Was früher so ging:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://localhost:8083/fhem?cmd=set%20Office%20on&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
muss jetzt etwas ergänzt werden. Mit dem Einzeiler&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;curl -s -D - &#039;http://localhost:8083/fhem?XHR=1&#039; | awk &#039;/X-FHEM-csrfToken/{print $2}&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann man den aktuellle csrfToken aus dem Header extrahieren und muss ihn nur noch an den Aufruf anhängen.&lt;br /&gt;
Erste Variante:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;curl --data-raw &amp;quot;fwcsrf=$(curl -s -D - &#039;http://localhost:8083/fhem?XHR=1&#039; | awk &#039;/X-FHEM-csrfToken/{print $2}&#039;)&amp;quot; http://localhost:8083/fhem?cmd=set%20Office%20on&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zweite Variante, in dieser wird cr+lf am Ende des ermittelten csrfTokens abgeschnitten:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;curl &amp;quot;http://fhem.example.org:8083/fhem?cmd=set%20Office%20on?XHR=1&amp;amp;fwcsrf=&amp;quot;`curl -s -D - &#039;http://fhem.example.org:8083/fhem?XHR=1&#039; | awk &#039;/X-FHEM-csrfToken/{print $2}&#039; | tr -d &amp;quot;\r\n&amp;quot;`&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Man kann auch in Scripten den token zunächst abspeichern:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;token=$(curl -s -D - &#039;http://localhost:8083/fhem?XHR=1&#039; | awk &#039;/X-FHEM-csrfToken/{print $2}&#039;)&lt;br /&gt;
 curl --data-raw &amp;quot;fwcsrf=$token&amp;quot; http://localhost:8083/fhem?cmd=set%20Office%20on&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==API Web==&lt;br /&gt;
Falls man ohne den Token arbeiten will, könnte man ein eigenes API Web erstellen und den Zugriff darauf beschränken. In vorhandenen Scripten / Applikationen müsste dann lediglich der Port geändert werden. &lt;br /&gt;
  &lt;br /&gt;
  define WEBapi FHEMWEB 8088 global&lt;br /&gt;
  attr WEBapi csrfToken none&lt;br /&gt;
  attr WEBapi allowFrom 192.168.178.83|127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Im Forum ist ganz gut beschrieben wie man die Gestaltung des regEx für die IP Adresse machen kann -&amp;gt; Links&lt;br /&gt;
&lt;br /&gt;
==csrfToken festlegen==&lt;br /&gt;
Dies kann man tun, falls die dynamische Abfrage zur Laufzeit des Tokens nicht möglich ist. &lt;br /&gt;
&lt;br /&gt;
  attr WEB.* csrfToken &amp;lt;beliebige Folge aus Zeichen und Zahlen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit können feste URLs verwendet werden:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://localhost:8083/fhem?cmd=set%20Office%20on&amp;amp;fwcsrf=&amp;lt;fester token&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==csrfToken abschalten==&lt;br /&gt;
Dies sollte man als erste Hilfe tun, aber unbedingt darüber nachdenken wie man die Applikation umstellt.&lt;br /&gt;
&lt;br /&gt;
  attr WEB.* csrfToken none&lt;br /&gt;
&lt;br /&gt;
==Featurelevel==&lt;br /&gt;
Eine weitere temporäre Notfallmaßnahme wäre den Featurelevel nach dem Update einfach wieder zurückzudrehen&lt;br /&gt;
&lt;br /&gt;
  attr global featurelevel 5.7&lt;br /&gt;
&lt;br /&gt;
==Python==&lt;br /&gt;
Falls mal jemand aus python (hier für python 2.7) heraus fhem ansteuern möchte&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;import sys&lt;br /&gt;
import urllib2&lt;br /&gt;
import urllib&lt;br /&gt;
import ssl&lt;br /&gt;
import urlparse&lt;br /&gt;
BASEURL = &#039;https://user:password@server_ip:8083/fhem?&#039;&lt;br /&gt;
url = BASEURL + &#039;cmd=set+licht+on&#039;&lt;br /&gt;
def get_token(url):&lt;br /&gt;
    nurl = urlparse.urlsplit(url)&lt;br /&gt;
    username = nurl.username&lt;br /&gt;
    password = nurl.password&lt;br /&gt;
    url = url.replace(username + &#039;:&#039; + password + &#039;@&#039;, &#039;&#039;)&lt;br /&gt;
    url = url.replace(&amp;quot; &amp;quot;, &amp;quot;%20&amp;quot;)&lt;br /&gt;
    ssl._create_default_https_context = ssl._create_unverified_context&lt;br /&gt;
    p = urllib2.HTTPPasswordMgrWithDefaultRealm()&lt;br /&gt;
    p.add_password(None, url, username, password)&lt;br /&gt;
    handler = urllib2.HTTPBasicAuthHandler(p)&lt;br /&gt;
    opener = urllib2.build_opener(handler)&lt;br /&gt;
    urllib2.install_opener(opener)&lt;br /&gt;
    try:&lt;br /&gt;
        uu = urllib2.urlopen(&lt;br /&gt;
            url=url,&lt;br /&gt;
            data=None,&lt;br /&gt;
            timeout=10&lt;br /&gt;
        )&lt;br /&gt;
        token = uu.read()&lt;br /&gt;
        token = token[token.find(&#039;csrf_&#039;):]&lt;br /&gt;
        token = token[:token.find(&amp;quot;\&#039;&amp;quot;)]&lt;br /&gt;
        return token&lt;br /&gt;
    except urllib2.URLError, urllib2.URLError.reason:&lt;br /&gt;
        print(&#039;URLError: %s&#039; % urllib2.URLError.reason)&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
def fire_command(url):&lt;br /&gt;
    # type: (object) -&amp;gt; object&lt;br /&gt;
    if &amp;quot;@&amp;quot; in url:&lt;br /&gt;
        token = get_token(BASEURL)&lt;br /&gt;
        data = {&#039;fwcsrf&#039;: token}&lt;br /&gt;
        data = urllib.urlencode(data)&lt;br /&gt;
        nurl = urlparse.urlsplit(url)&lt;br /&gt;
        username = nurl.username&lt;br /&gt;
        password = nurl.password&lt;br /&gt;
        url = url.replace(username + &#039;:&#039; + password + &#039;@&#039;, &#039;&#039;)&lt;br /&gt;
        url = url.replace(&amp;quot; &amp;quot;, &amp;quot;%20&amp;quot;)&lt;br /&gt;
        ssl._create_default_https_context = ssl._create_unverified_context&lt;br /&gt;
        p = urllib2.HTTPPasswordMgrWithDefaultRealm()&lt;br /&gt;
        p.add_password(None, url, username, password)&lt;br /&gt;
        handler = urllib2.HTTPBasicAuthHandler(p)&lt;br /&gt;
        opener = urllib2.build_opener(handler)&lt;br /&gt;
        urllib2.install_opener(opener)&lt;br /&gt;
        try:&lt;br /&gt;
            urllib2.urlopen(&lt;br /&gt;
                url=url,&lt;br /&gt;
                data=data,&lt;br /&gt;
                timeout=10&lt;br /&gt;
            )&lt;br /&gt;
        except urllib2.URLError, urllib2.URLError.reason:&lt;br /&gt;
            print(&#039;URLError: %s&#039; % urllib2.URLError.reason)&lt;br /&gt;
            return False&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* https://forum.fhem.de/index.php?topic=23994.0&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery Wikipedia - Cross Site Request Forgery (csrf)]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=WifiLight&amp;diff=12792</id>
		<title>WifiLight</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=WifiLight&amp;diff=12792"/>
		<updated>2015-11-06T20:47:18Z</updated>

		<summary type="html">&lt;p&gt;Pula: /* HSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuern von LEDs / Stripes mit Hilfe eines WLAN LED Moduls&lt;br /&gt;
|ModType=x&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
&amp;lt;!-- |ModCmdRef=   wird automatisch generiert --&amp;gt;&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=32_WifiLight.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=769 Jörg alias herrmannj]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Ich habe den Namen des Artikels angepasst, damit später die Links in die Commandref funktionieren (Groß-/Kleinschreibung ist da relevant --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FHEM Modul zum steuern diverser LED Leuchtmittel über WLAN wie Mi-Light, Limitless, IVY, sengled, LW12, LED Streifen, 2,4GHz E27 RGB Lampen ...&lt;br /&gt;
&lt;br /&gt;
=== Basic Syntax ===&lt;br /&gt;
==== Definition ====&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WifiLight &amp;lt;Leuchtmitteltyp&amp;gt; &amp;lt;bridgetyp&amp;gt;:&amp;lt;IP|FQDN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;Für die Milight Typen die Gruppen unterstützen werden die Gruppen in der Reihenfolge der Definition automatisch erstellt.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== on / off ====&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; on|off&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&amp;quot;on&amp;quot; schaltet weißes Licht mit 100% ein. (Ausnahme Milight/RGB(old) da dort kein weiß unterstützt wird: 100% rot)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Erweiterte Parameter:&lt;br /&gt;
* ramp&lt;br /&gt;
&lt;br /&gt;
==== dim ====&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; dim level&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&amp;quot;dim&amp;quot; behält die aktuell gesetzte Farbe bei und so kann &amp;quot;dim 100&amp;quot; anstelle von &amp;quot;on&amp;quot; verwendet werden wenn die aktuelle Lichtfarbe beibehalten werden soll.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
erweiterte Parameter:&lt;br /&gt;
* ramp&lt;br /&gt;
* queue&lt;br /&gt;
&lt;br /&gt;
==== HSV ====&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; HSV H,S,V&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;Farbangaben im Farbraum &amp;quot;HSV&amp;quot; sind vollständig und in der Regel intuitiver als RGB. H (HUE: 0..360) gibt die Grundfarbe in einem Farbkreis (Regenbogen) an. Rot liegt bei 0°, Grün bei 120° und blau bei 240°. S (Saturation/Sättigung: 0..100) steht für die Sättigung der Farbe. Eine Sättigung von 100 bedeutet die Farbe ist &amp;quot;rein&amp;quot; oder komplett gesättigt. Blau zum Beispiel mit 100% Sättigung entspricht RGB #0000FF. V (Value: 0..100) gibt die Helligkeit an. Ein V von 50 heist: &amp;quot;halbe Helligkeit&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
erweiterte Parameter:&lt;br /&gt;
* ramp&lt;br /&gt;
* queue&lt;br /&gt;
* direction&lt;br /&gt;
* event&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ramp&amp;lt;/code&amp;gt;&lt;br /&gt;
Dieser Parameter steuert einen weichen Übergang zwischen zwei Zuständen und wird in Sekunden angegeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; on&amp;lt;/code&amp;gt; : schaltet die LED sofort an.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; on 20&amp;lt;/code&amp;gt; : Die LED wird über einen Zeitraum von 20 Sekunden weich hoch-gedimmt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;queue&amp;lt;/code&amp;gt;&lt;br /&gt;
Angenommen das Modul arbeitet gerade intern eine Transition, also dem weichen Übergang zu einem anderen Zustand (siehe ramp), ab. Der user setzt während der Transition einen weiteren Befehl für die LED ab.&lt;br /&gt;
&lt;br /&gt;
Ohne den Parameter &amp;quot;q&amp;quot; wird die laufende Transition sofort unterbrochen und der neue Befehl wird ausgeführt.&lt;br /&gt;
Mit dem Parameter &amp;quot;q&amp;quot; wird der neue Befehl in eine interne Queue geschrieben und erst bearbeitet nachdem die laufende Transition, und alle vorher in die Queue geschriebenen Befehle, abgearbeitet wurden.&lt;br /&gt;
&lt;br /&gt;
Dadurch wird es möglich das mit einem Befehl mehrere ganz unterschiedliche Farb- oder Helligkeitswechsel an das modul übergibt die dann nacheinander abgearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;direction&amp;lt;/code&amp;gt;&lt;br /&gt;
Im HSV Farbraum entsprechen die Farben einem Winkel (0° Rot, 120° Grün, 240° Blau). Der weiche Übergang von einer Farbe zu einer anderen wird Standardmäßig auf dem &amp;quot;kürzesten Weg&amp;quot; durchlaufen. Der Wechsel von Grün auf Rot sieht also so aus: 120°, 119°, 118°, ... 2°, 1°, 0°.  Das entspricht der default direction &amp;quot;s&amp;quot; für &amp;quot;short&amp;quot; - dem kürzesten Weg.&lt;br /&gt;
&lt;br /&gt;
Mit dem Flag &amp;quot;l&amp;quot; für &amp;quot;long&amp;quot; (langer Weg) wird die gleiche Transition jetzt mit dem &amp;quot;Umweg&amp;quot; über Blau ausgeführt, also so: 120°, 121°, 122°, ... 358°, 359°, 360° ( = 0°).&lt;br /&gt;
&lt;br /&gt;
==== RGB ====&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; RGB RRGGBB&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;RGB Angaben werden im 6 stelligen Hexadezimalen Format erwartet.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
erweiterte Parameter:&lt;br /&gt;
* ramp&lt;br /&gt;
* queue&lt;br /&gt;
* direction&lt;br /&gt;
* event&lt;br /&gt;
&lt;br /&gt;
===== Unterschiede von Farbangaben HSV zu RGB =====&lt;br /&gt;
Angenommen das Ziel ist ein Farbverlauf Rot (ganz dunkel, Helligkeit 0) auf Blau sowie ein Farbverlauf von Grün (ebenfalls 0) auf Blau. Im RGB Farbraum starten beide Farbverläufe bei #000000 auf gehen dann auf #0000FF. Damit lassen sie sich nicht unterscheiden und anders als erwartet beginnt der Farbverlauf in beiden Fällen mit einem neutralen &amp;quot;Grau&amp;quot; (RGB #010101). Die entsprechende Beschreibung im HSV Farbraumraum ist hingegen eindeutig (120,100,0 -&amp;gt; 240,100,100 für GRÜN 0% auf BLAU 100%) und funktioniert wie erwartet.&lt;br /&gt;
&lt;br /&gt;
==== Erweiterte Funktionen / Transitions ====&lt;br /&gt;
Das Modul unterstützt komplexe programmierbare Farbverläufe. Da diese im Modul berechnet werden hängt die flüssige Wiedergabe von einer ganzen Reihe von Faktoren ab:&lt;br /&gt;
* FHEM Host Hardware&lt;br /&gt;
* FHEM Auslastung und &amp;quot;Kooperation&amp;quot; von anderen Modulen&lt;br /&gt;
* verwendete Leuchtmittel&lt;br /&gt;
* Auslastung der &#039;&#039;Bridge&#039;&#039;  &lt;br /&gt;
Das Modul ist stark optimiert um die Farbverläufe flüssig wiedergeben zu können. Auf der anderen Seite reagiert das menschliche Auge sehr empfindlich. Deshalb sind gelegentliche &amp;quot;Sprünge&amp;quot; bei Farbverläufen unvermeidlich und sehr von der konkreten Umgebung abhängig.&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Wifi-Leuchtmittel ==&lt;br /&gt;
&lt;br /&gt;
=== RGB LED (Streifen) am LW12 Wifi LED Controller === &lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: Vom LW12 existieren mindestens zwei Ausführungen. Unterscheidbar am &amp;quot;eigenen&amp;quot; WLAN. LW12 spannt ein Netz mit der Bezeichnung &amp;quot;LEDNET...&amp;quot; auf. LW12 - HX001 spannt ein Netz mit der Bezeichnung &amp;quot;HX...&amp;quot; auf. Beide Typen werden unterstützt, müssen jedoch mit anderer Signatur definiert werden}}&lt;br /&gt;
[[Datei:LW12.JPG|mini|LW12 LED stripe WiFi Controller]]&lt;br /&gt;
&lt;br /&gt;
Der LW12 vereint die LED Steuereinheit und den Wifi Empfänger. Zum Betrieb ist noch der LED Streifen mit gemeinsamer Anode sowie ein in Spannung und Leistung zum LED Streifen passendes Netzteil erforderlich. Alle Anschlüsse am Controller sind als Schraubklemmen ausgeführt.&lt;br /&gt;
&lt;br /&gt;
==== Alternative Bezeichnungen ==== &lt;br /&gt;
* WF200 Controller &lt;br /&gt;
&lt;br /&gt;
Der Controller erstellt im Werkszustand ein WLAN mit eigener SSID und wird über die vom Hersteller gelieferte Smartphone App in das eigene Netzwerk eingebunden.&lt;br /&gt;
* Android Version im Google PlayStore [https://play.google.com/store/apps/details?id=com.Zengge.LEDWifiMagicColor&amp;amp;hl=de LED Magic Color Controller v2]&lt;br /&gt;
* Apple Version im Apple App-Store [https://itunes.apple.com/de/app/led-magic-color/id595148649?mt=8 LED Magic Color]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Definition erfolgt im Modul so:&lt;br /&gt;
&lt;br /&gt;
LW12 (eigene SSID &amp;quot;LEDNET...&amp;quot;):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WifiLight RGB LW12:&amp;lt;IP|FQDN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
LW12 (eigene SSID &amp;quot;HX...&amp;quot;):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WifiLight RGB LW12HX:&amp;lt;IP|FQDN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es können eine beliebige Anzahl LW12 definiert werden. Ein LW12 steuert jeweils nur einen LED RGB Streifen.&lt;br /&gt;
&lt;br /&gt;
Der LW12 erzeugt weißes Licht durch RGB Farbmischung und unterstützt beliebige Sättigungen sowie Helligkeiten. &amp;lt;strike&amp;gt;Deshalb und wegen seiner hohen Aktualisierungsrate, ist er für reine RGB Streifen die erste Wahl.&amp;lt;/strike&amp;gt; Mittlerweile ist der (bessere) LD382 vom gleichen Hersteller verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zum Betrieb sind der LW12, ein RGB LED Streifen sowie passendes Netzteil (Klemmschrauben) erforderlich.&lt;br /&gt;
&lt;br /&gt;
==== Bezug ====&lt;br /&gt;
&lt;br /&gt;
* Zum Zeitpunkt der Erstellung dieses Artikels ist der LW12 bei eBay von diversen Händlern ab ca 30,- Euro erhältlich.&lt;br /&gt;
* [http://www.amazon.de/NEUER-STRIPS-CONTROLLER-iPhone-Android/dp/B00G55329A/ref=sr_1_1?ie=UTF8&amp;amp;qid=1390006342&amp;amp;sr=8-1&amp;amp;keywords=lw12+led LW12 RGB LED Stripecontroller Amazon]&lt;br /&gt;
&lt;br /&gt;
=== RGB und RGBW LED (Streifen) am LD382 Wifi LED Controller === &lt;br /&gt;
&lt;br /&gt;
Der LD382 vereint die LED Steuereinheit und den Wifi Empfänger. Am LD382 können reine RGB Streifen, RGBW Streifen oder eine Kombination beider angeschlossen werden. Zum Betrieb ist noch der LED Streifen mit gemeinsamer Anode sowie ein in Spannung und Leistung zum LED Streifen passendes Netzteil erforderlich. Alle Anschlüsse am Controller sind als Schraubklemmen ausgeführt, das Netzteil verfügt zusätzlich über einen Steckeranschluss.&lt;br /&gt;
&lt;br /&gt;
Der LD382 verfügt über einen WPS Button, kann also per &amp;quot;one-click&amp;quot; ins Netzwerk genommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Alternative Bezeichnungen ==== &lt;br /&gt;
* LED Magic UFO (XCSOURCE)&lt;br /&gt;
&lt;br /&gt;
Die Definition erfolgt im Modul so:&lt;br /&gt;
&lt;br /&gt;
LD382 mit RGB Streifen (Weiß wird gemischt)&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WifiLight RGB LD382:&amp;lt;IP|FQDN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
LD382 mit RGBW Streifen (oder Kombination aus RGB und separatem Weiß)&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WifiLight RGBW LD382:&amp;lt;IP|FQDN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RGBW LD316 LED-Lampe Wifi === &lt;br /&gt;
&lt;br /&gt;
Der LD316 vereint LED-Lampe (Fassung E27), Steuereinheit und Wifi Empfänger. Eine externe Steuereinheit ist nicht notwendig. Einfach gegen vorhandene Glühbirne auswechseln. Mittels App (sh. LW12) kann LD316 gesteuert und eingestellt werden. Betrieb im eigenen WLAN ist möglich. Weiterhin sind Einstellungen über den in LD316 vorhandenen Webserver möglich (Benutzer: admin, Kennwort: nimda). &lt;br /&gt;
&lt;br /&gt;
Die Definition erfolgt im Modul so:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WifiLight RGBW LD316:&amp;lt;IP|FQDN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Alternative Bezeichnungen ====&lt;br /&gt;
* WIFI WLAN LED Lampe IWY MASTER Color (RGB)&lt;br /&gt;
* diverse wechselnde Bezeichnungen bei AliExpress&lt;br /&gt;
&lt;br /&gt;
==== Bezug ====&lt;br /&gt;
* Amazon, ab und an vorhanden, Preis schwankt zwischen 40 und 55 €&lt;br /&gt;
* ebay, ab und an vorhanden, Preis meist um 45 €&lt;br /&gt;
* AliExpress, fast immer was zu finden, Preis zwischen 22 $ und 34 $, Coupon beim Angebot beachten, [http://de.aliexpress.com/item/Free-shipping-smartphone-controlled-lights-bulb-7w-e27-rgbw-colors/32437430102.html?adminSeq=223453226&amp;amp;shopNumber=1763377 Beispiel 1], [http://de.aliexpress.com/item/LED-Smart-bulb-7-5w-E27-RGB-LED-WIFI-Bulb-Light-Color-Temperature-Brightness-Adjustable-Light/32254107494.html?adminSeq=201473654&amp;amp;shopNumber=811614 Beispiel 2]&lt;br /&gt;
&lt;br /&gt;
=== sengled Boost LED-Lampe Wifi === &lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Sengled Boost.JPG|sengled Boost&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Die sengled Boost vereint eine Weiß-LED-Lampe (Fassung E27), Wifi Empfänger und Steuereinheit und bietet eine Wifi Repeater Funktion. Eine externe Steuereinheit ist nicht notwendig. Einfach gegen vorhandene Glühbirne auswechseln. Mittels App (&amp;quot;sengled Boost&amp;quot; unter [http://forum.fhem.de/index.php/topic,36811.0.html Android] oder [https://itunes.apple.com/de/app/sengled-boost/id848792893?mt=8 iOS]) kann die sengled Boost gesteuert und eingestellt werden. Betrieb im eigenen WLAN ist möglich. Weiterhin sind Einstellungen (besonders zur Wifi Repeater Funktion) über den in der sengled Boost vorhandenen Webserver möglich (Benutzer: admin, Kennwort: admin). &lt;br /&gt;
&lt;br /&gt;
Die Definition erfolgt im Modul so:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; WifiLight White SENGLED:&amp;lt;IP|FQDN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen können im entsprechenden {{Link2Forum|Topic=36811|LinkText=Forumsthema}} nachgelesen werden.&lt;br /&gt;
&lt;br /&gt;
=== Milight Systeme für LED Streifen und E27 Leuchtmittel === &lt;br /&gt;
&lt;br /&gt;
Milight Leuchtmittel sind von diversen Herstellern unter diversen Handelsnamen erhältlich. Verfügbar sind preiswerte Ansteuerungen (RGB, RGB oder Weiß, RGB und Weiß, Warm- und Kaltweiß) für LED Streifen, Downlights sowie E27 Leuchtmittel. Die E27 Leuchtmittel haben den Empfänger integriert und können direkt in vorhandenen Fassungen eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die Lampen / Controller sprechen ein proprietäres 2,4GHz Protokoll. Zur Ansteuerung mit fhem wird eine zusätzliche bridge benötigt.&lt;br /&gt;
&lt;br /&gt;
==== Alternative Bezeichnungen ==== &lt;br /&gt;
* Rocket LED&lt;br /&gt;
* Limitless LED&lt;br /&gt;
* Easybulb&lt;br /&gt;
* s`luce iLight&lt;br /&gt;
* iBulb &lt;br /&gt;
* Kreuzer&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
==== Milight WiFi bridge ====&lt;br /&gt;
aktuell sind vier bridge Versionen erschienen (v1 .. v4) wobei die v1 praktisch nicht mehr erhältlich ist und nicht unterstützt wird. Der bridge erstellen im Werkszustand ein WLAN mit eigener SSID und werden über eine Smartphone App in das eigene Netzwerk eingebunden. Zum Betrieb ist ein 5V USB Netzteil erforderlich. Ein Betrieb an den USB Ports des Host ist möglich, wegen eventueller Energiemanagement Funktionen des Host jedoch nicht empfohlen.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
BridgeV2.JPG|Milight v2 bridge&lt;br /&gt;
BridgeV3.JPG|Milight v3 bridge mit Limitless Aufkleber&lt;br /&gt;
BridgeV4.JPG|Milight v4 bridge&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Milight bridge v2 =====&lt;br /&gt;
&lt;br /&gt;
Die v2 bridge hört auf UDP Port 50000 und ist typischerweise am blauen Etikett erkennbar. Eine v2 bridge kann ansteuern:&lt;br /&gt;
* ein RGB Leuchtmittel &lt;br /&gt;
ODER&lt;br /&gt;
* ein RGBW1 Leuchtmittel&lt;br /&gt;
UND&lt;br /&gt;
* vier Gruppen Warmwhite/Coldwhite (White)&lt;br /&gt;
&lt;br /&gt;
===== Milight bridge v3 =====&lt;br /&gt;
&lt;br /&gt;
Die v3 bridge hört auf UDP Port 8899 und hat typischerweise ein dunkles Etikett. Eine v3 bridge kann ansteuern:&lt;br /&gt;
* ein RGB Leuchtmittel &lt;br /&gt;
ODER&lt;br /&gt;
* ein RGBW1 Leuchtmittel&lt;br /&gt;
&lt;br /&gt;
UND&lt;br /&gt;
&lt;br /&gt;
* vier Gruppen Warmwhite/Coldwhite (White)&lt;br /&gt;
UND&lt;br /&gt;
* vier Gruppen RGB + White (RGBW2)&lt;br /&gt;
&lt;br /&gt;
===== Milight bridge v4 =====&lt;br /&gt;
&lt;br /&gt;
Die Funktionen der v4 entsprechen im wesentlichen der v3, allerdings ist das WLAN Modul ein anderes (Draft-N) und das Web Interface wurde entfernt. &lt;br /&gt;
&lt;br /&gt;
==== Leuchtmittel ====&lt;br /&gt;
&lt;br /&gt;
===== Milight Leuchtmitteltyp RGB =====&lt;br /&gt;
&lt;br /&gt;
E27, LED Streifen Controller oder Downlight.&lt;br /&gt;
&lt;br /&gt;
Dieser Typ RGB Leuchtmittel ist veraltet und von Neuanschaffungen wird abgeraten. Die Ansteuerung ist nur im Farbkreis möglich (keine volle RGB Mischung, keine Sättigung, kein Weiß). Das Protokoll zur Ansteuerung dieses Typ ist fehleranfällig und sehr langsam. Eine parallele Benutzung der FB oder der App verursacht ebenfalls Fehler. &lt;br /&gt;
&lt;br /&gt;
Benötigt eine bridge ab v2.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Milight-RGB-Stripe.jpg|Milight RGB LED stripe Controller mit FB&lt;br /&gt;
Milight-RGB-e27.JPG|Milight RGB e27 mit FB&lt;br /&gt;
Milight-RGB-downlight.JPG|s&#039;luce RGB Downlight&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Milight Leuchtmitteltyp RGBW1 =====&lt;br /&gt;
&lt;br /&gt;
LED Streifen Controller. (RGB mit separatem Weiß Kanal)&lt;br /&gt;
&lt;br /&gt;
Dieser Typ RGB Leuchtmittel ist veraltet. &lt;br /&gt;
&lt;br /&gt;
FHEM kann mit diesem Controller Farbe, Helligkeit und Sättigung komplett steuern. Durch den extra Weißkanal sind sehr angenehme Farbmischungen möglich allerdings ist das verwendete Protokoll wie beim RGB langsam und fehleranfällig. Daher eignet sich der Controller nicht für häufige dynamische Farbwechsel und nur bedingt für unbeaufsichtigten / automatischen Betrieb. &lt;br /&gt;
&lt;br /&gt;
Die Sättigung wird durch die Balance des Weiß- und des Farbkanals erreicht. Bei einer Sättigung von 50% werden Weiß und Farbe jeweils voll angesteuert. &lt;br /&gt;
&lt;br /&gt;
Benötigt eine bridge ab v2.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Milight-RGBW1.JPG|Milight RGBW LED stripe Controller mit FB&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Milight Leuchtmitteltyp White =====&lt;br /&gt;
&lt;br /&gt;
E27, LED Streifen Controller oder Downlight.&lt;br /&gt;
&lt;br /&gt;
Pur weiße LED Leuchtmittel mit Unterstützung der Farbtemperatur (Kaltweiß/Warmweiß).&lt;br /&gt;
&lt;br /&gt;
FHEM steuert die Helligkeit der Leuchtmittel. Ein Unterstützung der Farbtemperatur (Weiß Kelvin) ist noch nicht implementiert. Die Farbtemperatur sollte initial über die app eingestellt werden und wird von den Leuchtmitteln beibehalten. Die e27 Lampen sind zum Zeitpunkt der Erstellung dieses Artikels (04/14) ab etwa 11,- Euro bei eBay verfügbar. Erhältlich in 9Watt (Alukühlkörper) und in 6Watt (OEM, Kunststoffsockel). Die Lichtausbeute ist sehr gut.&lt;br /&gt;
&lt;br /&gt;
Benötigt eine bridge ab v2. Eine bridge kann vier getrennte Gruppen White ansteuern. Wenn mehr als vier Gruppen eingesetzt werden sollen können weitere bridge eingebunden werden. &lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Milight-WWCW-FB.JPG|Milght Warmweiß/kaltweiß LED Streifen controller mit FB&lt;br /&gt;
Milight-E27-WWCW-OEM.JPG|Milight Warmweiß/kaltweiß 6 Watt E27 OEM&lt;br /&gt;
Milight-E27-WWCW-9W.JPG|Milight Warmweiß/kaltweiß 9 Watt E27&lt;br /&gt;
Milight-Downlight-WWCW.JPG|Milight Warmweiß/kaltweiß Downlight (IWY STAR 6 Watt)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Milight Leuchtmitteltyp RGBW2 =====&lt;br /&gt;
&lt;br /&gt;
E27, LED Streifen Controller oder Downlight.&lt;br /&gt;
&lt;br /&gt;
Aktuelle Typen mit neuem und robusterem Protokoll.&lt;br /&gt;
&lt;br /&gt;
Dieser Typ Leuchtmittel gibt farbiges oder weißes Licht. Die Sättigung ist nicht stufenlos sondern 0% oder 100%. Die E27 Typen sind dabei wahlweise mit Warm- oder Kaltweiß bestellbar. &lt;br /&gt;
&lt;br /&gt;
Erhältlich in 9Watt (Alukühlkörper) und in 6Watt (OEM, Kunststoffsockel).&lt;br /&gt;
&lt;br /&gt;
Benötigt eine bridge ab v3. Eine bridge kann vier getrennte Gruppen RGBW2 ansteuern. Mehr als vier Gruppen können mit zusätzlichen bridge verwendet werden. &lt;br /&gt;
&lt;br /&gt;
Die Sättigung wird wie folgt umgesetzt: S: 0..20 =&amp;gt; 0% / S: 21..100 =&amp;gt; 100%.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Bei Farbverläufen (Sonnenaufgang) die bei einer Farbe beginnen und bei Weiß enden kann es sinnvoll sein in zwei Schritten zuerst auf 100% Gelb zu faden, dort auf 20%..40% Weiß (typenabhängig) umzuschalten und dann Weiß weiter auf 100% zu dimmen.&#039;&#039;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Milight-rgbw2-LED.jpg|Milight RGB/Weiß LED Streifen Controller 4 Zonen&lt;br /&gt;
Milight-E27-RGBW2-OEM.JPG|Milight RGB/Weiß 6 Watt E27 OEM&lt;br /&gt;
Milight-E27-RGBW2-9Watt.JPG|Milight RGB/Weiß 9 Watt E27 mit FB&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung: Das modul ist nicht Bestandteil der fhem Standardinstallation weil der dev lieber die Unterstützung neuer Controller einbaut anstelle die Doku zu schreiben :)}}&lt;br /&gt;
Das Modul wird bequem so installiert: &lt;br /&gt;
&amp;lt;code&amp;gt;update force https://raw.githubusercontent.com/herrmannj/wifilight/master/controls_wifilight.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Color-Picker aktivieren ==&lt;br /&gt;
Um den sog. &amp;quot;Color-Picker&amp;quot; zu aktivieren müssen die beiden folgenden Attribute gesetzt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr &amp;lt;name&amp;gt; webCmd RGB&lt;br /&gt;
attr &amp;lt;name&amp;gt; widgetOverride RGB:colorpicker,RGB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Wifiled_colorpicker.png|Colorpicker Beispiel&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen unter [http://www.fhemwiki.de/wiki/Color Color Wiki Artikel]&lt;br /&gt;
&lt;br /&gt;
== Farbiges Icon ==&lt;br /&gt;
Weiterhin kann das Lampen-Icon auch farbig dargestellt werden. Dazu ist es erforderlich, das folgende Attribut zu setzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr &amp;lt;name&amp;gt; devStateIcon {Color_devStateIcon(ReadingsVal($name,&amp;quot;RGB&amp;quot;,&amp;quot;000000&amp;quot;))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread über das Modul im [http://forum.fhem.de/index.php/topic,18958.0.html Fhem Forum]&lt;br /&gt;
* [http://www.ledsee.com/datasheet_ledsee/LED%20WiFi%20controller%20for%20home%20use_Hontech-wins__-EN.pdf LW12 Datasheet]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Pula</name></author>
	</entry>
</feed>