<?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=Slanesh</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=Slanesh"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Slanesh"/>
	<updated>2026-04-10T00:48:04Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Arduino_Firmata&amp;diff=37806</id>
		<title>Arduino Firmata</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Arduino_Firmata&amp;diff=37806"/>
		<updated>2022-12-08T20:08:59Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Device::Firmata Updates: Bis Oktober 2020 wurde eine Kopie des Perl-Moduls &#039;&#039;Device::Firmata&#039;&#039; als Teil von FHEM zur Verfügung gestellt, zuletzt die Version 0.64 aus 05/2018. In neueren Installation von FHEM ist das Modul nicht mehr enthalten. Die aktuelle Version des Moduls gibt es über [[#CPAN|CPAN]]. Bei bestehenden Installationen sollte die vorhandene Kopie des Moduls gelöscht und auf die aktuelle Version umgestellt werden (siehe Punkt 1 dieses {{Link2Forum|Topic=114552|Message=1087982|Linktext=Beitrag}}s im Forum).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Schnittstelle für Firmata-Devices (USB, LAN, WiFi)&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=FRM&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=10_FRM.pm&lt;br /&gt;
|ModOwner=JensB ({{Link2FU|14024|Forum}}/[[Benutzer Diskussion:JensB|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Firmata-Devices ==&lt;br /&gt;
&lt;br /&gt;
Für Arduinos (und diverse kompatible Boards) gibt es eine Standardimplementierung des Kommunikationsprotokolls &#039;&#039;Firmata&#039;&#039; [https://github.com/firmata/protocol]. Mit Hilfe des Perl-Moduls &#039;&#039;Device::Firmata&#039;&#039;, auch bekannt als perl-firmata [https://github.com/ntruchsess/perl-firmata], kann das Firmata-Protokoll in Perl genutzt werden und mit dem Modul [[#FRM|FRM]] auch in FHEM.&lt;br /&gt;
&lt;br /&gt;
Für die Kommunikation zwischen FHEM (Master) und Firmata-Device (Slave) stehen mehrere Schnittstellen zur Auswahl: RS-232, USB, Ethernet und WiFi. Insbesondere Ethernet und WiFi erlauben die Integration dezentraler IO-Periperie mit FHEM.&lt;br /&gt;
&lt;br /&gt;
Firmata ermöglicht es, mit nur geringen Arduino-Kenntnissen digitale und analoge Signale aus eigenen Schaltungen in FHEM zu verarbeiten. Dabei können Signale sowohl eingelesen als auch ausgegeben werden. Ein Verständnis der Bedienung der Arduino-IDE und elektronische Kenntnisse zum Anschluss von Sensoren und Aktoren sind natürlich erforderlich.&lt;br /&gt;
&lt;br /&gt;
=== Arduino IDE ===&lt;br /&gt;
&lt;br /&gt;
Zur Installation von Firmware auf dem Firmata-Device wird natürlich erst mal die Arduino-IDE (Version 1.8 oder höher) benötigt [https://www.arduino.cc/en/main/software]. Die gibt es für die Betriebssysteme Windows, Mac OS X und Linux.&lt;br /&gt;
&lt;br /&gt;
Über die Bibliotheksverwaltung der Arduino-IDE (Menü &#039;Sketch&#039;-&amp;amp;gt;&#039;Bibliothek einbinden&#039;-&amp;amp;gt;&#039;Bibliotheken verwalten...&#039;) stehen verschiedene Firmware-Versionen von Firmata zur Auswahl. Im folgenden wird auf die Version &amp;quot;Firmata by Firmata Developers&amp;quot; und &amp;quot;ConfigurableFirmata by Firmata Developers&amp;quot; eingegangen. Diese beiden Versionen unterscheiden sich in den unterstützten Hardware-Funktionen:&lt;br /&gt;
&lt;br /&gt;
* Firmata: digitale und analoge I/Os, Servos, I2C&lt;br /&gt;
* ConfigurableFirmata: zusätzlich 1-Wire und Schrittmotoren&lt;br /&gt;
&lt;br /&gt;
Bei ConfigurableFirmata ist es auch außerdem einfacher, nicht benötigte Funktionen zu deaktivieren, damit die Firmware möglichst wenig Speicher belegt. Wenn man den zusätzlichen Funktionsumfang von ConfigurableFirmata nicht benötigt, kann man mit etwas Geschick durch Auskommentieren von nicht benötigtem Code aus Firmata z.T. ein noch kompakteres Ergebnis erzielen (das ist aber nur etwas für Fortgeschrittene).&lt;br /&gt;
&lt;br /&gt;
Bei Firmata ist zwischen der Firmata-Protokoll-Version (z.B. 2.6.0) und der Version der jeweiligen Firmware (Firmata: z.B. 2.5.7, ConfigurableFirmata: z.B. 2.10.0) zu unterscheiden, die insbesondere bei ConfigurableFirmata voneinander unabhängig sind.&lt;br /&gt;
&lt;br /&gt;
Nach Installation der gewünschten Firmata-Firmware wählt man eines der funktionsfertigen Beispiele über das Arduino-IDE Menü &#039;Datei&#039;-&amp;amp;gt;&#039;Beispiele&#039;-&amp;amp;gt;&#039;Firmata&#039; bzw. &#039;Datei&#039;-&amp;amp;gt;&#039;Beispiele&#039;-&amp;amp;gt;&#039;ConfigurableFirmata&#039; aus. Je nach ausgewähltem Beispielprojekt sind noch Anpassungen direkt im Sketch oder in einer zusätzlichen Konfigurationsdatei erforderlich (z.B. um für Ethernet- und WiFi-Schnittstellen die Netzwerkparameter einzustellen).&lt;br /&gt;
&lt;br /&gt;
Über das Arduino-IDE Menü &#039;Werkzeuge&#039;-&amp;amp;gt;&#039;Bords&#039; wählt man das Board aus, das dem eigenen Firmata-Device entspricht. Fehlt das Board in der Auswahl, kann die erforderliche Unterstützung oft über das Menü &#039;Werkzeuge&#039;-&amp;amp;gt;&#039;Bords&#039;-&amp;amp;gt;&#039;Boardverwalter...&#039; nachinstalliert werden. Ansonsten hilft ein Blick auf die Hersteller-Webseiten des Boards.&lt;br /&gt;
&lt;br /&gt;
Ist das Firmata-Device korrekt angeschlossen, drückt man den &#039;Upload&#039;-Knopf (der mit dem Rechspfeil oben links), um den Arduino-Sketch zu kompilieren und auf das Board hochzuladen. Die Vorgehensweise zum Hochladen ist sehr stark davon abhängig, welches Board man verwendet und mit welcher Technik es angeschlossen ist. Bitte die jeweiligen Angaben des Board-Herstellers beachten.&lt;br /&gt;
&lt;br /&gt;
Wer zum ersten mal mit der Arduino-IDE arbeitet, sollte statt Firmata zunächst das Standard Arduino Beispielprojekt &#039;Blink&#039; auswählen und es auf dem Firmata-Device installieren. Sobald das klappt, kann man mit Firmata weiter machen.&lt;br /&gt;
&lt;br /&gt;
=== Firmata mit Ethernet oder WiFi ===&lt;br /&gt;
&lt;br /&gt;
Vor dem Kompilieren muss man unbedingt die Netzwerkparameter anpassen, d.h. die IP-Adresse des FHEM-Servers und den Port des FRM-Moduls eintragen (ggf. auch eine neue eindeutige MAC-Adresse), bei WiFi auch die SSID und den PSK. In älteren Firmata-Versionen und bei ConfigurableFirmata geschieht das direkt im Sketch. Aktuelle Firmata-Versionen haben dazu eine getrennte Konfigurationsdatei (ethernetConfig.h bzw. wifiConfig.h), so dass keine Änderungen am Sketch erforderlich sind.&lt;br /&gt;
&lt;br /&gt;
Falls der Speicherbedarf der kompilierten Firmware die Möglichkeiten des Boards übersteigt (insbesondere bei Verwendung eines ENC28J60-Ethernet-Shields [https://github.com/ntruchsess/arduino_uip] in Kombination mit einem &amp;quot;kleinen&amp;quot; Arduiono wie den Uno oder Nano) kann man bei Verwendung von ConfigurableFirmata nicht benötigten Features im Sketch auskommentieren. Wenn der Speicherbedarf nur &amp;quot;knapp&amp;quot; ausreicht, läuft die Firmware u.U. trotzdem nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
Als ersten Funktionstest für die Netzwerkverbindung empfiehlt sich ein Ping von FHEM zum Firmata-Device.&lt;br /&gt;
&lt;br /&gt;
=== Sonderfälle ===&lt;br /&gt;
&lt;br /&gt;
Je nach verwendetem Board sind u.U. individuelle Besonderheiten zu berücksichtigen. Hier ein paar Beispiele:&lt;br /&gt;
&lt;br /&gt;
Ein MEGA256 z.B. benutzt einen anderen Pin als SS (Slave select) zur Kommunikation mit dem Ethernetmodul. Man muss der Firmata im Setup mitteilen, welche Pins zu ignorieren sind, damit es keine Wechselwirkungen zwischen Firmata und Ethernet Library gibt. Das ist im ConfigurableFirmata-Sketch [https://github.com/firmata/arduino/blob/configurable/examples/ConfigurableFirmata/ConfigurableFirmata.ino] vorbereitet und muss (wenn man etwas anderes als ein Standard-Ethernetshield am Uno verwendet) geeignet angepasst werden (Beim Mega muss man z.B. den Pin 10 ignorieren und Pin 53 als hardcodiert auf Output stellen). Das gleiche gilt, wenn man eine andere Hardware (z.B. mit ENC28J60 anstelle des WizNet W5100 des Ethernetshields) benutzen möchte, die einen anderen Pin als CS/SS benutzt.&lt;br /&gt;
&lt;br /&gt;
== FHEM FRM-Device ==&lt;br /&gt;
&lt;br /&gt;
Bei FHEM stellt ein FRM-Device (Modul 10_FRM.pm) für die FRM-Client-Devices die Schnittstelle (das IODev) zum Firmata-Device zur Verfügung. Jeder FRM-Client erlaubt die Konfiguration eines oder mehrerer Pins eines Firmata-Devices z.B. als analoger Eingang, digitaler Ausang oder I2C-Bus. Es können so viele FRM-Clients für ein FRM-Device definiert werden, bis alle Pins zugeordnet sind. Dabei muss man darauf achten, dass nicht alle Pins alle Ein-/Ausgabemöglichkeiten besitzen. Konfiguriert man einen Pin für einen nicht unterstützen Modus so gibt es bei aktuellen Firmata-Versionen eine Fehlermeldung. Ältere Versionen (vor 2.3) schlucken Fehlkonfigurationen aber der betreffende Pin funktioniert dann nicht.&lt;br /&gt;
&lt;br /&gt;
Vor dem Anlegen des FRM-Devices muss das Perl-Modul &#039;&#039;Device::Firmata&#039;&#039; installiert werden. Dies kann abhänig von den vorhandenen Voraussetzung und Vorlieben auf unterschiedliche Weise erfolgen, Details zur Installation und zum Update von Perl-Modulen finden sich im [[#CPAN|Artikel über CPAN]]. Eine mögliche Installationsvariante auf einem Raspberry Pi ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  sudo cpan install Device::Firmata&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Beispiele für das Anlegen eines FRM-Devices:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;# definiere FRM mit USB-Schnittstelle /dev/ttyUSB0, Baudrate 57600 ist Default für StandardFirmata&lt;br /&gt;
   define FIRMATA FRM /dev/ttyUSB0@57600&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;# definiere FRM mit TCP/IP-Schnittstelle auf Port 3030&lt;br /&gt;
   define FIRMATA FRM 3030 global&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FRM öffnet bei Netzwerkverbindungen FHEM-seitig einen Serverport (dieser wird in der define-Zeile angegeben). &#039;global&#039; muss zusätzlich angegeben werden, damit der Serversocket an alle IP-Adressen gebunden wird. Ohne &#039;global&#039; sind nur Verbindungen für &#039;localhost&#039; möglich. Das Firmata-Device verbindet sich aktiv zu diesem Port, sonst gilt im Prinzip alles was auch für den über USB angebunden Firmata-Device gilt.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;# für alle analogen Eingangs-Pins&lt;br /&gt;
   attr FIRMATA sampling-interval 1000 # [ms] - maximal 16384 setzbar&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM}} FRM&lt;br /&gt;
&lt;br /&gt;
Hat man mehrere FRM-Devices definiert, muss man nach dem Anlegen eines FRM-Client-Devices dessen Attribut &#039;&#039;IODev&#039;&#039; überprüfen und ggf. ändern, wenn das gewünschte FRM-Device nicht automatisch erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
Es folgt eine Auflistung der generischen FRM-Client-Devices. Darüber hinaus gibe es noch mehrere spezialisierte FRM-Client-Devices, vor allem für I2C-Bus-Devices (siehe {{Link2CmdRef}}):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_IN.pm ===&lt;br /&gt;
&lt;br /&gt;
Macht einen Pin als digitalen Eingang nutzbar.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;define Firmata_IN FRM_IN 12 # definiert Pin 12 als digitalen Eingang&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_IN}} FRM_IN&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_OUT.pm ===&lt;br /&gt;
&lt;br /&gt;
Macht einen Pin als digitalen Ausgang nutzbar.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;define Firmata_OUT FRM_OUT 11 # definiert Pin 11 als digitalen Ausgang&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_OUT}} FRM_OUT&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_AD.pm ===&lt;br /&gt;
&lt;br /&gt;
Macht einen Pin als analogen Eingang nutzbar.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;define Firmata_ANALOG FRM_AD 17 # definiert Pin 17 als analogen Eingang&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_AD}} FRM_AD&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_PWM.pm ===&lt;br /&gt;
&lt;br /&gt;
Macht einen Pin als analogen Ausgang nutzbar. Es wird ein pulsweitenmoduliertes Signal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
  define Firmata_ANALOG FRM_PWM 10 # definiert Pin 10 als PWM-Ausgang&lt;br /&gt;
&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_PWM}} FRM_PWM&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_SERVO.pm ===&lt;br /&gt;
&lt;br /&gt;
Erlaubt die Ansteuerung eines analogen Modelbauservos über einen Pin per PWM.&lt;br /&gt;
&lt;br /&gt;
  define Firmata_ANALOG FRM_SERVO 9 # definiert Pin 9 als Servo-Ausgang&lt;br /&gt;
&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_SERVO}} FRM_SERVO&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_I2C.pm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Erlaubt das Lesen und Schreiben über den I2C-Bus am Firmata-Device.&amp;lt;/p&amp;gt;&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_I2C}}FRM_I2C&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_RGB.pm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Erlaubt das Ansteuern eines RGB-LED-Controller per PWM.&amp;lt;/p&amp;gt;&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_RGB}}FRM_RGB&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_ROTENC.pm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Erlaubt das Auswerten eines Drehgebers.&amp;lt;/p&amp;gt;&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_ROTENC}}FRM_ROTENC&lt;br /&gt;
&lt;br /&gt;
=== 20_FRM_STEPPER.pm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Erlaubt das Ansteuern eines Schrittmotors.&amp;lt;/p&amp;gt;&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=FRM_STEPPER}}FRM_STEPPER&lt;br /&gt;
&lt;br /&gt;
=== OneWire-Firmata ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Der Artikel [[Arduino mit OneWireFirmata]] beschreibt, wie man am Firmata-Device angeschlossene 1-Wire Devices in FHEM einzubindet.&amp;lt;/p&amp;gt;&lt;br /&gt;
siehe auch: {{Link2CmdRef|Anker=OWX}} OWX&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other_Components]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Chart&amp;diff=37405</id>
		<title>FTUI Widget Chart</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Chart&amp;diff=37405"/>
		<updated>2022-04-25T10:35:42Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: /* Attribute */ data-xtext_offset ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [[{{PAGENAME}}|Chart Widget]] ist ein Widget für [[FHEM Tablet UI]], mit dem sich verschiedenste Diagramme darstellen lassen. Die Aneinanderreihung mehrerer Werte eines Device-Readings zu einem zeitlichen Verlauf wird dabei als Graph bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Es können beliebige Werte dargestellt und entsprechend der Sinnhaftigkeit, oder persönlichem Geschmack, formatiert werden. Farbe und Form der Linien sind je Graph einstellbar, auch wenn mehrere gleichzeitig in einem Diagramm angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
Jedes Diagramm kann zwei Y-Achsen besitzen. Die primäre Y-Achse (primary) wird auf der linken Seite angezeigt, die sekundäre Y-Achse (secondary) auf der rechten Seite. Beide Achsen können unterschiedlich formatiert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Chart_tabletUI.png&lt;br /&gt;
Datei:FTUI Widget Chart Stacked.png&lt;br /&gt;
Datei:FTUI Widget Chart-fc-Proplanta.png&lt;br /&gt;
Datei:Wetterchart2.png&lt;br /&gt;
Datei:PieChart.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:150px&amp;quot; |Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Standard-Wert&lt;br /&gt;
!Beispiel&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-device&#039;&#039;&#039;||Name des FHEM-Device, das die Aktualisierung des Charts triggert||||data-device=&amp;quot;WohnzimmerHeizung&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get&#039;&#039;&#039;||Reading, das das Update des Diagramms triggert||&#039;STATE&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-logdevice&#039;&#039;&#039;||Name des Log-Device, das dargestellt werden soll, oder ein Array, um mehrere Werte in einem Diagramm darzustellen||||data-logdevice=&amp;quot;FileLog_WohnzimmerHeizung&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-logfile&#039;&#039;&#039;|| Name des Log-Files, aus dem die Daten entnommen werden sollen (oder Array)||&#039;-&#039; = aktuelle Datei||data-logfile=&amp;quot;WohnzimmerHeizung-2015.log&amp;quot;&amp;lt;br&amp;gt;Beachte: Der Wert &amp;quot;CURRENT&amp;quot; ermöglicht die Navigation auch zu älterne Logfiles (Jahreswechsel)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-columnspec&#039;&#039;&#039;||Ermittelt den Wert aus dem Log-File, der angezeigt werden soll (oder Array)||||data-columnspec=&amp;quot;4:meas.*&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-style&#039;&#039;&#039;||Stil, wie die Graph-Linien dargestellt werden sollen (z.B. &#039;SVGplot l0&#039; oder &#039;ftui l0dash&#039;), oder ein Array, wenn mehrere Linien unterschiedlich dargestellt werden sollen (siehe [[#Aussehen_der_Linien|Hinweise]])||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-ptype&#039;&#039;&#039;||Form, wie die Graphen dargestellt werden sollen (z.B. &#039;lines&#039;, &#039;cubic&#039; oder &#039;fa-cog&#039;), oder ein Array (siehe [[#Form_der_Linien|Hinweise]])||&#039;lines&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-uaxis&#039;&#039;&#039;||Name der Achse, die verwendet werden soll (&#039;primary&#039; = links, oder &#039;secondary&#039; = rechts), oder ein Array||&#039;primary&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-legend&#039;&#039;&#039;||Bezeichnung des Graphen (wird in Legende und am Cursor angezeigt), oder ein Array||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-minvalue&#039;&#039;&#039;||Minimaler Wert, der auf der linken Y-Achse (&#039;primary&#039;) angezeigt werden soll. &#039;auto&#039; = automatische Berechnung||&#039;10&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-maxvalue&#039;&#039;&#039;||Maximaler Wert, der auf der linken Y-Achse (&#039;primary&#039;) angezeigt werden soll. &#039;auto&#039; = automatische Berechnung||&#039;30&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-minvalue_sec&#039;&#039;&#039;||Minimaler Wert, der auf der rechten Y-Achse (&#039;secondary&#039;) angezeigt werden soll. &#039;auto&#039; = automatische Berechnung||&#039;auto&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-maxvalue_sec&#039;&#039;&#039;||Maximaler Wert, der auf der rechten Y-Achse (&#039;secondary&#039;) angezeigt werden soll. &#039;auto&#039; = automatische Berechnung||&#039;auto&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-xticks&#039;&#039;&#039;||Abstand zwischen den vertikalen Hilfslinien (bezogen auf die X-Achse) in Minuten. &#039;auto&#039; = automatische Berechnung||&#039;auto&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-yticks&#039;&#039;&#039;||Abstand zwischen den horizontalen Hilfslinien (bezogen auf die linke Y-Achse). Kann auch ein Array mit Werte-Paaren enthalten, um die Linien mit Text zu beschriften.||&#039;auto&#039;||data-yticks=&#039;[[0,&amp;quot;open&amp;quot;],[1,&amp;quot;closed&amp;quot;]]&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-yticks_format&#039;&#039;&#039;||Dient zur Formatierung der Ticks der Y-Achse. Die Formatierung geschieht über Platzhalter, Trenner und einen beliebigen durch &#039; &#039; getrennten Text. Als Platzhalter dient ein oder mehrere &#039;#&#039;, als Trenner können &#039;.&#039;, &#039;,&#039; und &#039;:&#039; verwendet werden. Ist ein Trenner enthalten (z.B. &#039;#.##&#039;) dann bedeutet das in dem Beispiel, dass der Ytick mit 2 Nachkommastellen versehen wird und vorne Platz für eine Stelle vor dem Komma vorgehalten wird (führende Nullen werden nicht dargestellt, aber de Platz wird reserviert so dass das ganze rechtsbündig immer passt). Ist kein Trenner vorhanden, dann wird der Ytick auf die Summe der Platzhalter mit einer festen Gesamtbreite gesetzt (#### würde also bedeuten, dass immer 4 Stellen (ohne Trenner) verwendet werden. aus 0.4 würde 0.400 aus 10.437 würde 10.44). Als Trenner kann man z.B. für Zeiten auch einen &#039;:&#039; verwenden und dadurch auch so etwas wie &amp;quot;12:00 Uhr&amp;quot; realisieren (in dem Beispiel wäre data-yticks_format=&amp;quot;##:## Uhr&amp;quot; und kein data-yunit oder data-yticks=&amp;quot;##:##&amp;quot; und data-yunit=&amp;quot;Uhr&amp;quot;).||||data-yticks_format=&amp;quot;#.##&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-yticks_sec&#039;&#039;&#039;||Abstand zwischen den horizontalen Hilfslinien (bezogen auf die rechte Y-Achse). Kann auch ein Array mit Werte-Paaren enthalten, um die Linien mit Text zu beschriften.||&#039;auto&#039;||data-yticks=&#039;[[0,&amp;quot;open&amp;quot;],[1,&amp;quot;closed&amp;quot;]]&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-yticks_format_sec&#039;&#039;&#039;||Dient zur Formatierung der Ticks der Y-Achse. Die Formatierung geschieht über Platzhalter, Trenner und einen beliebigen durch &#039; &#039; getrennten Text. Als Platzhalter dient ein oder mehrere &#039;#&#039;, als Trenner können &#039;.&#039;, &#039;,&#039; und &#039;:&#039; verwendet werden. Ist ein Trenner enthalten (z.B. &#039;#.##&#039;) dann bedeutet das in dem Beispiel, dass der Ytick mit 2 Nachkommastellen versehen wird und vorne Platz für eine Stelle vor dem Komma vorgehalten wird (führende Nullen werden nicht dargestellt, aber de Platz wird reserviert so dass das ganze rechtsbündig immer passt). Ist kein Trenner vorhanden, dann wird der Ytick auf die Summe der Platzhalter mit einer festen Gesamtbreite gesetzt (#### würde also bedeuten, dass immer 4 Stellen (ohne Trenner) verwendet werden. aus 0.4 würde 0.400 aus 10.437 würde 10.44). Als Trenner kann man z.B. für Zeiten auch einen &#039;:&#039; verwenden und dadurch auch so etwas wie &amp;quot;12:00 Uhr&amp;quot; realisieren (in dem Beispiel wäre data-yticks_format=&amp;quot;##:## Uhr&amp;quot; und kein data-yunit oder data-yticks=&amp;quot;##:##&amp;quot; und data-yunit=&amp;quot;Uhr&amp;quot;).||||data-yticks_format_sec=&amp;quot;#.##&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-yticks_prio&#039;&#039;&#039;||Legt fest, ob die horizontalen Hilfslinien der linken (primary) oder der rechten (secondary) Y-Achse zugeordnet werden sollen||||data-yticks_prio=&#039;secondary&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-ytype&#039;&#039;&#039;||Legt fest, ob die primäre y Achse logarithmisch sein soll (wert &amp;quot;log&amp;quot;)||||data-ytype=&amp;quot;log&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-ytype_sec&#039;&#039;&#039;||Legt fest, ob die sekundäre y Achse logarithmisch sein soll (wert &amp;quot;log&amp;quot;)||||data-ytype_sec=&amp;quot;log&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-margin&#039;&#039;&#039;|||Abstand zwischen Buttons und Chart (Einheit Pixel). ||&amp;quot;0&amp;quot;|||data-margin=&amp;quot;10&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-y_margin&#039;&#039;&#039;|||Gibt die Möglichkeit, Abstände zwischen den Graphen und dem oberen Rand des Plots zu definieren (Einheit Pixel). Falls der Wert skalar ist, werden oben und unten die gleichen Abstände eingehalten. Falls ein 2D Array angegeben wird, können die Werte unten (erster Wert im Array) und oben (zweiter Wert im Array) getrennt festgelegt werden||&amp;quot;0&amp;quot;|||data-y_margin=&#039;[&amp;quot;10&amp;quot;,&amp;quot;20&amp;quot;]&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-y_margin_sec&#039;&#039;&#039;|||Gibt die Möglichkeit, Abstände zwischen den Graphen und dem oberen Rand des Plots zu definieren (Einheit Pixel). Falls der Wert skalar ist, werden oben und unten die gleichen Abstände eingehalten. Falls ein 2D Array angegeben wird, können die Werte unten (erster Wert im Array) und oben (zweiter Wert im Array) getrennt festgelegt werden||&amp;quot;0&amp;quot;|||data-y_margin=&#039;[&amp;quot;10&amp;quot;,&amp;quot;20&amp;quot;]&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-daysago_start&#039;&#039;&#039;||Anzahl der vergangenen Tage, wo das Diagramm beginnen soll. &#039;0&#039; = Beginn heute 0:00 Uhr. (siehe [[#Zeitstrahl_.2F_Start_.26_Ende_auf_der_X-Achse|Hinweise]])||&#039;0&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-daysago_end&#039;&#039;&#039;||Anzahl der vergangenen Tage, wo das Diagramm enden soll. &#039;-1&#039; = Ende heute 24:00 Uhr. (siehe [[#Zeitstrahl_.2F_Start_.26_Ende_auf_der_X-Achse|Hinweise]])||&#039;-1&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-xticks_round&#039;&#039;&#039;||Wenn vorhanden und entweder &#039;h&#039;, &#039;d&#039;, &#039;w&#039;, wird auf Stunde, Tag oder Woche bei den xticks gerundet (also die Tickmarks und die Gridlines bei den entsprechend gerundeten Zeiten gesetzt). Es kann auch &#039;auto&#039; angegeben werden, um eine autmoatische Rundung durchzuführen||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-nofulldays&#039;&#039;&#039;||Aktiviert/deaktiviert die Rundung der X-Achse auf ganze Tage. Binärwert (&#039;true&#039; oder &#039;false&#039;)||&#039;false&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-timeformat&#039;&#039;&#039;||Zeitformat für die Anzeige an der X-Achse (siehe [[#Zeitformat_der_X-Achse|Hinweise]])||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-timeranges&#039;&#039;&#039;||Hierdurch können vordefinierte Zeiträume für die X-Achse festgelegt werden, die dann durch eine pulldown menu (neuer Button oben neben dem &amp;quot;-&amp;quot; Button) direkt ausgewählt werden können. Der Parameter ist ein Array aus Array Einträgen, welche jeweils [&amp;lt;Name&amp;gt;,&amp;lt;daysago_start&amp;gt;,&amp;lt;daysago_end&amp;gt;] enthalten)||&lt;br /&gt;
||data-timeranges=&#039;[&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Actual Year&amp;quot;,&amp;quot;0Y&amp;quot;,&amp;quot;-1Y&amp;quot;],&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Last Year&amp;quot;,&amp;quot;1Y&amp;quot;,&amp;quot;0Y&amp;quot;],&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Actual Month&amp;quot;,&amp;quot;0M&amp;quot;,&amp;quot;-1M&amp;quot;],&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Last Month&amp;quot;,&amp;quot;1M&amp;quot;,&amp;quot;0M&amp;quot;],&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Actual Week&amp;quot;,&amp;quot;0W&amp;quot;,&amp;quot;-1W&amp;quot;],&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Last Week&amp;quot;,&amp;quot;1W&amp;quot;,&amp;quot;0W&amp;quot;],&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Today&amp;quot;,&amp;quot;0D&amp;quot;,&amp;quot;-1D&amp;quot;],&amp;lt;br&amp;gt;&lt;br /&gt;
[&amp;quot;Yesterday&amp;quot;,&amp;quot;1D&amp;quot;,&amp;quot;0D&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
]&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-ytext&#039;&#039;&#039;||Text, der neben der linken Y-Achse angezeigt wird||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-ytext_sec&#039;&#039;&#039;||Text, der neben der rechten Y-Achse angezeigt wird||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-yunit&#039;&#039;&#039;||Einheit, die an der linken Y-Achse angezeigt wird||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-yunit_sec&#039;&#039;&#039;||Einheit, die an der rechten Y-Achse angezeigt wird||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-show_both_axes&#039;&#039;&#039;||Legt fest ob beide Y-Achsen Linien gezeichnet werden sollen||false||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-crosshair&#039;&#039;&#039;||Aktiviert/deaktiviert den Fadenkreuz-Cursor. Binärwert (&#039;true&#039; oder &#039;false&#039;)||&#039;false&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-cursorgroup&#039;&#039;&#039;||Zahl zur Gruppierung der Werte am Fadenkreuz-Cursor ([[#Fadenkreuz-Cursor|Hinweise]])||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-scrollgroup&#039;&#039;&#039;||Zahl zur Gruppierung der Graphen beim Bewegen und Zoomen. Alle Linien mit der selben Zahl werden miteinander gekoppelt und bewegen sich gemeinsam.||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-showlegend&#039;&#039;&#039;||Aktiviert/deaktiviert die Anzeige der Legene. Binärwert (&#039;true&#039; oder &#039;false&#039;)||&#039;false&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-legendpos&#039;&#039;&#039;||Array von zwei Werten, die die horizontale und vertikale Position der Legende festlegen ([[#Legende|Hinweise]])||&#039;[&amp;quot;right&amp;quot;,&amp;quot;top&amp;quot;]&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-legend_horiz&#039;&#039;&#039;||legt fest, dass die Legendeneinträge horizontal angeordnet sind (anstatt vertikal wie im default Fall)||false||data-legend_horiz=&amp;quot;true&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-width&#039;&#039;&#039;||Breite des Diagramms (in % oder px)||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-height&#039;&#039;&#039;||Höhe des Diagramms (in % oder px)||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-graphsshown&#039;&#039;&#039;||Aktiviert/deaktiviert die initiale Anzeige von Graphen. Binärwert (&#039;true&#039; oder &#039;false&#039;). Array, wenn mehrere Linien angezeigt werden sollen.||||data-graphsshown=&#039;[true,false,true]&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-ddd&#039;&#039;&#039;||Einstellung für die 3D-Drehung ([[#3-dimensionale_Drehung|Hinweise]])||||data-ddd=&#039;[&amp;quot;40&amp;quot;,&amp;quot;60&amp;quot;,&amp;quot;0&amp;quot;]&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-dddspace&#039;&#039;&#039;||Abstand zwischen zwei Graphen, wenn die 3D-Anzeige aktiviert wurde (px)||&#039;15&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-dddwidth&#039;&#039;&#039;||Breite, bzw. Tiefe der Graphen, wenn diese 3-dimensional angezeigt werden (px)||&#039;10&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-title&#039;&#039;&#039;||Titel, der über dem Diagramm angezeigt werden soll. Der Inhalt kann auch dynamisch erzeugt werden ([[#Diagrammtitel|Hinweise]])||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-title_class&#039;&#039;&#039;||Klassenname für die Formatierung des Titels. Die Eigenschaften müssen dann entsprechend in einem CSS File angegeben werden (z.B. in fhem-tablet-ui-user.css)||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-prefetch&#039;&#039;&#039;||Legt fest, ob zusätzliche Daten rechts und links des Plots im Hintergrund vom Server geholt werden sollen||false||data-prefetch=&amp;quot;true&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-xtext_offset&#039;&#039;&#039;&lt;br /&gt;
|Verschiebt den Text auf der x-Achse um die angegebene Anzahl in Minuten.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Einige Parameter (style, maxvalue, minvalue, maxvalue_sec, minvalue_sec) können auch aus Readings dynamisch gesetzt werden wenn &amp;quot;&amp;lt;device&amp;gt;:&amp;lt;reading&amp;gt;&amp;quot; als Parameter gesetzt wird. Damit kann man z.B. in FHEM über notify etc. die Linientypen dynamisch anpassen (z.B. wenn der Wert eines Devices in einem bestimmten Bereich liegt, ändert sich die Farbe des Graphen).&lt;br /&gt;
&lt;br /&gt;
==CSS Klassen==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Klasse!!Beschreibung&lt;br /&gt;
{{FTUI Klasse|fullsize}}{{FTUI Klasse|noticks}}{{FTUI Klasse|nobuttons}}{{FTUI Klasse|small}}{{FTUI Klasse|normal}}{{FTUI Klasse|big}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Folgende Widget-spezifsche Klassen können zusätzlich in einer eigenen CSS-Datei definiert werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Klasse&lt;br /&gt;
!Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;chart-background&#039;&#039;&#039;||Hintergrundfarbe des Diagramms&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;buttons&#039;&#039;&#039;||Größe und Farbe der Buttons&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;text.axes&#039;&#039;&#039;||Generelle Schriftart und Farbe der Achsen&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;gridlines&#039;&#039;&#039;||Generelle Farbe und Größe der Gitternetzlinien&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;xaxis&#039;&#039;&#039;||Schriftart, Größe und Farbe der X-Achse&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;yaxis&#039;&#039;&#039;||Schriftart, Größe und Farbe der Y-Achse&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;xticks&#039;&#039;&#039;||Schriftart, Größe und Farbe der X-Achse (Zwischenlinien)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;yticks&#039;&#039;&#039;||Schriftart, Größe und Farbe der Y-Achse (Zwischenlinien)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;crosshair&#039;&#039;&#039;||Schriftart, Größe und Vordergrund/Hintergrundfarbe der Momentanwerte am Fadenkreuzcursor&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;caption&#039;&#039;&#039;||Schriftart, Größe und Farbe der Text-Buttons für Legende und Cursor&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;legend&#039;&#039;&#039;||Schriftart, Größe und Farbe der Legende&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Standardwerte sind in der Datei &amp;lt;code&amp;gt;css/ftui_chart.css&amp;lt;/code&amp;gt; zu finden.&lt;br /&gt;
&lt;br /&gt;
==Datenquellen==&lt;br /&gt;
Beim Chart-Widget können die gleichen Datenquellen genutzt werden, die auch für SVG-Plots verwendet werden können:&lt;br /&gt;
# [[FileLog]]: Verlaufsdaten einer Textdatei entnehmen&lt;br /&gt;
# [[DbLog]]: Verlaufsdaten einer Datenbank entnehmen&lt;br /&gt;
# [[LogProxy]]: Daten dynamisch berechnet&lt;br /&gt;
&lt;br /&gt;
===FileLog===&lt;br /&gt;
Um [[FileLog]] zu nutzen, wird als &#039;&#039;&#039;data-logdevice&#039;&#039;&#039; das FHEM-Device für das FileLog angegeben. In der Regel entstehen hier im Laufe der Zeit mehrere Log-Dateien. Name und Anzahl sind von der Definition abhängig - meist wird jeden Monat oder jedes Jahr eine neue Datei angelegt. Die gewünschte Datei kann mit &#039;&#039;&#039;data-logfile&#039;&#039;&#039; ausgewählt werden. Möchte man stets die aktuelle Datei verwenden (macht vor allem dann Sinn, wenn man die neusten Daten anzeigen will), kann das Attribut weggelassen, oder explizit &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; eingetragen werden. Zuletzt wird &#039;&#039;&#039;data-columnspec&#039;&#039;&#039; benötigt, um die gewünschten Daten zu in der Logdatei zu identifizieren. Hier wird die Spalte, in der die Daten stehen, gefolgt von Doppelpunkt und Readingname angegeben.&lt;br /&gt;
&lt;br /&gt;
Für ein Heizungsthermostat von Homematic mit dem Namen &#039;&#039;DG.wz.HZ.Heizungsventil&#039;&#039; ergibt sich somit beispielhaft folgende Definition, um gemessene Temperatur, Sollwert und Ventilstellung im Diagramm darzustellen:&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;chart&amp;quot;&lt;br /&gt;
	 data-device=&amp;quot;DG.wz.HZ.Heizungsventil&amp;quot;&lt;br /&gt;
	 data-logdevice=&amp;quot;FileLog_DG.wz.HZ.Heizungsventil&amp;quot;&lt;br /&gt;
	 data-logfile=&amp;quot;-&amp;quot;&lt;br /&gt;
	 data-columnspec=&#039;[&amp;quot;4:measured-temp&amp;quot;,&amp;quot;4:desired-temp&amp;quot;,&amp;quot;4:actuator&amp;quot;]&#039;&lt;br /&gt;
	 ...&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollen Daten von unterschiedlichen Geräten in einem Diagramm angezeigt werden, muss &#039;&#039;&#039;data-logdevice&#039;&#039;&#039; als Array nach dem Schema &amp;lt;code&amp;gt;data-logdevice=&#039;[&amp;quot;&amp;lt;Logdatei_1&amp;gt;&amp;quot;,&amp;quot;&amp;lt;Logdatei_2&amp;gt;&amp;quot;,&amp;quot;&amp;lt;Logdatei_3&amp;gt;&amp;quot;]&#039;&amp;lt;/code&amp;gt; definiert werden. Für jeden Eintrag in &#039;&#039;&#039;data-columnspec&#039;&#039;&#039; muss es auch den passenden Eintrag in &#039;&#039;&#039;data-logdevice&#039;&#039;&#039; geben (auch die Reihenfolge ist relevant).&lt;br /&gt;
&lt;br /&gt;
===DbLog===&lt;br /&gt;
Um die Daten aus [[DbLog]] anzeigen zu können, werden die gleichen Attribute verwendet und mit für die Datenbank angepassten Werten beschrieben. Bei &#039;&#039;&#039;data-logdevice&#039;&#039;&#039; das FHEM-Device für die Datenbank angegeben. Im nachfolgenden Beispiel heißt diese &amp;lt;code&amp;gt;logdb&amp;lt;/code&amp;gt; und besitzt wie üblich zwei Tabellen: &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt; (der zeitliche Verlauf liegt in letzterer). Der Tabellenname wird bei &#039;&#039;&#039;data-logfile&#039;&#039;&#039; eingetragen. Da die Daten in der Datenbank etwas anders abgelegt werden, muss auch &#039;&#039;&#039;data-columnspec&#039;&#039;&#039; entsprechend angepasst werden. Statt der Spalte wird hier das FHEM-Device, gefolgt von Doppelpunkt und Readingname angegeben.&lt;br /&gt;
&lt;br /&gt;
Für das oben beschriebene Homematic-Heizungsthermostat ergibt sich dann folgende Definition, um die gleichen Daten aus einer Datenbank, statt einem LogFile zu lesen:&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;chart&amp;quot;&lt;br /&gt;
	 data-device=&amp;quot;DG.wz.HZ.Heizungsventil&amp;quot;&lt;br /&gt;
         data-get=&amp;quot;measured-temp&amp;quot;&lt;br /&gt;
         data-style=&#039;[&amp;quot;ftui l0&amp;quot;]&#039;&lt;br /&gt;
	 data-logdevice=&amp;quot;logdb&amp;quot;&lt;br /&gt;
	 data-logfile=&amp;quot;HISTORY&amp;quot;&lt;br /&gt;
	 data-columnspec=&#039;[&amp;quot;DG.wz.HZ.Heizungsventil:measured-temp&amp;quot;,&amp;quot;DG.wz.HZ.Heizungsventil:desired-temp&amp;quot;,&amp;quot;DG.wz.HZ.Heizungsventil:actuator&amp;quot;]&#039;&lt;br /&gt;
	 ...&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die Anzeige von unterschiedlichen Geräten in einem Diagramm, muss nur &#039;&#039;&#039;data-columnspec&#039;&#039;&#039; entsprechend angepasst werden, solange sich alle Daten in der Datenbank befinden.&lt;br /&gt;
&lt;br /&gt;
===LogProxy===&lt;br /&gt;
Um die Daten mittels [[LogProxy]] berechnen und anzeigen zu können, muss in FHEM ein LogProxy-Device definiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define myLogProxy logProxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Einstellungen am LogProxy sind nicht nötig, die bloße Existenz reicht.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;data-logdevice&#039;&#039;&#039; wird das FHEM-Device für den LogProxy angegeben. Im nachfolgenden Beispiel heißt dieses &amp;lt;code&amp;gt;myLogProxy&amp;lt;/code&amp;gt;. Das Attribut &#039;&#039;&#039;data-logfile&#039;&#039;&#039; wird für LogProxy nicht benötigt. Befinden sich nur LogProxy-Werte im Diagramm kann das Attribut komplett entfallen. Sollen weitere Werte angezeigt werden, bleibt die Definition im Array einfach leer.&lt;br /&gt;
&lt;br /&gt;
Im Attribut &#039;&#039;&#039;data-columnspec&#039;&#039;&#039; wird eine Formel angegeben, wie die Werte berechnet werden sollen. Hier können die Formeln 1:1 von einem eventuell vorhandenen SVG-Plot übernommen werden. &#039;&#039;&#039;Dabei gibt es jedoch folgendes zu beachten:&#039;&#039;&#039; Befindet sich die Formel in einem Array, dürfen die Formeln keine Anführungszeichen (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;) beinhalten. Stattdessen müssen sie als escapter Ascii-Code (&amp;lt;code&amp;gt;\\x22&amp;lt;/code&amp;gt;) eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
Das nachfolgende Beispiel zeigt, wie Vorhersagewerte aus einem FHEM-Device vom Typ Proplanta (Name hier &amp;lt;code&amp;gt;AU.xx.WE.Proplanta&amp;lt;/code&amp;gt;) angezeigt werden 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;chart&amp;quot;&lt;br /&gt;
	 data-device=&amp;quot;AU.xx.WE.Proplanta&amp;quot;&lt;br /&gt;
	 data-logdevice=&#039;[&lt;br /&gt;
						&amp;quot;myLogProxy&amp;quot;,&lt;br /&gt;
						&amp;quot;myLogProxy&amp;quot;,&lt;br /&gt;
						&amp;quot;myLogProxy&amp;quot;,&lt;br /&gt;
						&amp;quot;myLogProxy&amp;quot;&lt;br /&gt;
					]&#039;&lt;br /&gt;
	 data-columnspec=&#039;[&lt;br /&gt;
						&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22temp_\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;,&lt;br /&gt;
						&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22rain_\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;,&lt;br /&gt;
						&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22chOfRain_\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;,&lt;br /&gt;
						&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22cloud_\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;&lt;br /&gt;
					]&#039;&lt;br /&gt;
	 ...&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auch alle anderen Funktionen, die [[LogProxy]] bietet, können hier angewendet werden.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
===Aktualisierung des Charts===&lt;br /&gt;
Damit der Refresh des Charts funktioniert, muss auch ein Device angegeben werden, der das Refresh triggert. Das Diagramm wird immer dann aktualisiert, wenn sich der Inhalt von &#039;&#039;&#039;data-get&#039;&#039;&#039; ändert.&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;chart&amp;quot;&lt;br /&gt;
	data-device=&amp;quot;WohnzimmerHeizung&amp;quot;&lt;br /&gt;
	data-logdevice=&amp;quot;FileLog_WohnzimmerHeizung&amp;quot;&lt;br /&gt;
	...&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aussehen der Linien===&lt;br /&gt;
Mit dem Attribut &#039;&#039;&#039;data-style&#039;&#039;&#039; kann das Aussehen der Linien des jeweiligen Graphen verändert werden. Hierfür können die Standard-FHEM-Styles verwendet werden. Dazu wird das Attribut mit &amp;lt;code&amp;gt;SVGplot&amp;lt;/code&amp;gt;, gefolgt von einem Leerzeichen und der gewünschten Farbe/Stil befüllt. Es existieren jedoch auch noch weitere, an FTUI angepasste Styles, zu finden in der CSS-Datei &amp;lt;code&amp;gt;css/ftui_chart.css&amp;lt;/code&amp;gt;. Um diese zu verwenden, wird das Attribut mit &amp;lt;code&amp;gt;ftui&amp;lt;/code&amp;gt;, gefolgt von einem Leerzeichen und der gewünschten Farbe/Stil befüllt. Eigene Styles können zum Beispiel in der Datei &amp;lt;code&amp;gt;css/fhem-table-ui-user.css&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
Folgende Übersicht zeigt die im Standard verfügbaren &#039;&#039;&#039;Farben&#039;&#039;&#039;, alle Abbildungen sind mit im FTUI-Style entstanden:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Farbe-f0.png|thumb|none|150px|Farbe &amp;quot;l0&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Farbe-f1.png|thumb|none|150px|Farbe &amp;quot;l1&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Farbe-f2.png|thumb|none|150px|Farbe &amp;quot;l2&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Farbe-f3.png|thumb|none|150px|Farbe &amp;quot;l3&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Farbe-f4.png|thumb|none|150px|Farbe &amp;quot;l4&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Farbe-f5.png|thumb|none|150px|Farbe &amp;quot;l5&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Farbe-f6.png|thumb|none|150px|Farbe &amp;quot;l6&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angabe zur Farbe kann dann mit der Linienart kombiniert werden. Dazu stehen folgende &#039;&#039;&#039;Stile&#039;&#039;&#039; zur Verfügung:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-2D-normal.png|thumb|none|225px|Darstellung in 2D: Stil &amp;quot;normal&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-2D-dot.png|thumb|none|225px|Darstellung in 2D: Stil &amp;quot;dot&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-2D-dash.png|thumb|none|225px|Darstellung in 2D: Stil &amp;quot;dash&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-2D-fill.png|thumb|none|225px|Darstellung in 2D: Stil &amp;quot;fill&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-2D-sym.png|thumb|none|225px|Darstellung in 2D: Stil &amp;quot;sym&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-3D-normal.png|thumb|none|225px|Darstellung in 3D: Stil &amp;quot;normal&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-3D-dot.png|thumb|none|225px|Darstellung in 3D: Stil &amp;quot;dot&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-3D-dash.png|thumb|none|225px|Darstellung in 3D: Stil &amp;quot;dash&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-3D-fill.png|thumb|none|225px|Darstellung in 3D: Stil &amp;quot;fill&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:FTUI_Widget_Chart_Form-3D-sym.png|thumb|none|225px|Darstellung in 3D: Stil &amp;quot;sym&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Farbe und Stil werden kombiniert (zusammengeschrieben) beim Attribut &#039;&#039;&#039;data-style&#039;&#039;&#039; angegeben, sodass sich beispielsweise für eine graue Punktlinie folgendes ergibt: &amp;lt;code&amp;gt;data-style=&amp;quot;ftui l1dot&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Um die Darstellung als normale Linie zu erhalten, darf im Gegensatz zu den anderen Linienformen der Stil &amp;lt;code&amp;gt;normal&amp;lt;/code&amp;gt; nicht angegeben werden. Für eine einfache graue Linie ist also die Angabe &amp;lt;code&amp;gt;data-style=&amp;quot;ftui l1&amp;quot;&amp;lt;/code&amp;gt; korrekt, wohingegen &amp;lt;code&amp;gt;data-style=&amp;quot;ftui l1normal&amp;quot;&amp;lt;/code&amp;gt; zu einer fehlerhaften Anzeige führt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Der Stil &#039;&#039;sym&#039;&#039; ist speziell dafür geeignet, Symbole statt Linien zu zeichnen. Dazu kann beim Attribut &#039;&#039;&#039;data-ptype&#039;&#039;&#039; als Linienform ein beliebiges Font-Awsome-, oder Open Automation-Icon angegeben werden. Alle in diesem Abschnitt enthaltenen Abbildungen sind mit &amp;lt;code&amp;gt;data-ptype=&amp;quot;lines&amp;quot;&amp;lt;/code&amp;gt; entstanden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Übergänge mit datenabhängigen Grenzen:&#039;&#039;&#039; Plotstile (data-style) können auch direkt als Gradienten auf Basis von Plot-Datenwerten definiert werden. Dazu muss der Plotstil als Array angegeben werden. Der erste Wert des Arrays gibt an, ob nur die Linie gezeichnet werden soll (Zahl angeben, die die Dicke der Linie definiert) oder gefüllt (&amp;quot;fill&amp;quot; eintragen). Alle danach folgenden Array Elemente sind beliebig viele Stopp Punkte für die Farbübergänge, welche wiederum aus Arrays mit 3 Parametern bestehen. Für jeden Stopp Punkt werden der Datenwert, die Farbe und die Durchsichtigkeit gesetzt. Hierdurch lassen sich z.B. Einfärbungen setzen, die für Temperaturplots immer negative Werte blau einfärben und positive Werte rot. Zwischen den Stop Punkten wird die Farbe interpoliert, also ein weicher Übergang generiert. Will man harte Übergänge muss man Zwei Stopp Punkte mit unterschiedlichen Farbwerten aber dem gleichen Datenwert erzeugen.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel 1 für einen weichen Gradienten, der bei 0 von blau nach rot übergeht, bei diesem Übergang durchsichtig ist und von dort nach negativen bzw. positiven Werden immer deckender wird:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;data-style=&#039;[&amp;quot;fill&amp;quot;,[&amp;quot;-20&amp;quot;,&amp;quot;#0000ff&amp;quot;,&amp;quot;0.7&amp;quot;],[&amp;quot;0&amp;quot;,&amp;quot;#0000ff&amp;quot;,&amp;quot;0&amp;quot;],[&amp;quot;0&amp;quot;,&amp;quot;#ff0000&amp;quot;,&amp;quot;0&amp;quot;],[&amp;quot;302&amp;quot;,&amp;quot;#ff0000&amp;quot;,&amp;quot;0.7&amp;quot;]]&#039;&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel 2 mit einem harten Übergang von blau nach rot bei 0:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;data-style=&#039;[&amp;quot;fill&amp;quot;,[&amp;quot;-20&amp;quot;,&amp;quot;#0000ff&amp;quot;,&amp;quot;0.7&amp;quot;],[&amp;quot;0&amp;quot;,&amp;quot;#0000ff&amp;quot;,&amp;quot;0.7&amp;quot;],[&amp;quot;0&amp;quot;,&amp;quot;#ff0000&amp;quot;,&amp;quot;0.7&amp;quot;],[&amp;quot;50&amp;quot;,&amp;quot;#ff0000&amp;quot;,&amp;quot;0.7&amp;quot;]]&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
Es gibt auch die Möglichkeit den Bereich zwischen zwei Graphen einzufärben. Dazu muss ein Wert in Columnspec als Array angegeben werden. Ist dies der Fall, dann wird der zweite Graph umgekehrt an den ersten angehängt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
data-columnspec=&#039;[&lt;br /&gt;
    &amp;quot;Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22weatherIcon\\x22,$from,$to,12)&amp;quot;,&lt;br /&gt;
    [&lt;br /&gt;
        &amp;quot;Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22tempMax\\x22,$from,$to,12)&amp;quot;,&lt;br /&gt;
        &amp;quot;Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22tempMin\\x22,$from,$to,12)&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;Func:logProxy_proplanta2Plot(\\x22AgroWeather\\x22,\\x22rain\\x22,$from,$to,0,\\x22day\\x22)&amp;quot;&lt;br /&gt;
]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Datei:FTUI Widget Chart DynamicStyles.png|thumb|none|500px|dynamischer Übergang]]&lt;br /&gt;
&lt;br /&gt;
===Form der Linien===&lt;br /&gt;
Das Attribut &#039;&#039;&#039;data-ptype&#039;&#039;&#039; beeinflusst die Form der Linien. Hier sind folgende Werte möglich (in den Bildern sind zur Info zusätzlich auch immer points dargestellt):&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Llines.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;lines&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Points.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;points&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Steps.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;steps&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Fsteps.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;fsteps&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Histeps.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;histeps&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Bars.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;bars&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Ibars.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;ibars&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Cubic.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;cubic&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Quadratic.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;quadratic&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:QuadraticSmooth.png|thumb|none|350px|Darstellung in 2D: Stil &amp;quot;quadraticSmooth&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist es möglich, Symbole anzeigen zu lassen. Unterstützt werden Font-Awesome (&#039;fa-...&#039;), Open Automation (&#039;oa-...&#039;) und FHEM-Symbole (&#039;fs-...&#039;)). Damit die Symbole korrekt angezeigt werden, muss  im Attribut &#039;&#039;&#039;data-style&#039;&#039;&#039; der Stil &amp;lt;code&amp;gt;sym&amp;lt;/code&amp;gt; gewählt werden, da sonst nur Punkte, statt der Symbole gezeichnet werden.&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;chart&amp;quot;&lt;br /&gt;
	 data-device=&amp;quot;DG.wz.HZ.Heizungsventil&amp;quot;&lt;br /&gt;
	 data-logdevice=&amp;quot;FileLog_DG.wz.HZ.Heizungsventil&amp;quot;&lt;br /&gt;
	 ...&lt;br /&gt;
	 data-style=&amp;quot;ftui l1sym&amp;quot;&lt;br /&gt;
	 data-ptype=&amp;quot;fa-cloud&amp;quot;&lt;br /&gt;
	 ...&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Ssymbols.png|thumb|none|500px|Darstellung in 2D: Stil &amp;quot;symbol fa-cloud&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Größe der Symbole ist in der Datei &amp;lt;code&amp;gt;css/ftui_chart.css&amp;lt;/code&amp;gt; auf 12px festgelegt. Dieser Wert kann in einer eigenen CSS-Datei durch Anpassung von &amp;lt;code&amp;gt;stroke-width&amp;lt;/code&amp;gt; überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.ftui.l0sym		{ stroke:#DDA400; stroke-width:12px; fill:none; }&lt;br /&gt;
.ftui.l1sym		{ stroke:#BBBBBB; stroke-width:12px; fill:none; }&lt;br /&gt;
.ftui.l2sym		{ stroke:#CC0000; stroke-width:12px; fill:none; }&lt;br /&gt;
.ftui.l3sym		{ stroke:#CCCC00; stroke-width:12px; fill:none; }&lt;br /&gt;
.ftui.l4sym		{ stroke:#33CC33; stroke-width:12px; fill:none; }&lt;br /&gt;
.ftui.l5sym		{ stroke:#33CCCC; stroke-width:12px; fill:none; }&lt;br /&gt;
.ftui.l6sym		{ stroke:#3333CC; stroke-width:12px; fill:none; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;data-ptype&#039;&#039;&#039; kann auch Inhalt im Format &amp;lt;code&amp;gt;&#039;icon:1&#039;&amp;lt;/code&amp;gt; verarbeiten. Dann muss der zugehörige Wert in &#039;&#039;&#039;data-columnspec&#039;&#039;&#039; den Pfad zu einem Icon (z.B. für Wettervorhersagen) beinhalten. Der Y-Wert wird dann vom ersten Graphen übernommen. Weitere Ausführungen hierzu im Beispiel [[#Darstellung der Wetter Icons im Diagramm]].&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt; [[File:Wetterchart2.png|thumb|none|500px|Darstellung in 2D: Stil &amp;quot;Beispiel mit icons aus Readings&amp;quot;]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Stapeln von Linien===&lt;br /&gt;
Über &#039;&#039;&#039;data-ptype&#039;&#039;&#039; kann zusätzlich festgelegt werden, ob Graphen übereinander gestapelt werden sollen. &amp;lt;code&amp;gt;data-ptype=&#039;lines:1&#039;&amp;lt;/code&amp;gt; bedeutet, dass der zugehörige Graph auf den Graph mit der Nummer 1 gestapelt werden soll. So etwas kann z.B. Sinn machen, wenn man den Stromverbrauch einzelner Devices darstellen und zusätzlich sehen will, wie hoch die Summe ist. Beispiel siehe unten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:FTUI Widget Chart Stacked.png]]&lt;br /&gt;
&lt;br /&gt;
===Zeitstrahl / Start &amp;amp; Ende auf der X-Achse===&lt;br /&gt;
Die Attribute &#039;&#039;&#039;data-daysago_start&#039;&#039;&#039; und &#039;&#039;&#039;data-daysago_end&#039;&#039;&#039; dienen der Definition von Anfang und Ende der X-Achse. Im einfachsten Fall wird eine Anzahl an Tagen eingegeben, die sich auf das aktuelle Datum beziehen. Dabei gilt es zu beachten, dass es sich um &#039;&#039;vergangene Tage&#039;&#039; handelt. Das bedeutet, dass Tage in der Vergangenheit als positive Zahl angegeben werden, Tage in der Zukunft hingegen als negative Zahl. Es kann jeweils  auch ein fixes Datum (z.B. &#039;2013-10-23&#039;) angegeben werden. Uhrzeitangaben werden nur berücksichtigt, wenn &#039;&#039;&#039;data-nofulldays=&#039;true&#039; &#039;&#039;&#039; verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Relative Zeitangabe in Stunden/Tagen/Wochen/Monaten/Jahren&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Zur Ausgabe einer Anzahl an zurückliegenden Stunden bis zum aktuellen Zeitpunkt wird als Startzeitpunkt die Anzahl der Stunden/Tage/Wochen/Monate/Jahre angegeben, die angezeigt werden sollen, gefolgt vom Kleinbuchstaben &#039;&#039;&#039;h&#039;&#039;&#039; für Stunden, &#039;&#039;&#039;d&#039;&#039;&#039; für Tage, &#039;&#039;&#039;w&#039;&#039;&#039; für Wochen, &#039;&#039;&#039;m&#039;&#039;&#039; für Monate, &#039;&#039;&#039;y&#039;&#039;&#039; für Jahre, . Als Endzeitpunkt wird &#039;&#039;&#039;now&#039;&#039;&#039; gewählt.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das nachfolgende Beispiel zeigt die Werte der vergangenen 3 Stunden an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
data-daysago_start=&amp;quot;3h&amp;quot;&lt;br /&gt;
data-daysago_end=&amp;quot;now&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fester Zeitbereich des heutigen Tages (Stunden/Tage/Wochen/Monate/Jahre)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Um ein festes Stunden/Tages/Wochen/Monats/Jahresfenster anzuzeigen, werden die absoluten Stunden/Tages/Wochen/Monats/Jahreszahlen mit negativem Vorzeichen, gefolgt vom Großbuchstaben &#039;&#039;&#039;H&#039;&#039;&#039; (entsprechend D/W/M/Y für Tage/Wochen/Monate/Jahre) angegeben. Wird &#039;&#039;&#039;data-daysago_start&#039;&#039;&#039; als positiver Wert angegeben, wird die Anzahl der Stunden/Tage/Wochen/Monate/Jahre von heute 0:00 Uhr subtrahiert (siehe Rechenweg weiter unten).&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Beispiel zeigt den Zeitbereich von heute 5:00 Uhr bis heute 22:00 Uhr:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
data-daysago_start=&amp;quot;-5H&amp;quot;&lt;br /&gt;
data-daysago_end=&amp;quot;-22H&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fester Zeitbereich Tage-übergreifend&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Zeit in Tagen kann als Gleitkommazahl angegeben werden. Damit ist es möglich, Tage und Uhrzeiten zu kombinieren. Die Werte sind dann als Teil eines ganzen Tages, bezogen auf heute 0:00 Uhr zu errechnen und mit &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; als Teiler anzugeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das nachfolgende Beispiel zeigt einen Zeitbereich von &#039;&#039;&#039;gestern 15:00 Uhr&#039;&#039;&#039; bis &#039;&#039;&#039;morgen 3:00 Uhr&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
data-daysago_start=&amp;quot;0.375&amp;quot;&lt;br /&gt;
data-daysago_end=&amp;quot;-1.125&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die nachfolgenden Rechenwege sind die Einheiten nur zur Verdeutlichung angegeben. Die Einheiten werden im Attribut nicht angegeben.&lt;br /&gt;
&lt;br /&gt;
Der Wert für &#039;&#039;&#039;GESTERN&#039;&#039;&#039; wird wie folgt ermittelt:&amp;lt;br /&amp;gt;&lt;br /&gt;
Ausgangspunkt ist heute 0:00 Uhr, gestern 15:00 Uhr liegt also 9 Stunden davor. Diese 9 Stunden sind ein &amp;lt;code&amp;gt;9/24 Tag&amp;lt;/code&amp;gt; und errechnet sich so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1d / 24h = 0.0416666...d/h&lt;br /&gt;
0.0416d/h * 9h = 0.375d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Wert für &#039;&#039;&#039;MORGEN&#039;&#039;&#039; wird wie folgt ermittelt:&amp;lt;br /&amp;gt;&lt;br /&gt;
Ausgangspunkt ist wieder heute 0:00 Uhr, morgen 3:00 Uhr liegt dann 27 Stunden dahinter. Der Einfachheit halber werden hier nur die 3 Stunden errechnet und dann ein ganzer Tag addiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1d / 24h = 0.0416666...d/h&lt;br /&gt;
0.0416d/h * 3h = 0.125d&lt;br /&gt;
&lt;br /&gt;
0.125d + 1d = 1.125d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da das Attribut Tage in der Vergangenheit erwartet, muss für einen Wert in der Zukunft wieder eine negative Zahl angegeben werden.&lt;br /&gt;
&lt;br /&gt;
===Zeitformat der X-Achse===&lt;br /&gt;
Die Zeitanzeige auf der X-Achse kann sehr flexibel eingestellt werden. Dafür stehen verschiedene Platzhalter zur Verfügung, die durch spezielle Zeichen (&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt; &amp;lt;/code&amp;gt; (Leerzeichen), &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) getrennt werden. Alle Zeichen werden trotz Escape-Zeichen (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) in der Ausgabe angezeigt.&lt;br /&gt;
&lt;br /&gt;
Folgende Platzhalter werden unterstützt:&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;mm&#039;&amp;lt;/code&amp;gt;: Minuten als zweistellige Zahl&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;hh&#039;&amp;lt;/code&amp;gt;: Stunden als zweistellige Zahl&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;dd&#039;&amp;lt;/code&amp;gt;: Tag als zweistellige Zahl (Kalenderdatum)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;MM&#039;&amp;lt;/code&amp;gt;: Monat als zweistellige Zahl (z.B. 02 für Februar)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;MMM&#039;&amp;lt;/code&amp;gt;: Monat als dreistellige Abkürzung (z.B. Dec für Dezember)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;MMMM&#039;&amp;lt;/code&amp;gt;: Langname des Monats (z.B. March)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;ee&#039;&amp;lt;/code&amp;gt;: Wochentag als zweistellige Zahl (z.B. 00 für Sonntag)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;eee&#039;&amp;lt;/code&amp;gt;: Wochentag als dreistellige Abkürzung (z.B. Mon für Montag)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;eeee&#039;&amp;lt;/code&amp;gt;: Langname des Wochentags (z.B. Tuesday)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;yy&#039;&amp;lt;/code&amp;gt;: Jahr als zweistellige Zahl (z.B. 16 für 2016)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;yyyy&#039;&amp;lt;/code&amp;gt;: Jahr als vierstellige Zahl (z.B. 2016)&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;LF&#039;&amp;lt;/code&amp;gt;: Fügt einen Zeilenumbruch hinzu&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der String &amp;lt;code&amp;gt;&#039;MMM\LF\yyyy&#039;&amp;lt;/code&amp;gt; zeigt &amp;lt;code&amp;gt;&#039;Jan&#039;&amp;lt;/code&amp;gt; in der ersten, und &amp;lt;code&amp;gt;&#039;2016&#039;&amp;lt;/code&amp;gt; in der zweiten Zeile. &amp;lt;code&amp;gt;&#039;MM.dd 2016&#039;&amp;lt;/code&amp;gt; wird zu &amp;lt;code&amp;gt;&#039;03.05 2016&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Fadenkreuz-Cursor===&lt;br /&gt;
Der Fadenkreuz-Cursor zeigt die Momentanwerte, indem man ihn über die Graphen bewegt. In Desktop-Browsern reicht einfaches Bewegen der Maus. Unter iOS und Android wird der Cursor durch einfaches Tippen auf die neue Position bewegt.&lt;br /&gt;
&lt;br /&gt;
Mit dem Attribut &#039;&#039;&#039;data-cursorgroup&#039;&#039;&#039; können Graphen gruppiert werden. Am Cursor werden dann die Momentanwerte aller Graphen gleichzeitig angezeigt, die die selbe Zahl besitzen, sobald man die Maus über einen aus der Gruppe bewegt.&lt;br /&gt;
&lt;br /&gt;
===Legende===&lt;br /&gt;
Mit dem Attribut &#039;&#039;&#039;data-legendpos&#039;&#039;&#039; kann die Position der Legende innerhalb des Diagramms festgelegt werden. Die Position wird mit einem Array, bestehend aus zwei Werten im Format &amp;lt;code&amp;gt;&#039;[&amp;quot;&amp;lt;horizontal&amp;gt;&amp;quot;,&amp;quot;&amp;lt;vertikal&amp;gt;&amp;quot;]&#039;&amp;lt;/code&amp;gt; angegeben. Für die horizontale Positionierung sind &amp;lt;code&amp;gt;&#039;left&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;right&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;before&#039;&amp;lt;/code&amp;gt;, und &amp;lt;code&amp;gt;&#039;behind&#039;&amp;lt;/code&amp;gt;, die vertikale Positionierung &amp;lt;code&amp;gt;&#039;top&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;bottom&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;above&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;below&#039;&amp;lt;/code&amp;gt; erlaubt (der Unterschied zwischen &amp;lt;code&amp;gt;&#039;left&#039;&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;&#039;before&#039;&amp;lt;/code&amp;gt; liegt darin, dass im zweiten Fall die Legende nicht in den Zeichenbereich gesetzt wird sondern vor das ganze Chart (entsprechend für &amp;lt;code&amp;gt;&#039;after&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;above&#039;&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;&#039;below&#039;&amp;lt;/code&amp;gt;). Alternativ können auch Zahlen verwendet werden, die die Position in Prozent angeben. Durch verschieben mit der Maus oder durch verschieben mit dem Finger oder Stift auf Touch Devices kann die Legende auch an eine andere Position verschoben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn die Legende eingeblendet ist, kann mittels Klick auf einen Legendeneintrag der zugehörige Graph ein- und ausgeblendet werden.&lt;br /&gt;
&lt;br /&gt;
===3-dimensionale Drehung===&lt;br /&gt;
&#039;&#039;&#039;data-ddd&#039;&#039;&#039; ermöglicht, den Graphen 3-dimensional zu drehen. Als Wert wird ein Array mit den 3 Winkeln für x, y und z erwartet, wobei z selbst bisher nicht unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;data-ddd=&#039;[&amp;quot;40&amp;quot;,&amp;quot;60&amp;quot;,&amp;quot;0&amp;quot;]&#039;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Wenn der 3D Modus aktiv ist (&#039;&#039;&#039;data-ddd&#039;&#039;&#039; gesetzt) sind 2 zusätzliche Parameter verfügbar um das Aussehen der Graphen zu beeinflussen. &#039;&#039;&#039;data-dddspace&#039;&#039;&#039; gibt an, wie viele pixel der Raum zwischen den einzelnen in z-Richtung hintereinander angeordneten Graphen betragen soll.&lt;br /&gt;
&#039;&#039;&#039;data-dddwidth&#039;&#039;&#039; legt fest, wie viele pixel die einzelnen Graphen tief (oder dick) sein sollen.&lt;br /&gt;
&lt;br /&gt;
Wenn das Array angegeben wird, erscheinen zwei zusätzliche Buttons im Diagramm, mit denen die Drehung in X- und Y-Richtung verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
===Diagrammtitel===&lt;br /&gt;
Mit dem Attribut &#039;&#039;&#039;data-title&#039;&#039;&#039; kann dem Diagramm, ähnlich wie in FHEM-SVG-Plots, ein Titel hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
Folgende Platzhalter werden unterstützt:&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;min1&#039;&amp;lt;/code&amp;gt;: Minimaler Y-Wert des ersten Graphs&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;max1&#039;&amp;lt;/code&amp;gt;: Maximaler Y-Wert des ersten Graphs&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;avg1&#039;&amp;lt;/code&amp;gt;: Mittlerer Y-Wert des ersten Graphs&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;cnt1&#039;&amp;lt;/code&amp;gt;: Anzahl der dargestellten Einzelwerte im ersten Graph&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;currval1&#039;&amp;lt;/code&amp;gt;: Letzter, bzw. aktuellster Y-Wert des ersten Graphs&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;mindate1&#039;&amp;lt;/code&amp;gt;: Niedrigster Wert auf der X-Achse des ersten Graphs&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;maxdate1&#039;&amp;lt;/code&amp;gt;: Höchster Wert auf der X-Achse vom ersten Graphs&lt;br /&gt;
*&amp;lt;code&amp;gt;&#039;currdate1&#039;&amp;lt;/code&amp;gt;: Letzter, bzw. aktuellster Wert auf der X-Achse des ersten Graphs&lt;br /&gt;
&lt;br /&gt;
Durch Einsetzen einer anderen Zahl statt &#039;1&#039; können auch die Werte der anderen Graphen angezeigt werden. Das Weglassen der Zahl bewirkt, dass der jeweils zutreffende Wert automatisch ermittelt wird. Bedeutet: &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; führt dazu, dass der höchste Wert aller angezeigter Graphen verwendet wird.&lt;br /&gt;
Zusätzlich ist es möglich durch &amp;quot;$eval(&amp;lt;regexp&amp;gt;)&amp;quot; regular Expressions auszuwerten (also z.B. Berechnungen durchzuführen). In &amp;lt;regexp&amp;gt; können auch &amp;quot;$data()&amp;quot; vorkommen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;data-title=&amp;quot;Klima Wohnzimmer Average: $eval(parseInt($data{avg1}*10)/10)°C / Max: $eval(parseInt($data{max1}*10)/10)°C&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Buttons im Diagramm===&lt;br /&gt;
Es gibt mehrere Buttons, mit denen sich die Anzeige des Diagramms verändern lässt. &amp;lt;code&amp;gt;&amp;lt;-&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;-&amp;gt;&amp;lt;/code&amp;gt; bewegen die Graphen nach links und rechts. &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; zoomen die Anzeige. &amp;lt;code&amp;gt;legend&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;cursor&amp;lt;/code&amp;gt; schalten die zugehörigen Anzeigen ein und aus. Falls der 3D Modus eingeschaltet ist, gibt es Buttons zum Drehen der Darstellung um die X- und Y-Achse. Falls &amp;lt;code&amp;gt;data-timeranges&amp;lt;/code&amp;gt; gesetzt ist, wird ein Pulldown Menü dargestellt, welches die Auswahl von dort definierten Zeiträumen für die X-Achse erlaubt.&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
===Einfaches Diagramm===&lt;br /&gt;
Das Beispiel zeigt ein einfaches Diagramm mit 4 unterschiedlich formatierten Graphen, Legende und Momentanwerten am Fadenkreuz-Cursor.&lt;br /&gt;
&lt;br /&gt;
[[File:Chart_tabletUI.png]]&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;chart&amp;quot;&lt;br /&gt;
	data-logdevice=&#039;[&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Garden&amp;quot;,&amp;quot;Log.Predicted&amp;quot;]&#039;&lt;br /&gt;
	data-columnspec=&#039;[&amp;quot;4:Garden.T:15:&amp;quot;,&amp;quot;10:Garden.T:0:delta-h&amp;quot;,&amp;quot;10:Garden.T:0:delta-d&amp;quot;,&amp;quot;4:predicted.*:15:&amp;quot;]&#039;&lt;br /&gt;
	data-style=&#039;[&amp;quot;ftui l0fill&amp;quot;,&amp;quot;ftui l1fill&amp;quot;,&amp;quot;ftui l2&amp;quot;,&amp;quot;ftui l3dot&amp;quot;]&#039;&lt;br /&gt;
	data-ptype=&#039;[&amp;quot;lines&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;histeps&amp;quot;,&amp;quot;cubic&amp;quot;]&#039;&lt;br /&gt;
	data-uaxis=&#039;[&amp;quot;primary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;secondary&amp;quot;,&amp;quot;primary&amp;quot;]&#039;&lt;br /&gt;
	data-legend=&#039;[&amp;quot;Temperature&amp;quot;,&amp;quot;Rain/hour&amp;quot;,&amp;quot;Rain/day&amp;quot;,&amp;quot;Predicted Temp.&amp;quot;]&#039;&lt;br /&gt;
	data-yunit=&amp;quot;°C&amp;quot;&lt;br /&gt;
	data-ytext=&amp;quot;Temperature&amp;quot;&lt;br /&gt;
	data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-yunit_sec=&amp;quot;mm&amp;quot;&lt;br /&gt;
	data-ytext_sec=&amp;quot;Rain (mm)&amp;quot;&lt;br /&gt;
	data-height=&amp;quot;250&amp;quot;&lt;br /&gt;
	data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
	data-daysago_start=&amp;quot;2013-08-13T00:00:00&amp;quot;&lt;br /&gt;
	data-daysago_end=&amp;quot;2013-08-14T00:00:00&amp;quot;&lt;br /&gt;
	data-cursorgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-scrollgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-xticks=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===7-Tage-Wettervorhersage mit Proplanta===&lt;br /&gt;
In diesem Beispiel wird gezeigt, wie die Vorhersagewerte von [[PROPLANTA]] in einem Diagramm dargestellt werden können. Da die Werte nicht in einer Datenbank oder einem FileLog vorliegen, müssen sie über [[LogProxy]] verarbeitet werden. Dafür sind einige Vorbereitungen in FHEM nötig.&lt;br /&gt;
&lt;br /&gt;
[[File:FTUI_Widget_Chart-fc-Proplanta.png|941px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Ein LogProxy-Device muss vorhanden sein:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define myLogProxy logProxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; In der Datei &amp;lt;code&amp;gt;99_myUtils.pm&amp;lt;/code&amp;gt; muss folgende Routine hinzugefügt werden, die die Daten bereitstellt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#---------------------------------------&lt;br /&gt;
# Proplanta LogProxy-Funktion&lt;br /&gt;
#---------------------------------------&lt;br /&gt;
sub logProxy_proplanta2Plot($$$$;$$) {&lt;br /&gt;
	my ($device, $fcValue, $from, $to, $fcHour, $expMode) = @_;&lt;br /&gt;
    my $regex;&lt;br /&gt;
    my @rl;&lt;br /&gt;
    &lt;br /&gt;
	return undef if(!$device);&lt;br /&gt;
    &lt;br /&gt;
    if($fcValue =~ s/_$//) {&lt;br /&gt;
        $regex = &amp;quot;^fc[\\d]+_&amp;quot;.$fcValue.&amp;quot;[\\d]{2}\$&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        $regex = &amp;quot;^fc[\\d]+_&amp;quot;.$fcValue.&amp;quot;\$&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    $fcHour = 12 if(!defined $fcHour);&lt;br /&gt;
    $expMode = &amp;quot;point&amp;quot; if(!defined $expMode);&lt;br /&gt;
&lt;br /&gt;
	if( defined($defs{$device}) ) {&lt;br /&gt;
		if( $defs{$device}{TYPE} eq &amp;quot;PROPLANTA&amp;quot; ) {&lt;br /&gt;
            @rl = sort{&lt;br /&gt;
                my ($an) = ($a =~ m/fc(\d+)_.*/);&lt;br /&gt;
                my ($bn) = ($b =~ m/fc(\d+)_.*/);&lt;br /&gt;
                $an &amp;lt;=&amp;gt; $bn or $a cmp $b;&lt;br /&gt;
                }( grep /${regex}/,keys %{$defs{$device}{READINGS}} );&lt;br /&gt;
			return undef if( !@rl );&lt;br /&gt;
		} else {&lt;br /&gt;
			Log3 undef, 2, &amp;quot;logProxy_proplanta2Plot: $device is not a PROPLANTA device&amp;quot;;&lt;br /&gt;
			return undef;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	my $fromsec = SVG_time_to_sec($from);&lt;br /&gt;
	my $tosec   = SVG_time_to_sec($to);&lt;br /&gt;
	my $sec = $fromsec;&lt;br /&gt;
	my ($h,$fcDay,$mday,$mon,$year);&lt;br /&gt;
	my $timestamp;&lt;br /&gt;
    &lt;br /&gt;
	my $reading;&lt;br /&gt;
	my $value;&lt;br /&gt;
	my $prev_value;&lt;br /&gt;
	my $min = 999999;&lt;br /&gt;
	my $max = -999999;&lt;br /&gt;
	my $ret = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	# while not end of plot range reached&lt;br /&gt;
	while(($sec &amp;lt; $tosec) &amp;amp;&amp;amp; @rl) {&lt;br /&gt;
		#remember previous value for start of plot range&lt;br /&gt;
		$prev_value = $value;&lt;br /&gt;
&lt;br /&gt;
		$reading = shift @rl;&lt;br /&gt;
        ($fcDay) = $reading =~ m/^fc(\d+).*/;&lt;br /&gt;
   		$h = ($reading =~ m/.*(\d\d)$/)?$1:$fcHour;&lt;br /&gt;
		$value = ReadingsVal($device,$reading,undef);&lt;br /&gt;
        &lt;br /&gt;
		($mday,$mon,$year) = split(&#039;\.&#039;,ReadingsVal($device,&amp;quot;fc&amp;quot;.$fcDay.&amp;quot;_date&amp;quot;,undef));&lt;br /&gt;
		$timestamp = sprintf(&amp;quot;%04d-%02d-%02d_%02d:%02d:%02d&amp;quot;, $year, $mon, $mday, $h, 0, 0);&lt;br /&gt;
		$sec = SVG_time_to_sec($timestamp);&lt;br /&gt;
        &lt;br /&gt;
		# skip all values before start of plot range&lt;br /&gt;
		next if( SVG_time_to_sec($timestamp) &amp;lt; $fromsec );&lt;br /&gt;
&lt;br /&gt;
		# add first value at start of plot range&lt;br /&gt;
		if( !$ret &amp;amp;&amp;amp; $prev_value ) {&lt;br /&gt;
		  $min = $prev_value if( (looks_like_number($prev_value) &amp;amp;&amp;amp; ($prev_value &amp;lt; $min)) || ($prev_value lt $min) );&lt;br /&gt;
		  $max = $prev_value if( (looks_like_number($prev_value) &amp;amp;&amp;amp; ($prev_value &amp;gt; $max)) || ($prev_value gt $max) );&lt;br /&gt;
		  $ret .= &amp;quot;$from $prev_value\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		# done if after end of plot range&lt;br /&gt;
		last if($sec &amp;gt; $tosec);&lt;br /&gt;
&lt;br /&gt;
		$min = $value if( (looks_like_number($value) &amp;amp;&amp;amp; ($value &amp;lt; $min )) || ($value lt $min) );&lt;br /&gt;
		$max = $value if( (looks_like_number($value) &amp;amp;&amp;amp; ($value &amp;gt; $max )) || ($value gt $max) );&lt;br /&gt;
&lt;br /&gt;
		# add actual controll point&lt;br /&gt;
		$ret .= &amp;quot;$timestamp $value\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#		Log 1, &amp;quot;$timestamp $value -0- $reading&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
    if(($sec &amp;lt; $tosec) &amp;amp;&amp;amp; !@rl &amp;amp;&amp;amp; ($expMode eq &amp;quot;day&amp;quot;)) {&lt;br /&gt;
    	$timestamp = sprintf(&amp;quot;%04d-%02d-%02d_%02d:%02d:%02d&amp;quot;, $year, $mon, $mday, 23, 59, 59);&lt;br /&gt;
    	if(SVG_time_to_sec($timestamp) &amp;lt; $tosec) {&lt;br /&gt;
        	$ret .= &amp;quot;$timestamp $value\n&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
			$ret .= &amp;quot;$to $value\n&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    elsif(($sec &amp;gt; $tosec) &amp;amp;&amp;amp; ($expMode eq &amp;quot;day&amp;quot;)) {&lt;br /&gt;
       	$value = $prev_value + ($value - $prev_value)*(86400 + ($tosec - $sec))/86400;&lt;br /&gt;
       	$ret .= &amp;quot;$to $value\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
	return ($ret,$min,$max,$prev_value);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend können die Daten im Chart-Widget angezeigt werden. Der Device-Name von Proplanta heißt hier im Beispiel &amp;lt;code&amp;gt;AU.xx.WE.Proplanta&amp;lt;/code&amp;gt;.&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;chart&amp;quot;&lt;br /&gt;
	 data-device=&amp;quot;AU.xx.WE.Proplanta&amp;quot;&lt;br /&gt;
	 data-logdevice=&#039;[&lt;br /&gt;
	 					&amp;quot;myLogProxy&amp;quot;,&lt;br /&gt;
	 					&amp;quot;myLogProxy&amp;quot;,&lt;br /&gt;
	 					&amp;quot;myLogProxy&amp;quot;&lt;br /&gt;
	 				]&#039;&lt;br /&gt;
	 data-columnspec=&#039;[&lt;br /&gt;
	 					&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22rain_\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;,&lt;br /&gt;
	 					&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22chOfRain_\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;,&lt;br /&gt;
	 					&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22cloud_\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;&lt;br /&gt;
	 				]&#039;&lt;br /&gt;
	 data-style=&#039;[&lt;br /&gt;
	 					&amp;quot;ftui l6fill&amp;quot;,&lt;br /&gt;
	 					&amp;quot;ftui l5fill&amp;quot;,&lt;br /&gt;
	 					&amp;quot;ftui l1fill&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-ptype=&#039;[&lt;br /&gt;
	 					&amp;quot;steps&amp;quot;,&lt;br /&gt;
	 					&amp;quot;quadraticSmooth&amp;quot;,&lt;br /&gt;
	 					&amp;quot;quadraticSmooth&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-uaxis=&#039;[&lt;br /&gt;
	 					&amp;quot;primary&amp;quot;,&lt;br /&gt;
	 					&amp;quot;secondary&amp;quot;,&lt;br /&gt;
	 					&amp;quot;secondary&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-legend=&#039;[&lt;br /&gt;
	 					&amp;quot;Regen&amp;quot;,&lt;br /&gt;
	 					&amp;quot;Regenwahrscheinlichkeit&amp;quot;,&lt;br /&gt;
	 					&amp;quot;Wolken&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-yunit=&amp;quot;mm&amp;quot;&lt;br /&gt;
	 data-ytext=&amp;quot;Regen&amp;quot;&lt;br /&gt;
	 data-yunit_sec=&amp;quot;%&amp;quot;&lt;br /&gt;
	 data-ytext_sec=&amp;quot;Chance auf Regen / Wolken&amp;quot;&lt;br /&gt;
	 data-timeformat=&amp;quot;eeee&amp;quot;&lt;br /&gt;
	 data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-daysago_start = &amp;quot;0&amp;quot;&lt;br /&gt;
	 data-daysago_end = &amp;quot;-7&amp;quot;&lt;br /&gt;
	 data-xticks=&amp;quot;1440&amp;quot;&lt;br /&gt;
	 data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-title=&amp;quot;7-Tage-Wettervorhersage&amp;quot;&lt;br /&gt;
	 data-showlegend=&amp;quot;true&amp;quot;&lt;br /&gt;
	 class=&amp;quot;nobuttons fullsize&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hilfreiche Links und Quellen zu diesem Beispiel:&#039;&#039;&#039;&lt;br /&gt;
*[[LogProxy|LogProxy im FHEM-Wiki]]&lt;br /&gt;
*{{Link2Forum|Topic=22967|Message=246973|LinkText=Stundengenaue Wettervorhersage (#1) im FHEM-Forum}}&lt;br /&gt;
*{{Link2Forum|Topic=22967|Message=334713|LinkText=Stundengenaue Wettervorhersage (#2) im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
===Darstellung der Wetter Icons im Diagramm===&lt;br /&gt;
&lt;br /&gt;
[[File:Wetterchart2.png]]&lt;br /&gt;
&lt;br /&gt;
Wie oben bereits beschrieben, gibt es beim Chart grundsätzlich die Möglichkeit, Icons, welche in Form von URLs in den Logs abgelegt sind oder welche per logProxy generiert werden, darzustellen. Die Icons werden auf genau dem gleichen Weg von FHEM gelesen, wie alle anderen Datenpunkte. Im Folgenden wird ein Beispiel gezeigt, mit dem die im Proplanta Modul als Readings abgelegten Icons per logProxy Funktion gelesen und in ein Chart eingebaut werden könnnen.&lt;br /&gt;
Da es beim Proplanta Modul für die ersten 7 Tage nicht das Reading &amp;lt;code&amp;gt;fc#_weatherIcon&amp;lt;/code&amp;gt; gibt, sondern mehrere Readings für unterschiedliche Tageszeiten wogegen für die zweiten 7 Tage ausschließlich das Reading &amp;lt;code&amp;gt;fc#_weatherIcon&amp;lt;/code&amp;gt; vorhanden ist, sollte per &amp;lt;code&amp;gt;attr device userReading&amp;lt;/code&amp;gt; mit folgendem Eintrag dafür gesorgt werden, dass für alle Tage ein Reading &amp;lt;code&amp;gt;fc#_weatherIcon&amp;lt;/code&amp;gt; vorhanden ist (alternativ könnten auch 2 Graphen gezeichnet werden, wobei der erste dann nur die ersten 7 Tage enthält und der zweite die letzen 7 Tage, will man nur die ersten 7 Tage darstellen braucht man das userReading nicht unbedingt).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
fc0_weatherIcon {ReadingsVal(&amp;quot;AU.xx.WE.Proplanta&amp;quot;,&amp;quot;fc0_weatherDayIcon&amp;quot;,&amp;quot;&amp;quot;);},&lt;br /&gt;
fc1_weatherIcon {ReadingsVal(&amp;quot;AU.xx.WE.Proplanta&amp;quot;,&amp;quot;fc1_weatherDayIcon&amp;quot;,&amp;quot;&amp;quot;);},&lt;br /&gt;
fc2_weatherIcon {ReadingsVal(&amp;quot;AU.xx.WE.Proplanta&amp;quot;,&amp;quot;fc2_weatherDayIcon&amp;quot;,&amp;quot;&amp;quot;);},&lt;br /&gt;
fc3_weatherIcon {ReadingsVal(&amp;quot;AU.xx.WE.Proplanta&amp;quot;,&amp;quot;fc3_weatherDayIcon&amp;quot;,&amp;quot;&amp;quot;);},&lt;br /&gt;
fc4_weatherIcon {ReadingsVal(&amp;quot;AU.xx.WE.Proplanta&amp;quot;,&amp;quot;fc4_weatherDayIcon&amp;quot;,&amp;quot;&amp;quot;);},&lt;br /&gt;
fc5_weatherIcon {ReadingsVal(&amp;quot;AU.xx.WE.Proplanta&amp;quot;,&amp;quot;fc5_weatherDayIcon&amp;quot;,&amp;quot;&amp;quot;);},&lt;br /&gt;
fc6_weatherIcon {ReadingsVal(&amp;quot;AU.xx.WE.Proplanta&amp;quot;,&amp;quot;fc6_weatherDayIcon&amp;quot;,&amp;quot;&amp;quot;);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Um die Icons darzustellen muss ein zusätzlicher Graph definiert werden. Dieser nutzt neben der Columnspec, die die URLs abruft den Parameter &amp;lt;code&amp;gt;data-ptype=&amp;quot;icons:#&amp;quot;&amp;lt;/code&amp;gt; (# ist eine Zahl und steht für die Nummer, beginnend bei 0 des Graphen, welcher für die y-Position der Icons verwendet werden soll) und den Stil &amp;lt;code&amp;gt;sym&amp;lt;/code&amp;gt;. Der Wert für die Symbolgröße sollte z.B. durch eine zusätzliche Definition im File fhem-tablet-ui-user.css in der Form:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* icon lines */&lt;br /&gt;
.ftui.l99icon	{ stroke:#DDA400; stroke-width:48px; fill:none; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden ein Beispiel, welches eine Linie für die Maximale Tagestemperatur zeichnet und auf dieser Linie die Wetter Icons darstellt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div data-type=&amp;quot;chart&amp;quot;&lt;br /&gt;
	 data-device=&amp;quot;AU.xx.WE.Proplanta&amp;quot;&lt;br /&gt;
	 data-logdevice=&#039;[&lt;br /&gt;
	 					&amp;quot;myLogProxy&amp;quot;,&lt;br /&gt;
	 					&amp;quot;myLogProxy&amp;quot;&lt;br /&gt;
	 				]&#039;&lt;br /&gt;
	 data-columnspec=&#039;[&lt;br /&gt;
	 					&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22weatherIcon\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;,&lt;br /&gt;
	 					&amp;quot;Func:logProxy_proplanta2Plot(\\x22AU.xx.WE.Proplanta\\x22,\\x22tempMax\\x22,$from,$to,12,\\x22day\\x22)&amp;quot;&lt;br /&gt;
	 				]&#039;&lt;br /&gt;
	 data-style=&#039;[&lt;br /&gt;
	 					&amp;quot;ftui l99icon&amp;quot;,&lt;br /&gt;
	 					&amp;quot;ftui l1fill&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-ptype=&#039;[&lt;br /&gt;
	 					&amp;quot;icons:1&amp;quot;,&lt;br /&gt;
	 					&amp;quot;quadraticSmooth&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-uaxis=&#039;[&lt;br /&gt;
	 					&amp;quot;primary&amp;quot;,&lt;br /&gt;
	 					&amp;quot;primary&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-legend=&#039;[&lt;br /&gt;
	 					&amp;quot;Wetterbedingung&amp;quot;,&lt;br /&gt;
	 					&amp;quot;Max. Temperature&amp;quot;&lt;br /&gt;
	 			]&#039;&lt;br /&gt;
	 data-yunit=&amp;quot;°C&amp;quot;&lt;br /&gt;
	 data-ytext=&amp;quot;Temperature (°C)&amp;quot;&lt;br /&gt;
	 data-timeformat=&amp;quot;ee\LF\dd.MM&amp;quot;&lt;br /&gt;
	 data-minvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-maxvalue=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-minvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-maxvalue_sec=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-daysago_start=&amp;quot;-1w&amp;quot;&lt;br /&gt;
	 data-y_margin=&amp;quot;20&amp;quot;&lt;br /&gt;
	 data-daysago_end=&amp;quot;-3w&amp;quot;&lt;br /&gt;
	 data-xticks=&amp;quot;1440&amp;quot;&lt;br /&gt;
	 data-yticks=&amp;quot;auto&amp;quot;&lt;br /&gt;
	 data-title=&amp;quot;14-Tage-Wettervorhersage&amp;quot;&lt;br /&gt;
	 data-showlegend=&amp;quot;true&amp;quot;&lt;br /&gt;
	 class=&amp;quot;nobuttons fullsize&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kuchendiagramme===&lt;br /&gt;
In folgendem Beispiel wird gezeigt, wie man ein &amp;quot;Kuchendiagramm&amp;quot; darstellen kann.&lt;br /&gt;
&lt;br /&gt;
[[File:PieChart.png]]&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie bei den Beispielen für die Wetter Darstellungen wird hierzu auch wieder logProxy benötigt. Zunächst muss die folgende zusätzliche Funktion in &amp;lt;code&amp;gt;99_myUtils.pm&amp;lt;/code&amp;gt; einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#---------------------------------------&lt;br /&gt;
# Funktion zum Erzeugen der Inputs für Kuchendiagramme&lt;br /&gt;
#---------------------------------------&lt;br /&gt;
sub logProxy_values2PieChart($$$$;$$) {&lt;br /&gt;
	my ($device, $reading, $angle_start, $angle_dif, $inner_rad, $show_text) = @_;&lt;br /&gt;
	Log3 undef, 1, &amp;quot;$device, $reading, $angle_start, $angle_dif, $inner_rad, $show_text\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	use constant PI =&amp;gt; 4 * atan2(1,1);&lt;br /&gt;
	&lt;br /&gt;
	my $value=ReadingsVal($device,$reading,0);&lt;br /&gt;
&lt;br /&gt;
	my $angle_delta = $value/100*360;&lt;br /&gt;
	$angle_start = $angle_start/100*360;&lt;br /&gt;
	&lt;br /&gt;
	my $rad=10;&lt;br /&gt;
	my $irad=0;&lt;br /&gt;
	if ($inner_rad) {&lt;br /&gt;
		$irad = $rad*$inner_rad;&lt;br /&gt;
	}&lt;br /&gt;
	my $angle=$angle_start/360*2.0*PI;&lt;br /&gt;
	my $x=$irad*sin($angle);&lt;br /&gt;
	my $y=$irad*cos($angle);&lt;br /&gt;
	my $ret .= &amp;quot;;p &amp;quot;.$x.&amp;quot; &amp;quot;.$y.&amp;quot;\n&amp;quot;; # add segment at angle $angle&lt;br /&gt;
	&lt;br /&gt;
	for (my $i=$angle_start; $i&amp;lt;=$angle_start+$angle_delta; $i+=$angle_dif) {&lt;br /&gt;
		$angle = $i/360*2.0*PI;&lt;br /&gt;
		$x = $rad*sin($angle);&lt;br /&gt;
		$y = $rad*cos($angle);&lt;br /&gt;
		$ret .= &amp;quot;;p &amp;quot;.$x.&amp;quot; &amp;quot;.$y.&amp;quot;\n&amp;quot;; # add segment at angle $angle&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	$angle = ($angle_start+$angle_delta)/360*2.0*PI; # add last segment &lt;br /&gt;
	$ret .= &amp;quot;;p &amp;quot;.$rad*sin($angle).&amp;quot; &amp;quot;.$rad*cos($angle).&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if ($inner_rad) {&lt;br /&gt;
		for (my $i=$angle_start; $i&amp;lt;$angle_start+$angle_delta; $i+=$angle_dif) {&lt;br /&gt;
			$angle = ($angle_start+$angle_start+$angle_delta-$i)/360*2.0*PI;&lt;br /&gt;
			$x = $irad*sin($angle);&lt;br /&gt;
			$y = $irad*cos($angle);&lt;br /&gt;
			$ret .= &amp;quot;;p &amp;quot;.$x.&amp;quot; &amp;quot;.$y.&amp;quot;\n&amp;quot;; # add segment at angle $angle&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$angle = ($angle_start)/360*2.0*PI; # add last segment &lt;br /&gt;
	$ret .= &amp;quot;;p &amp;quot;.$irad*sin($angle).&amp;quot; &amp;quot;.$irad*cos($angle).&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if ($show_text) { # show text values&lt;br /&gt;
		$x = ($rad+$irad)/2*sin((2*$angle_start+$angle_delta)/2/360*2.0*PI);&lt;br /&gt;
		$y = ($rad+$irad)/2*cos((2*$angle_start+$angle_delta)/2/360*2.0*PI);&lt;br /&gt;
&lt;br /&gt;
		$ret .= &amp;quot;;t &amp;quot;.$x.&amp;quot; &amp;quot;.$y.&amp;quot; middle &amp;quot;.$show_text.&amp;quot;:&amp;quot;.$value.&amp;quot;%\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return($ret);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In FHEM braucht man Readings, welche eine Zahl enthalten, die als Prozentwert interpretiert wird. Für jeden Prozentwert (also für jedes Reading) generiert die o.a. Funktion nun den Chart Input für ein Kuchenstück und liefert diesen als Antwort auf das GET, welches das Chart Widget auslöst. Dazu braucht die Funktion folgende Parameter: (Name des FHEM Devices, Name des Readings, Start Winkel des Kuchenstücks (Mathematisch gegen den Uhrzeigersinn in Grad), Delta Winkel zum Zeichnen (legt fest in welchen Schritten der Teilkreis des Kuchenstücks gezeichnet wird), Skalierungsfaktor für inneren Ring wenn ein Ring gezeichtnet werden soll (0 bedeutet komplette Kuchenstücke), optionaler Text der ins Kuchenstück vor die Prozentzahl geschrieben wird).&lt;br /&gt;
Im Folgenden eine Beispielkonfiguration für die Darstellung als Kuchendiagramm, die Readings heißen hier dPer1 bis dPer4. Der Startwinkel wird duch Aufsummierung der jeweils vorher schon gezeichneten Kuchenstücke gebildet, dadurch entstehen aneinander hängende Stücke.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
[[Datei:[[Datei:Beispiel.jpg]]]]&amp;lt;div class=&amp;quot;normal noaxes nobuttons&amp;quot;&lt;br /&gt;
        data-type=&amp;quot;chart&amp;quot;&lt;br /&gt;
        data-logdevice=&#039;[&amp;quot;lp&amp;quot;]&#039;&lt;br /&gt;
		data-logfile=&amp;quot;CURRENT&amp;quot;&lt;br /&gt;
        data-columnspec=&#039;[&lt;br /&gt;
			&amp;quot;Func:logProxy_values2PieChart(\&amp;quot;dPer1\&amp;quot;,\&amp;quot;state\&amp;quot;,ReadingsVal(\&amp;quot;dPer4\&amp;quot;,\&amp;quot;state\&amp;quot;,0)+ReadingsVal(\&amp;quot;dPer3\&amp;quot;,\&amp;quot;state\&amp;quot;,0),5,0,\&amp;quot;first\&amp;quot;)&amp;quot;,&lt;br /&gt;
			&amp;quot;Func:logProxy_values2PieChart(\&amp;quot;dPer2\&amp;quot;,\&amp;quot;state\&amp;quot;,ReadingsVal(\&amp;quot;dPer4\&amp;quot;,\&amp;quot;state\&amp;quot;,0)+ReadingsVal(\&amp;quot;dPer3\&amp;quot;,\&amp;quot;state\&amp;quot;,0)+ReadingsVal(\&amp;quot;dPer1\&amp;quot;,\&amp;quot;state\&amp;quot;,0),5,0,\&amp;quot;second\&amp;quot;)&amp;quot;,&lt;br /&gt;
			&amp;quot;Func:logProxy_values2PieChart(\&amp;quot;dPer3\&amp;quot;,\&amp;quot;state\&amp;quot;,ReadingsVal(\&amp;quot;dPer4\&amp;quot;,\&amp;quot;state\&amp;quot;,0),5,0,\&amp;quot;third\&amp;quot;)&amp;quot;,&lt;br /&gt;
			&amp;quot;Func:logProxy_values2PieChart(\&amp;quot;dPer4\&amp;quot;,\&amp;quot;state\&amp;quot;,0,5,0,\&amp;quot;fourth\&amp;quot;)&amp;quot;&lt;br /&gt;
		]&#039;&lt;br /&gt;
        data-style=&#039;[&amp;quot;ftui l0fill&amp;quot;,&amp;quot;ftui l1fill&amp;quot;,&amp;quot;ftui l2fill&amp;quot;,&amp;quot;ftui l3fill&amp;quot;]&#039;&lt;br /&gt;
        data-ptype=&#039;[&amp;quot;lines&amp;quot;]&#039;&lt;br /&gt;
        data-uaxis=&#039;[&amp;quot;primary&amp;quot;]&#039;&lt;br /&gt;
        data-legend=&#039;[&amp;quot;First&amp;quot;,&amp;quot;Second&amp;quot;,&amp;quot;Third&amp;quot;,&amp;quot;Fourth&amp;quot;]&#039;&lt;br /&gt;
		data-legendpos=&#039;[&amp;quot;left&amp;quot;,&amp;quot;top&amp;quot;]&#039;&lt;br /&gt;
        data-yunit=&amp;quot;&amp;quot;&lt;br /&gt;
        data-height=&amp;quot;300&amp;quot;&lt;br /&gt;
        data-width=&amp;quot;300&amp;quot;&lt;br /&gt;
		data-ddd=&#039;[&amp;quot;-40&amp;quot;,&amp;quot;0&amp;quot;,&amp;quot;0&amp;quot;]&#039;&lt;br /&gt;
		data-dddspace=&#039;[&amp;quot;-10&amp;quot;]&#039;&lt;br /&gt;
		data-dddwidth=&#039;[&amp;quot;10&amp;quot;]&#039;&lt;br /&gt;
		data-showlegend=&amp;quot;true&amp;quot;&lt;br /&gt;
		data-legend_horiz=&amp;quot;true&amp;quot;&lt;br /&gt;
        data-xticks=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fensterstatus offen/geschlossen===&lt;br /&gt;
Dieses Beispiel zeigt, wie ein Fensterkontakt, dessen Reading die Werte &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; einnimmt, als Graph gezeichnet werden kann. Technisch gesehen werden hier die Werte &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gezeichnet, indem über das Attribut &#039;&#039;&#039;data-columnspec&#039;&#039;&#039; dem Zustand &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; und allen anderen Zuständen der Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zugeordnet wird. Über das Attribut &#039;&#039;&#039;data-yticks&#039;&#039;&#039; wird die Beschriftung an der Y-Achse (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) gegen einen frei definierbaren Text ausgetauscht.&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;chart&amp;quot;&lt;br /&gt;
	data-device=&amp;quot;wz_fensterstatus&amp;quot;&lt;br /&gt;
	data-logdevice=&#039;[&amp;quot;myDbLog&amp;quot;]&#039;&lt;br /&gt;
	data-logfile=&#039;[&amp;quot;HISTORY&amp;quot;]&#039;&lt;br /&gt;
	data-columnspec=&#039;[&amp;quot;wz_fensterstatus:state:0::$val=($val=~\\x22open\\x22?1:0)&amp;quot;]&#039;&lt;br /&gt;
	data-style=&#039;[&amp;quot;ftui l4fill&amp;quot;]&#039;&lt;br /&gt;
	data-ptype=&#039;[&amp;quot;steps&amp;quot;]&#039;&lt;br /&gt;
	data-height=&amp;quot;290&amp;quot;&lt;br /&gt;
	data-yticks=&#039;[[0,&amp;quot;geschlossen&amp;quot;],[1,&amp;quot;offen&amp;quot;]]&#039;&lt;br /&gt;
	data-minvalue=&amp;quot;0&amp;quot;&lt;br /&gt;
	data-maxvalue=&amp;quot;1.1&amp;quot;&lt;br /&gt;
	data-nofulldays=&amp;quot;true&amp;quot;&lt;br /&gt;
	data-daysago_start=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-daysago_end=&amp;quot;-1&amp;quot;&lt;br /&gt;
	data-cursorgroup=&amp;quot;1&amp;quot;&lt;br /&gt;
	data-scrollgroup=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Das Beispiel funktioniert nur mit DbLog. Falls Logfiles verwendet werden muss statt &#039;$val&#039; &#039;$fld[&#039;&#039;num&#039;&#039;]&#039; verwendet werden. Hierbei steht &#039;&#039;num&#039;&#039; für die Spalte (beginnend bei 0) in der die Daten stehen.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
{{Link2Forum|Topic= 48450 |Message=401006|LinkText=Thread im FHEM-Forum}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI|Chart]]&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Harmony&amp;diff=32963</id>
		<title>Harmony</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Harmony&amp;diff=32963"/>
		<updated>2020-03-16T18:37:58Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Schreibfehler korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:harmony}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung Logitech Harmony Hub basierter Fernbedienungen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=harmony&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=37_harmony.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das FHEM-[[:Kategorie:Gerätemodul|Gerätemodul]] [[harmony]] bietet die Möglichkeit Logitech Harmony Hub basierte Fernbedienungen an FHEM anzubinden und so von FHEM aus Aktivitäten zu starten und zu stoppen, in FHEM auf das Starten und Stoppen von Aktivitäten über eine der mit dem Hub verbundenen Fernbedienungen zu reagieren oder auf Geräteebene jedes im Hub konfigurierte Gerät über IR, Bluetooth und/oder einen Smart Keyboard USB Dongle zu steuern.&lt;br /&gt;
&lt;br /&gt;
Unterstützt werden zur Zeit die Modelle Ultimate Hub, Ultimate Smart Control, Ultimate, Smart Keyboard sowie alle darauf basierenden Kombinationen mit Smart Control und Smart Keyboard Add-On.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
Seit Ende 2018 hat Logitech die undokumentierte Schnittstelle die für die Anbindung der Harmony an FHEM verwendet werden geschlossen. Nach viel Protest aus der Community wurde die XMPP-Schnittstelle als &amp;quot;Entwickler-Option&amp;quot; nach akzeptieren von Haftungsausschlüssen wieder zur Verfügung gestellt. Ab Firmware 4.15.250 und Harmony-App-Version 5.6 für iOS und Android ist die Option zur Aktivierung von XMPP direkt in den Einstellungen der Harmony App zu finden. Die Einstellung versteckt sich unter Menü &amp;gt; Harmony-Einrichtung &amp;gt; Geräte und Aktionen hinzufügen und bearbeiten &amp;gt; Fernbedienung und Hub &amp;gt; XMPP aktivieren.&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
  define &amp;lt;hub&amp;gt; harmony [&amp;lt;username&amp;gt; &amp;lt;password&amp;gt;] &amp;lt;ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier sind &amp;lt;code&amp;gt;username&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; die myharmony Zugangsdaten und &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt; ist die IP-Adresse des Hub im lokalen Netz.&lt;br /&gt;
&lt;br /&gt;
Für die Firmware-Versionen 3.x ist die volle Funktionalität des Moduls auch ohne Angaben von &amp;lt;code&amp;gt;username&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; gegeben. Ab Firmware 4.x muss beides angegeben werden. Sonst ist keine Steuerung auf Geräteebene möglich.&lt;br /&gt;
&lt;br /&gt;
==Allgemeines==&lt;br /&gt;
Aktivitäten und Geräte lassen sich an allen Stellen entweder als ID oder als Name angeben. Wenn der Name angegeben wird, müssen hierbei Leerzeichen durch einen Punkt ersetzt werden. Dies kann auch für eventuell andere im Namen vorhandene Sonderzeichen gelten.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten ==&lt;br /&gt;
Das Reading &amp;lt;code&amp;gt;currentActivity&amp;lt;/code&amp;gt; enthält die gerade laufende Aktivität. Beim Wechsel zwischen Aktivitäten erzeugt es Events, auf die in FHEM über &#039;&#039;notify&#039;&#039; reagiert werden kann. Das Reading &amp;lt;code&amp;gt;previousActivity&amp;lt;/code&amp;gt; enthält die davor laufende Aktivität, sofern diese bekannt ist. Dieses Reading erzeugt keine Events.&lt;br /&gt;
&lt;br /&gt;
In den Internals &amp;lt;code&amp;gt;currentActivityID&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;previousActivityID&amp;lt;/code&amp;gt; stehen die dazu gehörenden IDs der Aktivitäten.&lt;br /&gt;
&lt;br /&gt;
Mögliche Aktivitäten anzeigen geht über&lt;br /&gt;
  get &amp;lt;hub&amp;gt; activities&lt;br /&gt;
&lt;br /&gt;
Eine der Aktivitäten via FHEM starten über&lt;br /&gt;
  set &amp;lt;hub&amp;gt; activity &amp;lt;activityname&amp;gt; &lt;br /&gt;
Wobei der Activityname zwingend so geschrieben werden muss wie FHEM ihn im Dropdown anzeigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer laufenden Aktivität kann mit&lt;br /&gt;
  set &amp;lt;hub&amp;gt; command &amp;lt;command&amp;gt;&lt;br /&gt;
ein IR-Kommando an eines der beteiligten Geräte gesendet werden.&lt;br /&gt;
&lt;br /&gt;
== Geräteebene ==&lt;br /&gt;
Innerhalb und außerhalb einer laufenden Aktivität kann mit&lt;br /&gt;
  set &amp;lt;hub&amp;gt; command &amp;lt;id|name&amp;gt; &amp;lt;command&amp;gt;&lt;br /&gt;
ein IR-Kommando an eines der im Hub bekannten Geräte gesendet werden. Hierbei ist darauf zu achten, dass innerhalb einer Aktivität keine Kommandos verwendet werden sollten, die den Smart-State betreffen.&lt;br /&gt;
&lt;br /&gt;
Die möglichen Kommandos kann man sich über &lt;br /&gt;
  get &amp;lt;hub&amp;gt; deviceCommands&lt;br /&gt;
anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass wenn in der so erzeugten Liste ein Gerät mit Leerzeichen geschrieben wird, dass man im FHEM Befehl das Leerzeichen durch einen &amp;quot;.&amp;quot; ersetzen muss. Hat man bspw. ein Harmony Device &amp;quot;Samsung TV&amp;quot; ist der Gerätebefehl zum anschalten:&lt;br /&gt;
  set &amp;lt;hub&amp;gt; command Samsung.TV PowerOn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FHEM Devices auf Geräteebene ===&lt;br /&gt;
Es ist möglich, sich für einzelne oder alle im Hub konfigurierten Geräte ein zugehöriges FHEM-Device anlegen zu lassen:&lt;br /&gt;
  set &amp;lt;hub&amp;gt; autocreate [&amp;lt;id|name&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Beim Umschalten zwischen Aktivitäten wird in diesen FHEM-Devices im Reading power der in der Aktivität konfigurierten Einschaltzustand (on, off oder manual) angezeigt. Mit einem &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;power&amp;lt;/code&amp;gt; Events lässt sich in FHEM auf einzelne Geräte reagieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Diese FHEM-Device spiegeln nicht den tatsächlichen Gerätezustand wieder, sondern den innerhalb einer Aktivität beabsichtigen Zustand. Der tatsächliche Zustand kann z.B. auf Grund von Empfangsproblemen abweichen.&lt;br /&gt;
&lt;br /&gt;
Das get &amp;lt;code&amp;gt;commands&amp;lt;/code&amp;gt; sowie die set &amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hidDevice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cursor&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; Kommandos auf Hub-Ebene stehen hier direkt und ohne Angabe von Device-ID oder Name zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Kommandos an FHEM senden ===&lt;br /&gt;
Da es (zur Zeit) nicht möglich ist, Geräte-Kommandos oder einzelne Tasten direkt vom HUB zu empfangen, muss hierzu ein zusätzlicher Empfänger in FHEM eingebunden werden. Dies kann z.B. mit einem MCE-IR Empfänger oder per Bluetooth geschehen. Ein FHEM-Modul hierzu findet sich im in diesem {{Link2Forum|Topic=36257|LinkText=Forenthread}}.&lt;br /&gt;
&lt;br /&gt;
Mit dem in diesem {{Link2Forum|Topic=51619|LinkText=Forenthread}} vorgestellten Modul ist es möglich einzeln belegte Tasten der Harmony über das Roku External Control Protocol per Netzwerk an FHEM zu senden und dort auszuwerten.&lt;br /&gt;
&lt;br /&gt;
== Smart Keyboard ==&lt;br /&gt;
Der Harmony Hub kann über Bluetooth oder die zum Smart Keyboard gehörenden USB-Dongle mit einem Rechner, Media PC oder sonstigem Gerät, das Tastatureingabe unterstützt, verbunden werden. FHEM kann diese Verbindung nutzen, um beliebige Tastendrücke an ein solches Gerät zu senden. Das können Texte sein, Cursorbewegungen oder die Power-, Multimedia oder sonstigen Funktionstasten, die das Gerät unterstützt.&lt;br /&gt;
&lt;br /&gt;
Alle gesendeten Tastendrücke beziehen sich normalerweise auf das zur gerade laufenden Aktivität gehörende Tastatureingabegerät. Mit dem &amp;lt;code&amp;gt;hidDevice&amp;lt;/code&amp;gt; Kommando lässt sich die Tastatureingabe auf jedes im Hub dafür konfigurierte Gerät umschalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Dieses Umschalten kann einige Sekunden dauern, da hierbei die bestehende Bluetooth-Verbindung getrennt und eine neue aufgebaut wird.&lt;br /&gt;
&lt;br /&gt;
Es stehen die Kommandos &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cursor&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
Gehe in PLEX auf die Library Musik und spiele das erste Item in der OnDeck Liste:&lt;br /&gt;
  set &amp;lt;hub&amp;gt; text M&lt;br /&gt;
  set &amp;lt;hub&amp;gt; cursor right&lt;br /&gt;
  set &amp;lt;hub&amp;gt; text p&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Vorgeschaltete Funksteckdose ansteuern ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorbereitung Harmony&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nachdem die Geräte mit Strom versorgt werden, benötigen sie einige Sekunden, bis sie ihre Einschaltsignale verarbeiten können. Diese Verzögerung wird durch ein Dummy Gerät in jeder Aktion erzeugt.&lt;br /&gt;
&lt;br /&gt;
1) In MyHarmony einen Amazon Fire TV anlegen und ihm einen passenden Namen geben (z.B. Pause)&lt;br /&gt;
&lt;br /&gt;
2) Unter &amp;quot;Geräte&amp;quot; dieses markieren und per &amp;quot;Ändern der Betriebseinstellungen&amp;quot; die Einstellungen aufrufen&lt;br /&gt;
&lt;br /&gt;
3) Punkt &amp;quot;Ich möchte dieses Gerät eingeschaltet lassen, wenn Aktionen gewechselt werden und nur durch Drücken der Off-Taste ausschalten&amp;quot; auswählen&lt;br /&gt;
&lt;br /&gt;
4) Einen harmlosen Befehl einfügen (&amp;quot;Search&amp;quot;), danach eine Verzögerung von 5000ms einbauen und dann noch einen Befehl (&amp;quot;Search&amp;quot;). Dies bewirkt eine Verzögerung von 5 Sekunden beim Ein- und Ausschalten&lt;br /&gt;
&lt;br /&gt;
5) Unter Aktionen die Aktion auswählen und per &amp;quot;Einstellung ändern&amp;quot; das neue Gerät hinzufügen&lt;br /&gt;
&lt;br /&gt;
6) Per &amp;quot;Diese Aktion anpassen&amp;quot; das neue Gerät an die erste Stelle schieben&lt;br /&gt;
&lt;br /&gt;
7) Schritte 5-7 für alle Aktionen wiederholen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfiguration in FHEM&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1) Der Harmony Hub muss existieren&lt;br /&gt;
&lt;br /&gt;
  #Harmony Hub Wohnzimmer definieren&lt;br /&gt;
  define wz_harmonyhub harmony 192.168.123.123&lt;br /&gt;
&lt;br /&gt;
2) Ihr benötigt eine fertig konfigurierte Funksteckdose (hier &amp;quot;wz_Multimedia&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
3) Ihr baut eine Bedingung, die auf den Ein- und Ausschaltvorgang des Harmony Hub (hier wz_harmonyhub) reagiert und die Steckdose (hier wz_Multimedia) schaltet. Es wird eine &#039;&#039;&#039;zusätzliche&#039;&#039;&#039; Pause genutzt von 0 Sekunden bei der ersten Bedingung (wäre kontraproduktiv) und 10 Sekunden bei der zweiten Bedingung (DOELSEIF). Bei der Nutzung eines Beamers lässt sich hierüber die Abkühlzeit einstellen. Im Beispiel bleiben den Geräten somit 15 Sekunden zum Ausschalten und 5 Sekunden um die Empfangsbereitschaft herzustellen. Die erste Bedingung im DOIF ist eine Regex, da &amp;quot;currentActivity&amp;quot; bei mehrfachem Abschalten hintereinander immer wieder von &amp;quot;PowerOff&amp;quot; auf &amp;quot;Stopping PowerOff&amp;quot; wechselt. &lt;br /&gt;
&lt;br /&gt;
  #Auf den Schaltvorgang des Hubs reagieren&lt;br /&gt;
  define wz_Multimedia_Automatik DOIF ([wz_harmonyhub:currentActivity] !~ /PowerOff/) (set wz_Multimedia on) DOELSEIF ([wz_harmonyhub:activity] eq &amp;quot;PowerOff&amp;quot;) (set wz_Multimedia off)&lt;br /&gt;
  attr wz_Multimedia_Automatik wait 0:10&lt;br /&gt;
&lt;br /&gt;
====Weitere Möglichkeiten====&lt;br /&gt;
Statt Fire TV kann jedes andere nicht vorhandene Gerät als Platzhalter in der Harmony verwendet werden. In diesem Gerät kann man auch direkt die Einschaltverzögerung anpassen um die nötige Wartezeit zu erhalten.&lt;br /&gt;
Besser als ein notify oder DOIF auf Activity-Ebene ist es über die Harmony autocreate funktion ein FHEM Device für die platzhalter Steckdose anzulegen und dort dann auf das power Event zu reagieren. Damit ist man unabhängig von allen Änderungen bei den Activities.&lt;br /&gt;
&lt;br /&gt;
===Button für eine bestimmte Activity im Frontend und Homekit über readingsProxy ===&lt;br /&gt;
In FHEMWEB und Homebridge:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define Fernsehen readingsProxy &amp;lt;hub&amp;gt;:activity&lt;br /&gt;
attr Fernsehen devStateIcon on:control_on_off@green off:control_standby&lt;br /&gt;
attr Fernsehen event-on-change-reading .*&lt;br /&gt;
attr Fernsehen genericDeviceType switch&lt;br /&gt;
attr Fernsehen setFn { return &#039;activity &amp;lt;meine activity&amp;gt;&#039; if( $CMD eq &#039;on&#039; );; return &#039;off&#039;;; }&lt;br /&gt;
attr Fernsehen setList on off&lt;br /&gt;
attr Fernsehen valueFn { return &#039;on&#039; if( $VALUE eq &#039;&amp;lt;meine activity&amp;gt;&#039; );; return &#039;off&#039;;; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich im TableUI:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&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;switch&amp;quot; data-device=&amp;quot;Fernsehen&amp;quot; data-icon=&amp;quot;fa-tv&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;narrow&amp;quot;&amp;gt;FERNSEHEN&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;
== Bekannte Probleme ==&lt;br /&gt;
Wenn FHEM den Harmony Hub nicht erreichen kann, blockiert das Modul FHEM für den Timeout von 2 Sekunden im Abstand von nur wenigen Sekunden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[...]&lt;br /&gt;
2015.12.26 18:25:45 1: Perfmon: possible freeze starting at 18:25:43, delay is 2.794&lt;br /&gt;
2015.12.26 18:25:58 1: Perfmon: possible freeze starting at 18:25:56, delay is 2.709&lt;br /&gt;
2015.12.26 18:26:11 1: Perfmon: possible freeze starting at 18:26:09, delay is 2.676&lt;br /&gt;
2015.12.26 18:26:24 1: Perfmon: possible freeze starting at 18:26:22, delay is 2.686&lt;br /&gt;
2015.12.26 18:26:37 1: Perfmon: possible freeze starting at 18:26:35, delay is 2.686&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da dieses Blockieren die Funktionalität von FHEM beeinträchtigen kann, sollte man bei geplanten Auszeiten des Hubs diesen disablen:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;hub&amp;gt; disable 1&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://myharmony.com myHarmony] Logitech Harmony Hersteller&lt;br /&gt;
* [http://www.harmony-remote-forum.de/portal.php Harmony Remote Forum] deutsches Harmony Forum&lt;br /&gt;
* {{Link2Forum|Topic=14163|LinkText=Thread im FHEM Forum}} Weitere Infos im FHEM Forum Thread&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Harmony&amp;diff=32960</id>
		<title>Harmony</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Harmony&amp;diff=32960"/>
		<updated>2020-03-16T13:53:33Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Aktivierung der XMPP-Schnittstelle über die Harmony App beschrieben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:harmony}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung Logitech Harmony Hub basierter Fernbedienungen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=harmony&lt;br /&gt;
|ModForumArea=Multimedia&lt;br /&gt;
|ModTechName=37_harmony.pm&lt;br /&gt;
|ModOwner=Andre ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:justme|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das FHEM-[[:Kategorie:Gerätemodul|Gerätemodul]] [[harmony]] bietet die Möglichkeit Logitech Harmony Hub basierte Fernbedienungen an FHEM anzubinden und so von FHEM aus Aktivitäten zu starten und zu stoppen, in FHEM auf das Starten und Stoppen von Aktivitäten über eine der mit dem Hub verbundenen Fernbedienungen zu reagieren oder auf Geräteebene jedes im Hub konfigurierte Gerät über IR, Bluetooth und/oder einen Smart Keyboard USB Dongle zu steuern.&lt;br /&gt;
&lt;br /&gt;
Unterstützt werden zur Zeit die Modelle Ultimate Hub, Ultimate Smart Control, Ultimate, Smart Keyboard sowie alle darauf basierenden Kombinationen mit Smart Control und Smart Keyboard Add-On.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung ==&lt;br /&gt;
Seit Ende 2018 hat Logitech die undokumentierten Schnittstellen die für die Anbindung der Harmony an FHEM verwendet werden geschlossen. Nach viel Protest aus der Community wurde die XMPP-Schnittstelle als &amp;quot;Entwickler-Option&amp;quot; nach akzeptieren von Haftungsauscshlussen wieder zur Verfügung gestellt. Ab Firmware 4.15.250 und Harmony-App-Version 5.6 für iOS und Android ist die Option zur Aktivierung von XMPP direkt in den Einstellungen der Harmony App zu finden. Die Einstellung versteckt sich unter Menü &amp;gt; Harmony-Einrichtung &amp;gt; Geräte und Aktionen hinzufügen und bearbeiten &amp;gt; Fernbedienung und Hub &amp;gt; XMPP aktivieren.&lt;br /&gt;
&lt;br /&gt;
== Define ==&lt;br /&gt;
  define &amp;lt;hub&amp;gt; harmony [&amp;lt;username&amp;gt; &amp;lt;password&amp;gt;] &amp;lt;ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier sind &amp;lt;code&amp;gt;username&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; die myharmony Zugangsdaten und &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt; ist die IP-Adresse des Hub im lokalen Netz.&lt;br /&gt;
&lt;br /&gt;
Für die Firmware-Versionen 3.x ist die volle Funktionalität des Moduls auch ohne Angaben von &amp;lt;code&amp;gt;username&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; gegeben. Ab Firmware 4.x muss beides angegeben werden. Sonst ist keine Steuerung auf Geräteebene möglich.&lt;br /&gt;
&lt;br /&gt;
==Allgemeines==&lt;br /&gt;
Aktivitäten und Geräte lassen sich an allen Stellen entweder als ID oder als Name angeben. Wenn der Name angegeben wird, müssen hierbei Leerzeichen durch einen Punkt ersetzt werden. Dies kann auch für eventuell andere im Namen vorhandene Sonderzeichen gelten.&lt;br /&gt;
&lt;br /&gt;
== Aktivitäten ==&lt;br /&gt;
Das Reading &amp;lt;code&amp;gt;currentActivity&amp;lt;/code&amp;gt; enthält die gerade laufende Aktivität. Beim Wechsel zwischen Aktivitäten erzeugt es Events, auf die in FHEM über &#039;&#039;notify&#039;&#039; reagiert werden kann. Das Reading &amp;lt;code&amp;gt;previousActivity&amp;lt;/code&amp;gt; enthält die davor laufende Aktivität, sofern diese bekannt ist. Dieses Reading erzeugt keine Events.&lt;br /&gt;
&lt;br /&gt;
In den Internals &amp;lt;code&amp;gt;currentActivityID&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;previousActivityID&amp;lt;/code&amp;gt; stehen die dazu gehörenden IDs der Aktivitäten.&lt;br /&gt;
&lt;br /&gt;
Mögliche Aktivitäten anzeigen geht über&lt;br /&gt;
  get &amp;lt;hub&amp;gt; activities&lt;br /&gt;
&lt;br /&gt;
Eine der Aktivitäten via FHEM starten über&lt;br /&gt;
  set &amp;lt;hub&amp;gt; activity &amp;lt;activityname&amp;gt; &lt;br /&gt;
Wobei der Activityname zwingend so geschrieben werden muss wie FHEM ihn im Dropdown anzeigt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer laufenden Aktivität kann mit&lt;br /&gt;
  set &amp;lt;hub&amp;gt; command &amp;lt;command&amp;gt;&lt;br /&gt;
ein IR-Kommando an eines der beteiligten Geräte gesendet werden.&lt;br /&gt;
&lt;br /&gt;
== Geräteebene ==&lt;br /&gt;
Innerhalb und außerhalb einer laufenden Aktivität kann mit&lt;br /&gt;
  set &amp;lt;hub&amp;gt; command &amp;lt;id|name&amp;gt; &amp;lt;command&amp;gt;&lt;br /&gt;
ein IR-Kommando an eines der im Hub bekannten Geräte gesendet werden. Hierbei ist darauf zu achten, dass innerhalb einer Aktivität keine Kommandos verwendet werden sollten, die den Smart-State betreffen.&lt;br /&gt;
&lt;br /&gt;
Die möglichen Kommandos kann man sich über &lt;br /&gt;
  get &amp;lt;hub&amp;gt; deviceCommands&lt;br /&gt;
anzeigen lassen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass wenn in der so erzeugten Liste ein Gerät mit Leerzeichen geschrieben wird, dass man im FHEM Befehl das Leerzeichen durch einen &amp;quot;.&amp;quot; ersetzen muss. Hat man bspw. ein Harmony Device &amp;quot;Samsung TV&amp;quot; ist der Gerätebefehl zum anschalten:&lt;br /&gt;
  set &amp;lt;hub&amp;gt; command Samsung.TV PowerOn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FHEM Devices auf Geräteebene ===&lt;br /&gt;
Es ist möglich, sich für einzelne oder alle im Hub konfigurierten Geräte ein zugehöriges FHEM-Device anlegen zu lassen:&lt;br /&gt;
  set &amp;lt;hub&amp;gt; autocreate [&amp;lt;id|name&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Beim Umschalten zwischen Aktivitäten wird in diesen FHEM-Devices im Reading power der in der Aktivität konfigurierten Einschaltzustand (on, off oder manual) angezeigt. Mit einem &#039;&#039;notify&#039;&#039; auf &amp;lt;code&amp;gt;power&amp;lt;/code&amp;gt; Events lässt sich in FHEM auf einzelne Geräte reagieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Diese FHEM-Device spiegeln nicht den tatsächlichen Gerätezustand wieder, sondern den innerhalb einer Aktivität beabsichtigen Zustand. Der tatsächliche Zustand kann z.B. auf Grund von Empfangsproblemen abweichen.&lt;br /&gt;
&lt;br /&gt;
Das get &amp;lt;code&amp;gt;commands&amp;lt;/code&amp;gt; sowie die set &amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hidDevice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cursor&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; Kommandos auf Hub-Ebene stehen hier direkt und ohne Angabe von Device-ID oder Name zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== Kommandos an FHEM senden ===&lt;br /&gt;
Da es (zur Zeit) nicht möglich ist, Geräte-Kommandos oder einzelne Tasten direkt vom HUB zu empfangen, muss hierzu ein zusätzlicher Empfänger in FHEM eingebunden werden. Dies kann z.B. mit einem MCE-IR Empfänger oder per Bluetooth geschehen. Ein FHEM-Modul hierzu findet sich im in diesem {{Link2Forum|Topic=36257|LinkText=Forenthread}}.&lt;br /&gt;
&lt;br /&gt;
Mit dem in diesem {{Link2Forum|Topic=51619|LinkText=Forenthread}} vorgestellten Modul ist es möglich einzeln belegte Tasten der Harmony über das Roku External Control Protocol per Netzwerk an FHEM zu senden und dort auszuwerten.&lt;br /&gt;
&lt;br /&gt;
== Smart Keyboard ==&lt;br /&gt;
Der Harmony Hub kann über Bluetooth oder die zum Smart Keyboard gehörenden USB-Dongle mit einem Rechner, Media PC oder sonstigem Gerät, das Tastatureingabe unterstützt, verbunden werden. FHEM kann diese Verbindung nutzen, um beliebige Tastendrücke an ein solches Gerät zu senden. Das können Texte sein, Cursorbewegungen oder die Power-, Multimedia oder sonstigen Funktionstasten, die das Gerät unterstützt.&lt;br /&gt;
&lt;br /&gt;
Alle gesendeten Tastendrücke beziehen sich normalerweise auf das zur gerade laufenden Aktivität gehörende Tastatureingabegerät. Mit dem &amp;lt;code&amp;gt;hidDevice&amp;lt;/code&amp;gt; Kommando lässt sich die Tastatureingabe auf jedes im Hub dafür konfigurierte Gerät umschalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Dieses Umschalten kann einige Sekunden dauern, da hierbei die bestehende Bluetooth-Verbindung getrennt und eine neue aufgebaut wird.&lt;br /&gt;
&lt;br /&gt;
Es stehen die Kommandos &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cursor&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;special&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
Gehe in PLEX auf die Library Musik und spiele das erste Item in der OnDeck Liste:&lt;br /&gt;
  set &amp;lt;hub&amp;gt; text M&lt;br /&gt;
  set &amp;lt;hub&amp;gt; cursor right&lt;br /&gt;
  set &amp;lt;hub&amp;gt; text p&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Vorgeschaltete Funksteckdose ansteuern ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vorbereitung Harmony&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nachdem die Geräte mit Strom versorgt werden, benötigen sie einige Sekunden, bis sie ihre Einschaltsignale verarbeiten können. Diese Verzögerung wird durch ein Dummy Gerät in jeder Aktion erzeugt.&lt;br /&gt;
&lt;br /&gt;
1) In MyHarmony einen Amazon Fire TV anlegen und ihm einen passenden Namen geben (z.B. Pause)&lt;br /&gt;
&lt;br /&gt;
2) Unter &amp;quot;Geräte&amp;quot; dieses markieren und per &amp;quot;Ändern der Betriebseinstellungen&amp;quot; die Einstellungen aufrufen&lt;br /&gt;
&lt;br /&gt;
3) Punkt &amp;quot;Ich möchte dieses Gerät eingeschaltet lassen, wenn Aktionen gewechselt werden und nur durch Drücken der Off-Taste ausschalten&amp;quot; auswählen&lt;br /&gt;
&lt;br /&gt;
4) Einen harmlosen Befehl einfügen (&amp;quot;Search&amp;quot;), danach eine Verzögerung von 5000ms einbauen und dann noch einen Befehl (&amp;quot;Search&amp;quot;). Dies bewirkt eine Verzögerung von 5 Sekunden beim Ein- und Ausschalten&lt;br /&gt;
&lt;br /&gt;
5) Unter Aktionen die Aktion auswählen und per &amp;quot;Einstellung ändern&amp;quot; das neue Gerät hinzufügen&lt;br /&gt;
&lt;br /&gt;
6) Per &amp;quot;Diese Aktion anpassen&amp;quot; das neue Gerät an die erste Stelle schieben&lt;br /&gt;
&lt;br /&gt;
7) Schritte 5-7 für alle Aktionen wiederholen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfiguration in FHEM&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1) Der Harmony Hub muss existieren&lt;br /&gt;
&lt;br /&gt;
  #Harmony Hub Wohnzimmer definieren&lt;br /&gt;
  define wz_harmonyhub harmony 192.168.123.123&lt;br /&gt;
&lt;br /&gt;
2) Ihr benötigt eine fertig konfigurierte Funksteckdose (hier &amp;quot;wz_Multimedia&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
3) Ihr baut eine Bedingung, die auf den Ein- und Ausschaltvorgang des Harmony Hub (hier wz_harmonyhub) reagiert und die Steckdose (hier wz_Multimedia) schaltet. Es wird eine &#039;&#039;&#039;zusätzliche&#039;&#039;&#039; Pause genutzt von 0 Sekunden bei der ersten Bedingung (wäre kontraproduktiv) und 10 Sekunden bei der zweiten Bedingung (DOELSEIF). Bei der Nutzung eines Beamers lässt sich hierüber die Abkühlzeit einstellen. Im Beispiel bleiben den Geräten somit 15 Sekunden zum Ausschalten und 5 Sekunden um die Empfangsbereitschaft herzustellen. Die erste Bedingung im DOIF ist eine Regex, da &amp;quot;currentActivity&amp;quot; bei mehrfachem Abschalten hintereinander immer wieder von &amp;quot;PowerOff&amp;quot; auf &amp;quot;Stopping PowerOff&amp;quot; wechselt. &lt;br /&gt;
&lt;br /&gt;
  #Auf den Schaltvorgang des Hubs reagieren&lt;br /&gt;
  define wz_Multimedia_Automatik DOIF ([wz_harmonyhub:currentActivity] !~ /PowerOff/) (set wz_Multimedia on) DOELSEIF ([wz_harmonyhub:activity] eq &amp;quot;PowerOff&amp;quot;) (set wz_Multimedia off)&lt;br /&gt;
  attr wz_Multimedia_Automatik wait 0:10&lt;br /&gt;
&lt;br /&gt;
====Weitere Möglichkeiten====&lt;br /&gt;
Statt Fire TV kann jedes andere nicht vorhandene Gerät als Platzhalter in der Harmony verwendet werden. In diesem Gerät kann man auch direkt die Einschaltverzögerung anpassen um die nötige Wartezeit zu erhalten.&lt;br /&gt;
Besser als ein notify oder DOIF auf Activity-Ebene ist es über die Harmony autocreate funktion ein FHEM Device für die platzhalter Steckdose anzulegen und dort dann auf das power Event zu reagieren. Damit ist man unabhängig von allen Änderungen bei den Activities.&lt;br /&gt;
&lt;br /&gt;
===Button für eine bestimmte Activity im Frontend und Homekit über readingsProxy ===&lt;br /&gt;
In FHEMWEB und Homebridge:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define Fernsehen readingsProxy &amp;lt;hub&amp;gt;:activity&lt;br /&gt;
attr Fernsehen devStateIcon on:control_on_off@green off:control_standby&lt;br /&gt;
attr Fernsehen event-on-change-reading .*&lt;br /&gt;
attr Fernsehen genericDeviceType switch&lt;br /&gt;
attr Fernsehen setFn { return &#039;activity &amp;lt;meine activity&amp;gt;&#039; if( $CMD eq &#039;on&#039; );; return &#039;off&#039;;; }&lt;br /&gt;
attr Fernsehen setList on off&lt;br /&gt;
attr Fernsehen valueFn { return &#039;on&#039; if( $VALUE eq &#039;&amp;lt;meine activity&amp;gt;&#039; );; return &#039;off&#039;;; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich im TableUI:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&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;switch&amp;quot; data-device=&amp;quot;Fernsehen&amp;quot; data-icon=&amp;quot;fa-tv&amp;quot; class=&amp;quot;cell&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;label&amp;quot; class=&amp;quot;narrow&amp;quot;&amp;gt;FERNSEHEN&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;
== Bekannte Probleme ==&lt;br /&gt;
Wenn FHEM den Harmony Hub nicht erreichen kann, blockiert das Modul FHEM für den Timeout von 2 Sekunden im Abstand von nur wenigen Sekunden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[...]&lt;br /&gt;
2015.12.26 18:25:45 1: Perfmon: possible freeze starting at 18:25:43, delay is 2.794&lt;br /&gt;
2015.12.26 18:25:58 1: Perfmon: possible freeze starting at 18:25:56, delay is 2.709&lt;br /&gt;
2015.12.26 18:26:11 1: Perfmon: possible freeze starting at 18:26:09, delay is 2.676&lt;br /&gt;
2015.12.26 18:26:24 1: Perfmon: possible freeze starting at 18:26:22, delay is 2.686&lt;br /&gt;
2015.12.26 18:26:37 1: Perfmon: possible freeze starting at 18:26:35, delay is 2.686&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da dieses Blockieren die Funktionalität von FHEM beeinträchtigen kann, sollte man bei geplanten Auszeiten des Hubs diesen disablen:&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;hub&amp;gt; disable 1&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://myharmony.com myHarmony] Logitech Harmony Hersteller&lt;br /&gt;
* [http://www.harmony-remote-forum.de/portal.php Harmony Remote Forum] deutsches Harmony Forum&lt;br /&gt;
* {{Link2Forum|Topic=14163|LinkText=Thread im FHEM Forum}} Weitere Infos im FHEM Forum Thread&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unterhaltungselektronik]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=27736</id>
		<title>Mi vacuum</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=27736"/>
		<updated>2018-08-21T20:49:42Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Auslesen und Definition von Zonen ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
=Mi Vacuum=&lt;br /&gt;
Wie der preiswerte Staubsaugerroboter auch auf FHEM hört...&lt;br /&gt;
&lt;br /&gt;
==Für wen ist die Anleitung gedacht?==&lt;br /&gt;
Ich gehe davon aus, dass ihr ein funktionierendes FHEM auf einem Linux Rechner (Debian) betreibt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin denke ich, dass euer Hauptarbeitsrechner unter Windows läuft.&lt;br /&gt;
&lt;br /&gt;
Als Smartphone OS Android (wer Apple hat, kann gerne die Token-Auslese-Geschichte hier beschreiben).&lt;br /&gt;
&lt;br /&gt;
Um das Teil auch von Alexa aus ein und aus zu schalten, sollte auch die Installation von Alexa in FHEM fertig sein.&lt;br /&gt;
&lt;br /&gt;
==Die Einrichtung des Moduls==&lt;br /&gt;
Das ist insofern spannend, als das Modul nicht offiziell in FHEM eingecheckt ist. Man muss also das Modul runterladen, auf den FHEM Rechner bringen etc...&lt;br /&gt;
&lt;br /&gt;
===Vorarbeiten (Linux)===&lt;br /&gt;
Zunächst fangen wir mal auf unserem FHEM Rechner an. Mit Putty verbinden wir uns per SSH mit dem FHEM Computer.&lt;br /&gt;
&lt;br /&gt;
Folgende Befehle können benötigt werden (Debian):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libdigest-md5-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-cbc-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Rijndael_PP&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-ecb-perl&amp;lt;/code&amp;gt; (nur nötig, wenn ihr einen verschlüsselten Token mit 96 Zeichen habt)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Cipher::AES&amp;lt;/code&amp;gt; (nur nötig, wenn Crypt::Rijndael_PP aus irgendwelchen Gründen nicht funktioniert)&lt;br /&gt;
Wenn bei dem ein oder anderen Modul die Meldung kommt, dass es schon installiert ist, einfach mit dem nächsten Befehl weiter machen. Das CPAN Teil würde ich am Schluss machen, das braucht ziemlich lang zum installieren.&lt;br /&gt;
&lt;br /&gt;
===Vorarbeiten am Smartphone (Token)===&lt;br /&gt;
Das Problem ist folgendes:&lt;br /&gt;
&lt;br /&gt;
Wenn der Roboter mit dem WLAN verbunden wird, generiert er einen Token. Das ist ein Schlüssel, ohne den er sich nicht steuern lässt. Damit FHEM drauf zugreifen kann, benötigt man diesen Token.&lt;br /&gt;
&lt;br /&gt;
Mit den neueren Versionen der MiHome App klappt das Auslesen der Tokens leider nicht mehr.&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei Android Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Ich gehe davon aus, dass der Staubsauger mit der original MiHome App eingebunden ist und funktioniert. (Ich habe bei der Einrichtung des Servers =&amp;gt; &amp;quot;other&amp;quot; gewählt. Offenbar wollen neuere Staubsauger sich mit &amp;quot;China Mainland&amp;quot; nicht mehr verbinden. Tut hier an dieser Stelle zwar nichts zur Sache, aber vielleicht hilft es dem ein oder anderen. Wenn man die Region gewechselt hat, muss man auch den Staubsauger neu einbinden)&lt;br /&gt;
&lt;br /&gt;
* MiHome löschen&lt;br /&gt;
* alte MiHome suchen (APKMirror z.B., Version 5.0.19 hat bei mir funktioniert, unsichere Quellen müssen erlaubt sein)&lt;br /&gt;
* runtergeladene MiHome App öffnen und anmelden (sollte ganz normal den Sauger finden)&lt;br /&gt;
* USB-Debugging am Handy einschalten (Entwickleroptionen...)&lt;br /&gt;
* Handy mit USB Kabel und PC verbinden&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] 1.6 runterladen und öffnen&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] erzeugt nun am Handy ein Backup&lt;br /&gt;
* anschließend zeigt es den Token direkt am PC an&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei iOS Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen des Tokens mit iOS Endgeräten kann die Anleitung unter folgendem Link befolgt werden: [https://forum.smartapfel.de/forum/thread/370-xiaomi-token-auslesen/]&lt;br /&gt;
&lt;br /&gt;
===Installation des inoffiziellen Moduls===&lt;br /&gt;
Der folgende Teil ist für völlige Noobs. Wenn ihr einen eleganteren Weg kennt, her damit.&lt;br /&gt;
&lt;br /&gt;
Zunächst bitte das Modul aus dem Forum herunterladen.&lt;br /&gt;
[https://forum.fhem.de/index.php/topic,73052.0.htmlm Hier] befindet sich der Thread. Markus M. hat sich die Mühe gemacht, ein Modul zu schreiben. Solange es nicht offiziell eingecheckt ist, muss man es händisch installieren. Das kann man wie folgt machen:&lt;br /&gt;
* das Modul zunächst auf seinem Windows PC speichern&lt;br /&gt;
&lt;br /&gt;
Wie kommt das Modul nun auf den eigenen RasPi?&lt;br /&gt;
&lt;br /&gt;
Ich nutze dafür einen kleinen HTTP Server auf meinem Windows Rechner: [http://miniweb.sourceforge.net/ MiniWeb]&lt;br /&gt;
&lt;br /&gt;
Dieses Tool runterladen und irgendwohin entpacken. Zum starten habe ich eine kleine Batchdatei geschrieben:&lt;br /&gt;
&amp;lt;pre&amp;gt;D:\Software\MiniWebServer\miniweb\miniweb.exe -p 80&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die sorgt nur dafür, dass der Server auf Port 80 läuft.&lt;br /&gt;
&lt;br /&gt;
Im entpackten Verzeichnis ist ein Unterverzeichnis mit dem Namen &amp;quot;htdocs&amp;quot;. Dahin kopieren wir das soeben runtergeladene Modul aus dem Forum-Thread.&lt;br /&gt;
&lt;br /&gt;
Langsam sollte das cpan Tool auf unserer SSH Verbindung durchgelaufen sein.&lt;br /&gt;
&lt;br /&gt;
Nun wechseln wir (auf dem Linux Rechner) in das FHEM Verzeichnis (cd /opt/fhem/FHEM).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://IP-Adresse_EUres_Windows_Rechners/72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bringt die Datei in euer FHEM Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Jetzt noch die Rechte anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown fhem:dialout /opt/fhem/FHEM/72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt können wir auf die FHEM Oberfläche wechseln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;reload 72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und unser runtergeladenes Modul steht in FHEM zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
==Einrichten des Moduls==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Mi_Vacuum XiaomiDevice 192.168.222.77 55387753545937326a33396943557999&lt;br /&gt;
&lt;br /&gt;
attr Mi_Vacuum subType VacuumCleaner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und schon (=etwa nach 10 Sekunden) sollte euer Roboter in FHEM mit ganz vielen Readings auftauchen.&lt;br /&gt;
&lt;br /&gt;
==Anwendung: Sprachsteuerung mit Alexa (einfach, ein und aus)==&lt;br /&gt;
Wie bindet man das jetzt schnell in Alexa ein?&lt;br /&gt;
&lt;br /&gt;
Wir legen uns in FHEM einen Dummy an. Dieser wird ein Switch (on off). Dazu noch ein DOIF oder ein notify, welches diesen Switch überwacht. Je nach Status des Dummys schalten wir den Roboter.&lt;br /&gt;
&lt;br /&gt;
Ein List meines Dummys:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Internals: &lt;br /&gt;
   CFGFN &lt;br /&gt;
   NAME       Mi_Vacuum_Staubsauger &lt;br /&gt;
   NR         719473 &lt;br /&gt;
   STATE      on &lt;br /&gt;
   TYPE       dummy &lt;br /&gt;
   Readings: &lt;br /&gt;
     2017-09-18 21:10:12   state           on &lt;br /&gt;
 Attributes: &lt;br /&gt;
   alexaName  Mi_Vacuum_Staubsauger &lt;br /&gt;
   genericDeviceType switch &lt;br /&gt;
   room       alexa &lt;br /&gt;
   setList    on off &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mein DOIF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Mi_Vacuum DOIF ([Mi_Vacuum_Staubsauger:&amp;quot;on&amp;quot;]) (set Mi_Vacuum start) DOELSE (set Mi_Vacuum charge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut do always nicht vergessen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den Dummy setzen wir in den Raum, der unsere Alexa Geräte beinhaltet. Nun den Alexa FHEM Service neu starten. Anschließend sollte eine Suche nach neuen Geräten in Alexa unseren Dummy finden. Für diesen legen wir in Alexa einen neuen Raum an, z.B. Staubsauger.&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;Alexa schaltet den Staubsauger ein&amp;quot; lässt unseren Mi-Vacuum loslegen. &amp;quot;Alexa schalte den Staubsauger aus&amp;quot; schickt ihn wieder zurück zu seiner Station.&lt;br /&gt;
&lt;br /&gt;
==Zonenreinigung==&lt;br /&gt;
Um nur Teilbereiche einer Wohnung zu reinigen, ist es möglich über das Modul Zonen zu definieren. Hierzu ist es notwendig, die Koordinaten der gewünschten Zone zu ermitteln. Hierzu eignet sich die [https://xiaomi.flole.de/ FloleVac App] die entweder auf einem Android Device oder auf einem Android Emulator (z.B. [https://www.bluestacks.com/download.html BlueStacks]) verwendet werden kann. In der App kann man in der Karte eine Zone für die Reinigung markieren und durch langes Gedrückthalten des &amp;quot;Reinigen-Buttons&amp;quot; in der FloleVac App die Koordinaten dieser Zone in die Zwischenablage kopieren. &lt;br /&gt;
&lt;br /&gt;
Mit diesen Koordindaten im Format [16200,27250,31650,27650,1] kann man dann loslegen die Zonen in FHEM zu definieren:&lt;br /&gt;
&lt;br /&gt;
Entweder direkt über die Werte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set vacuum zone 16200,27250,31650,27650,1 23700,23050,25200,24200,2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder über die passenden Attribute erst ein Alias anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr vacuum zone_names home:[16200,27250,31650,27650,1],[23700,23050,25200,24200,2] livingroom:[16200,26250,23000,30150,1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Alias kann dann wie folgt genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set vacuum zone home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
* {{Link2Forum|Topic=73052|LinkText=Forums-Thread}}&lt;br /&gt;
* {{Link2Forum|Topic=76940|LinkText=Diskussionsthread}}&lt;br /&gt;
* [http://miniweb.sourceforge.net/ MiniWeb], kleiner WebServer für Windows&lt;br /&gt;
* [https://xiaomi.flole.de/ Flole], alternative App für Android, die das Token nach GoogleDrive exportiert&lt;br /&gt;
* [http://www.roboter-forum.com/forumdisplay.php?130-Xiaomi Roboter-Forum] deutschsprachiges Forum, welches sich mit dem Mi Vacuum beschäftigt (auch vor dem Kauf des Roboters lohnt sich ein Besuch dort)&lt;br /&gt;
* [https://paypal.me/mm0 PayPal]-Link, um Markus M. Dankeschön zu sagen&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=27537</id>
		<title>Mi vacuum</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Mi_vacuum&amp;diff=27537"/>
		<updated>2018-07-28T12:28:52Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Link zum Token-Auslesen bei iOS Endgeräten hinzugefügt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
=Mi Vacuum=&lt;br /&gt;
Wie der preiswerte Staubsaugerroboter auch auf FHEM hört...&lt;br /&gt;
&lt;br /&gt;
==Für wen ist die Anleitung gedacht?==&lt;br /&gt;
Ich gehe davon aus, dass ihr ein funktionierendes FHEM auf einem Linux Rechner (Debian) betreibt.&lt;br /&gt;
&lt;br /&gt;
Weiterhin denke ich, dass euer Hauptarbeitsrechner unter Windows läuft.&lt;br /&gt;
&lt;br /&gt;
Als Smartphone OS Android (wer Apple hat, kann gerne die Token-Auslese-Geschichte hier beschreiben).&lt;br /&gt;
&lt;br /&gt;
Um das Teil auch von Alexa aus ein und aus zu schalten, sollte auch die Installation von Alexa in FHEM fertig sein.&lt;br /&gt;
&lt;br /&gt;
==Die Einrichtung des Moduls==&lt;br /&gt;
Das ist insofern spannend, als das Modul nicht offiziell in FHEM eingecheckt ist. Man muss also das Modul runterladen, auf den FHEM Rechner bringen etc...&lt;br /&gt;
&lt;br /&gt;
===Vorarbeiten (Linux)===&lt;br /&gt;
Zunächst fangen wir mal auf unserem FHEM Rechner an. Mit Putty verbinden wir uns per SSH mit dem FHEM Computer.&lt;br /&gt;
&lt;br /&gt;
Folgende Befehle können benötigt werden (Debian):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libdigest-md5-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-cbc-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Rijndael_PP&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt-get install libcrypt-ecb-perl&amp;lt;/code&amp;gt; (nur nötig, wenn ihr einen verschlüsselten Token mit 96 Zeichen habt)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo cpan Crypt::Cipher::AES&amp;lt;/code&amp;gt; (nur nötig, wenn Crypt::Rijndael_PP aus irgendwelchen Gründen nicht funktioniert)&lt;br /&gt;
Wenn bei dem ein oder anderen Modul die Meldung kommt, dass es schon installiert ist, einfach mit dem nächsten Befehl weiter machen. Das CPAN Teil würde ich am Schluss machen, das braucht ziemlich lang zum installieren.&lt;br /&gt;
&lt;br /&gt;
===Vorarbeiten am Smartphone (Token)===&lt;br /&gt;
Das Problem ist folgendes:&lt;br /&gt;
&lt;br /&gt;
Wenn der Roboter mit dem WLAN verbunden wird, generiert er einen Token. Das ist ein Schlüssel, ohne den er sich nicht steuern lässt. Damit FHEM drauf zugreifen kann, benötigt man diesen Token.&lt;br /&gt;
&lt;br /&gt;
Mit den neueren Versionen der MiHome App klappt das Auslesen der Tokens leider nicht mehr.&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei Android Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Ich gehe davon aus, dass der Staubsauger mit der original MiHome App eingebunden ist und funktioniert. (Ich habe bei der Einrichtung des Servers =&amp;gt; &amp;quot;other&amp;quot; gewählt. Offenbar wollen neuere Staubsauger sich mit &amp;quot;China Mainland&amp;quot; nicht mehr verbinden. Tut hier an dieser Stelle zwar nichts zur Sache, aber vielleicht hilft es dem ein oder anderen. Wenn man die Region gewechselt hat, muss man auch den Staubsauger neu einbinden)&lt;br /&gt;
&lt;br /&gt;
* MiHome löschen&lt;br /&gt;
* alte MiHome suchen (APKMirror z.B., Version 5.0.19 hat bei mir funktioniert, unsichere Quellen müssen erlaubt sein)&lt;br /&gt;
* runtergeladene MiHome App öffnen und anmelden (sollte ganz normal den Sauger finden)&lt;br /&gt;
* USB-Debugging am Handy einschalten (Entwickleroptionen...)&lt;br /&gt;
* Handy mit USB Kabel und PC verbinden&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] 1.6 runterladen und öffnen&lt;br /&gt;
* [https://github.com/ultrara1n/MiToolkit/releases MiToolkit] erzeugt nun am Handy ein Backup&lt;br /&gt;
* anschließend zeigt es den Token direkt am PC an&lt;br /&gt;
&lt;br /&gt;
====Auslesen bei iOS Endgeräten====&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen des Tokens mit iOS Endgeräten kann die Anleitung unter folgendem Link befolgt werden: [https://forum.smartapfel.de/forum/thread/370-xiaomi-token-auslesen/]&lt;br /&gt;
&lt;br /&gt;
===Installation des inoffiziellen Moduls===&lt;br /&gt;
Der folgende Teil ist für völlige Noobs. Wenn ihr einen eleganteren Weg kennt, her damit.&lt;br /&gt;
&lt;br /&gt;
Zunächst bitte das Modul aus dem Forum herunterladen.&lt;br /&gt;
[https://forum.fhem.de/index.php/topic,73052.0.htmlm Hier] befindet sich der Thread. Markus M. hat sich die Mühe gemacht, ein Modul zu schreiben. Solange es nicht offiziell eingecheckt ist, muss man es händisch installieren. Das kann man wie folgt machen:&lt;br /&gt;
* das Modul zunächst auf seinem Windows PC speichern&lt;br /&gt;
&lt;br /&gt;
Wie kommt das Modul nun auf den eigenen RasPi?&lt;br /&gt;
&lt;br /&gt;
Ich nutze dafür einen kleinen HTTP Server auf meinem Windows Rechner: [http://miniweb.sourceforge.net/ MiniWeb]&lt;br /&gt;
&lt;br /&gt;
Dieses Tool runterladen und irgendwohin entpacken. Zum starten habe ich eine kleine Batchdatei geschrieben:&lt;br /&gt;
&amp;lt;pre&amp;gt;D:\Software\MiniWebServer\miniweb\miniweb.exe -p 80&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die sorgt nur dafür, dass der Server auf Port 80 läuft.&lt;br /&gt;
&lt;br /&gt;
Im entpackten Verzeichnis ist ein Unterverzeichnis mit dem Namen &amp;quot;htdocs&amp;quot;. Dahin kopieren wir das soeben runtergeladene Modul aus dem Forum-Thread.&lt;br /&gt;
&lt;br /&gt;
Langsam sollte das cpan Tool auf unserer SSH Verbindung durchgelaufen sein.&lt;br /&gt;
&lt;br /&gt;
Nun wechseln wir (auf dem Linux Rechner) in das FHEM Verzeichnis (cd /opt/fhem/FHEM).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://IP-Adresse_EUres_Windows_Rechners/72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bringt die Datei in euer FHEM Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Jetzt noch die Rechte anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo chown fhem:dialout /opt/fhem/FHEM/72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jetzt können wir auf die FHEM Oberfläche wechseln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;reload 72_XiaomiDevice.pm&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und unser runtergeladenes Modul steht in FHEM zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
==Einrichten des Moduls==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Mi_Vacuum XiaomiDevice 192.168.222.77 55387753545937326a33396943557999&lt;br /&gt;
&lt;br /&gt;
attr Mi_Vacuum subType VacuumCleaner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und schon (=etwa nach 10 Sekunden) sollte euer Roboter in FHEM mit ganz vielen Readings auftauchen.&lt;br /&gt;
&lt;br /&gt;
==Anwendung: Sprachsteuerung mit Alexa (einfach, ein und aus)==&lt;br /&gt;
Wie bindet man das jetzt schnell in Alexa ein?&lt;br /&gt;
&lt;br /&gt;
Wir legen uns in FHEM einen Dummy an. Dieser wird ein Switch (on off). Dazu noch ein DOIF oder ein notify, welches diesen Switch überwacht. Je nach Status des Dummys schalten wir den Roboter.&lt;br /&gt;
&lt;br /&gt;
Ein List meines Dummys:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Internals: &lt;br /&gt;
   CFGFN &lt;br /&gt;
   NAME       Mi_Vacuum_Staubsauger &lt;br /&gt;
   NR         719473 &lt;br /&gt;
   STATE      on &lt;br /&gt;
   TYPE       dummy &lt;br /&gt;
   Readings: &lt;br /&gt;
     2017-09-18 21:10:12   state           on &lt;br /&gt;
 Attributes: &lt;br /&gt;
   alexaName  Mi_Vacuum_Staubsauger &lt;br /&gt;
   genericDeviceType switch &lt;br /&gt;
   room       alexa &lt;br /&gt;
   setList    on off &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mein DOIF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Mi_Vacuum DOIF ([Mi_Vacuum_Staubsauger:&amp;quot;on&amp;quot;]) (set Mi_Vacuum start) DOELSE (set Mi_Vacuum charge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut do always nicht vergessen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den Dummy setzen wir in den Raum, der unsere Alexa Geräte beinhaltet. Nun den Alexa FHEM Service neu starten. Anschließend sollte eine Suche nach neuen Geräten in Alexa unseren Dummy finden. Für diesen legen wir in Alexa einen neuen Raum an, z.B. Staubsauger.&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;Alexa schaltet den Staubsauger ein&amp;quot; lässt unseren Mi-Vacuum loslegen. &amp;quot;Alexa schalte den Staubsauger aus&amp;quot; schickt ihn wieder zurück zu seiner Station.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
* {{Link2Forum|Topic=73052|LinkText=Forums-Thread}}&lt;br /&gt;
* {{Link2Forum|Topic=76940|LinkText=Diskussionsthread}}&lt;br /&gt;
* [http://miniweb.sourceforge.net/ MiniWeb], kleiner WebServer für Windows&lt;br /&gt;
* [https://xiaomi.flole.de/ Flole], alternative App für Android, die das Token nach GoogleDrive exportiert&lt;br /&gt;
* [http://www.roboter-forum.com/forumdisplay.php?130-Xiaomi Roboter-Forum] deutschsprachiges Forum, welches sich mit dem Mi Vacuum beschäftigt (auch vor dem Kauf des Roboters lohnt sich ein Besuch dort)&lt;br /&gt;
* [https://paypal.me/mm0 PayPal]-Link, um Markus M. Dankeschön zu sagen&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HMCCU&amp;diff=27524</id>
		<title>HMCCU</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HMCCU&amp;diff=27524"/>
		<updated>2018-07-24T10:08:18Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Dativ ist dem Genitiv sein Tod&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung Homematic CCU2 an FHEM&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=HMCCU&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=88_HMCCU.pm &lt;br /&gt;
|ModOwner=zap ([https://forum.fhem.de/index.php?action=profile;u=10980 Forum] / [[Benutzer Diskussion:Zap|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
===Übersicht===&lt;br /&gt;
Das Modul HMCCU ermöglicht zusammen mit den beiden Client Modulen → [[HMCCUDEV]] und HMCCUCHN eine Integration der Homematic CCU2 Zentrale sowie der dort angelernten Geräte in FHEM. Im Einzelnen werden folgende Funktionen unterstützt:&lt;br /&gt;
&lt;br /&gt;
* Unterstützung der Protokolle BidCos, Wired und [[HomeMatic IP|HM-IP]]&lt;br /&gt;
* Unterstützung von CCU2 Gerätegruppen bzw. virtuellen Geräten (Heizung, Rauchmelder)&lt;br /&gt;
* Automatische Aktualisierung von Gerätezuständen in FHEM per RPC-Server&lt;br /&gt;
* Automatische Konvertierung und Skalierung von Werten beim Lesen und Schreiben&lt;br /&gt;
* Lesen und Schreiben von CCU2 Systemvariablen&lt;br /&gt;
* Ausführen von CCU2 Programmen&lt;br /&gt;
* Ausführen von Homematic Scripts auf der CCU2&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Module haben folgende Aufgaben:&lt;br /&gt;
&lt;br /&gt;
* HMCCU: Kommunikation zwischen FHEM und CCU2 (I/O Device)&lt;br /&gt;
* HMCCURPC: Alternativer auf Threads basierender RPC-Server&lt;br /&gt;
* HMCCUDEV: Definition von FHEM Devices für Homematic Geräte&lt;br /&gt;
* HMCCUCHN: Definition von FHEM Devices für einzelne Kanäle von Homematic Geräten&lt;br /&gt;
* HMCCUConf: Templates mit Default Attributen für bestimmte Homematic Gerätetypen&lt;br /&gt;
&lt;br /&gt;
===Geräte, Kanäle und Datenpunkte===&lt;br /&gt;
Geräte in der HomeMatic CCU bestehen aus einem oder mehreren Kanälen. Ein Kanal wiederum hat einen oder mehrere Datenpunkte. Über diese Datenpunkte kann ein Gerät gesteuert oder Statusinformationen ausgelesen werden. Sofern ein Datenpunkt lesbar ist, kann er als Reading in einem HMCCUCHN oder HMCCUDEV Device dargestellt werden. Ausgehend von dieser Abbildung in der CCU kann man nun entscheiden, ob man ein CCU Gerät mit HMCCUCHN oder HMCCUDEV definiert.&lt;br /&gt;
&lt;br /&gt;
Wenn alle benötigten Datenpunkte eines Gerätes über einen Kanal angesprochen werden können, sollte HMCCUCHN verwendet werden. Mit HMCCUDEV werden alle Kanäle eines Gerätes eingebunden. Außerdem unterstützt HMCCUDEV Rauchmeldergruppen sowie virtuelle Geräte wie z.B. Heizungsgruppen.&lt;br /&gt;
&lt;br /&gt;
Ein Sonderfall ist der Statuskanal 0, der von allen HomeMatic Geräten bereitgestellt wird. Dieser Kanal ist inklusive seiner Datenpunkte sowohl in HMCCUCHN als auch in HMCCUDEV Devices verfügbar.&lt;br /&gt;
{{Hinweis|Im Artikel → [[HMCCU Best Practice]] gibt es einige Tipps für den Einstieg inklusive Schritt-für-Schritt Anleitungen.}}&lt;br /&gt;
&lt;br /&gt;
==Inbetriebnahme==&lt;br /&gt;
===Zu beachten===&lt;br /&gt;
&lt;br /&gt;
* In den CCU2 Gerätenamen dürfen keine Umlaute verwendet werden. Leerzeichen sind zulässig, können aber u.U. bei einigen Funktionen zu Problemen führen.&lt;br /&gt;
* Namen in der CCU2 müssen über alle Objekttypen hinweg eindeutig sein. Beispiel: Ein Gerät und ein Raum dürfen nicht den gleichen Namen haben.&lt;br /&gt;
* Nach dem Neustart der CCU2 muss auch der RPC-Server neu gestartet werden, da die CCU2 bei einem Neustart die registrierten RPC-Server &amp;quot;vergisst&amp;quot;.&lt;br /&gt;
* Vor der Ausführung eines FHEM Updates oder vor der Installation eines CCU2 Firmware Updates muss der RPC-Server gestoppt werden.&lt;br /&gt;
* Seit der CCU2 Firmware 2.27.7 sind die Zugriffsmöglichkeiten auf die CCU durch eine Firewall abgesichert. Der Zugriff durch FHEM muss explizit freigeschaltet werden, da HMCCU sonst nicht korrekt funktioniert (s. nächster Abschnitt).&lt;br /&gt;
&lt;br /&gt;
===CCU Firewall Einstellungen===&lt;br /&gt;
Ab CCU2 Firmware 2.27.7 sind auf der CCU über das WebGUI folgende Einstellungen vorzunehmen:&lt;br /&gt;
* Menü &amp;quot;Einstellungen &amp;gt; Systemsteuerung&amp;quot; aufrufen&lt;br /&gt;
* Button &amp;quot;Firewall konfigurieren&amp;quot; anklicken&lt;br /&gt;
* Die Rechte für &amp;quot;HomeMatic XML-RPC API&amp;quot; und &amp;quot;Remote HomeMatic-Script API&amp;quot; auf &amp;quot;Vollzugriff&amp;quot; setzen.&lt;br /&gt;
* Man kann die Rechte auf &amp;quot;Eingeschränkter Zugriff&amp;quot; belassen, muss dann aber im Feld &amp;quot;IP-Adressen für eingeschränkten Zugriff&amp;quot; die IP des FHEM-Servers oder das komplette Subnetz in Subnet-Notation angeben.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
Alle HMCCU Module sind Teil von FHEM. HMCCU benötigt die Perl Module RPC::XML::Server und RPC::XML::Client. Unter debian/raspian kann das Paket librpc-xml-perl installiert werden&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y librpc-xml-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das RPC-Server Modul HMCCURPC benötigt zusätzlich die Module threads, Thread::Queue sowie Time::HiRes.&lt;br /&gt;
&lt;br /&gt;
Der interne RPC-Server legt für den Datenaustausch zwischen CCU2 und FHEM Dateien im Verzeichnis /tmp an. Der fhem Prozess benötigt daher Schreibrechte für dieses Verzeichnis. Das Verzeichnis kann mit dem Attribut &#039;&#039;rpcqueue&#039;&#039; geändert werden. Der mit dem Modul HMCCURPC bereitgestellte externe RPC-Server verwendet keine temporären Dateien.&lt;br /&gt;
&lt;br /&gt;
===Definition I/O Device===&lt;br /&gt;
Im ersten Schritt wird ein I/O Device angelegt, das für die Kommunikation zwischen FHEM und der CCU2 verantwortlich ist. Im folgenden Beispiel wird davon ausgegangen, dass die CCU2 unter der IP-Adresse 192.168.1.10 erreichbar ist. Das FHEM Device bekommt den Namen „d_ccu“.&lt;br /&gt;
&amp;lt;pre&amp;gt;define d_ccu HMCCU 192.168.1.10&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls die CCU als Software Service auf dem gleichen Rechner läuft wie FHEM, sollte bei der Definition der Paramter waitforccu angegeben werden. Die CCU Services brauchen beim Starten länger als FHEM. Durch waitfoccu wird der Start von FHEM für die angegebene Anzahl Sekunden verzögert. Die 180 Sekunden sind nur ein Beispiel. Je nach Installation kann auch ein höherer Wert notwendig sein:&lt;br /&gt;
&amp;lt;pre&amp;gt;define d_ccu HMCCU 192.168.1.10 waitforccu=180&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RPC Server konfigurieren===&lt;br /&gt;
Im nächsten Schritt wird der RPC-Server konfiguriert und gestartet. Zunächst werden mit dem Attribut &#039;&#039;rpcinterfaces&#039;&#039; die Schnittstellen bzw. Ports festgelegt, für die sich der RPC-Server bei der CCU2 registrieren soll. Folgende Angaben sind möglich:&lt;br /&gt;
* BidCos-RF&lt;br /&gt;
* BidCos-Wired&lt;br /&gt;
* HmIP-RF&lt;br /&gt;
* CUxD&lt;br /&gt;
* Homegear&lt;br /&gt;
* VirtualDevices&lt;br /&gt;
&#039;&#039;&#039;Wichtig&#039;&#039;&#039;! Die CCU2 stellt außer BidCos-RF nur die Schnittstellen bereit, für die auch Geräte vorhanden sind. Nicht verwendete Schnittstellen dürfen bei &#039;&#039;rpcinterfaces&#039;&#039; nicht angegeben werden, da sonst der RPC-Server nicht startet.&lt;br /&gt;
&lt;br /&gt;
Mit Version 4.2 stehen drei verschiedene RPC Server zur Verfügung. Der verwendete RPC Server wird im I/O Device mit dem Attribut ccuflags festgelegt:&lt;br /&gt;
* intrpc = Interner RPC Server des Moduls HMCCU. Verwendet Filequeues für die Eventverarbeitung. Relativ langsame Reaktionszeit&lt;br /&gt;
* extrpc = Externer RPC Server (Modul HMCCURPC). Verwendet Threads und ist teilweise inkompatibel mit Modulen, die JSON verwenden (s.u.)&lt;br /&gt;
* procrpc = Externer RPC Server (Modul HMCCURPCPROC). Verwendet Subprozesse, hat eine sehr kurze Reaktionszeit und keine Probleme mit JSON.&lt;br /&gt;
&lt;br /&gt;
Ab Version 4.2 ist ccuflags=procrpc zu bevorzugen. Ab Version 4.3 werden die anderen beiden Varianten eingestellt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interner RPC-Server&#039;&#039;&#039;&lt;br /&gt;
Bei Verwendung des internen RPC-Servers kann mit dem Attribut &#039;&#039;rpcqueue&#039;&#039; das Verzeichnis und das Dateipräfix für die Filequeues des RPC-Servers festgelegt werden. Das Attribut &#039;&#039;rpcinterval&#039;&#039; legt fest, wie häufig HMCCU die Filequeues auswertet, d.h. wie schnell Änderungen in der CCU2 in FHEM synchronisiert werden. Im folgenden Beispiel werden vom RPC-Server BidCos-RF, HMIP-RF und CCU Device Groups behandelt. Die Filequeues werden in /tmp mit dem Präfix &amp;quot;ccuqueue&amp;quot; abgelegt und im Abstand von 5 Sekunden abgefragt. Der Wert für &#039;&#039;rpcinterval&#039;&#039; legt die maximale Reaktionszeit auf Änderungen in der CCU bzw. dort angelernter Geräte fest:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr d_ccu ccuflags intrpc&lt;br /&gt;
attr d_ccu rpcinterfaces BidCos-Wired,BidCos-RF,VirtualDevices&lt;br /&gt;
attr d_ccu rpcqueue /tmp/ccuqueue&lt;br /&gt;
attr d_ccu rpcinterval 5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Externer RPC-Server (HMCCURPC)&#039;&#039;&#039;&lt;br /&gt;
Für den externen RPC-Server müssen lediglich die zu verwendenden Schnittstellen festgelegt werden. Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr d_ccu ccuflags extrpc&lt;br /&gt;
attr d_ccu rpcinterfaces BidCos-Wired,BidCos-RF,CUxD,VirtualDevices&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Hinweis|Beim externen RPC-Server kann es zu Inkompatibilitäten mit Modulen kommen, die JSON verwenden (z.B. HUEBridge). Falls im Log von FHEM JSON Fehlermeldungen auftauchen, muss entweder der interne RPC-Server verwendet oder das Perl Modul JSON::XS deinstalliert werden. Für die Nutzung von JSON ist es nicht zwingend erforderlich. Unter Raspbian kann das Modul mit folgendem Befehl entfernt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo dpkg --purge libjson-xs-perl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Für CPAN lautet der Befehl:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo cpan --uninstall JSON::XS&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Externer RPC-Server (HMCCURPCPROC)&#039;&#039;&#039;&lt;br /&gt;
Beim ersten Start dieses RPC-Servers über das I/O Device wird automatisch je Schnittstelle ein Device vom Typ HMCCURPCPROC angelegt. Die Attribute room und group werden vom I/O Device übernommen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RPC-Server starten&#039;&#039;&#039;&lt;br /&gt;
Nun kann der RPC-Server gestartet werden. Dabei wird je RPC-Schnittstelle ein separater fhem.pl Prozess oder Thread mit eigenem Listening-Port gestartet. Beim externen RPC-Server legt HMCCU beim ersten Start ein Device vom Typ HMCCURPC an. Bei aktivierter Firewall müssen die Ports (s. Attribut &#039;&#039;rpcserverport&#039;&#039;) geöffnet werden. Beim internen RPC-Server empfangen diese Prozesse Informationen von der CCU2 und schreiben sie in File-Queues im Verzeichnis /tmp. Dort werden sie vom I/O Device abgeholt und an die Client-Devices (HMCCUCHN, HMCCUDEV) verteilt. Beim externen RPC-Server läuft die Kommunikation über Threads und Shared Memory Queues.&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Startbefehl sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;set d_ccu rpcserver on&amp;lt;/pre&amp;gt;&lt;br /&gt;
Während des Starts des RPC-Servers und der Registrierung bei der CCU2 kann das I/O Device nur eingeschränkt verwendet werden. Dies wird durch den Status „starting/busy“ angezeigt. Nachdem der RPC-Server gestartet wurde, wechselt der Status zu „running/OK“. Zusätzlich werden im Internal RPCPID die Prozess-IDs der RPC-Server Prozesse gespeichert.&lt;br /&gt;
Anschließend sollte man noch das Attribut &#039;&#039;rpcserver&#039;&#039; auf „on“ setzen, damit der RPC-Server beim Start von FHEM automatisch gestartet wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;attr d_ccu rpcserver on&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Vorgaben für Client Devices===&lt;br /&gt;
Im I/O Device stehen einige Attribute zur Verfügung, über die Vorgaben für Attribute in Client-Devices eingestellt werden können:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Attribut in HMCCU !! Vorgabe für Attribut in&amp;lt;br/&amp;gt;HMCCUDEV/HMCCUCHN !! Default !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| ccudef-hmstatevals || hmstatevals || &#039;^UNREACH!(1|true):unreachable;^LOW_?BAT!(1|true):warn_battery&#039; || Legt fest, wie der HomeMatic Status eines Client-Device ermittelt wird.&lt;br /&gt;
|-&lt;br /&gt;
| ccudef-readingfilter || ccureadingfilter || .* || Legt fest, welche Datenpunkte eines CCU Gerätes als Readings gespeichert werden&lt;br /&gt;
|-&lt;br /&gt;
| ccudef-readingname || ccureadingname || Kein Default || Ändert den Namen von Readings und/oder ergänzt neue Readings&lt;br /&gt;
|-&lt;br /&gt;
| ccudef-substitute || substitute || Kein Default || Ersetzt Datenpunktwerte vor der Speicherung in Readings.&lt;br /&gt;
|}&lt;br /&gt;
Der Inhalt der HMCCU Attribute wird an die Attribute im Client-Device angehängt. In der Datei HMCCUConf.pm ist ein Default-Template für ein HMCCU Device definiert, das über den Befehl &#039;&#039;&#039;set defaults&#039;&#039;&#039; für das I/O Device angewendet werden kann. Dabei werden die Attribute &#039;&#039;ccudef-*&#039;&#039; auf Werte gesetzt, die Readings und Werte analog zu CUL_HM erzeugen.&lt;br /&gt;
&lt;br /&gt;
Wichtig! Bei der Ausführung von &#039;&#039;&#039;set defaults&#039;&#039;&#039; für das I/O Device wird der Reading-Filter auf den Wert &amp;quot;^(LOW_?BAT|UNREACH)$&amp;quot; gesetzt. Dies hat zur Folge, dass in den Client-Devices nur diese beiden Datenpunkte als Readings gespeichert werden. Daher muss für jedes Client-Device über das lokale Attribut &#039;&#039;ccureadingfilter&#039;&#039; eine Liste der zusätzlich benötigten Datenpunkte definiert werden.&lt;br /&gt;
&lt;br /&gt;
==Synchronisation mit der CCU==&lt;br /&gt;
Das Modul HMCCU bietet Befehle an, um Daten zwischen der CCU und FHEM zu synchronisieren. Der Befehl &#039;&#039;&#039;get devicelist&#039;&#039;&#039; liest alle Geräte aus der CCU. Er sollte immer ausgeführt werden, wenn sich an einer Gerätedefinition in der CCU etwas geändert hat, z.B. Gerät oder Kanal wurde umbenannt, neues Gerät wurde angelernt, Gerät wurde gelöscht. Bei der Definition des I/O Device wird der Befehl automatisch ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &#039;&#039;&#039;get update&#039;&#039;&#039; liest die Datenpunkte aller in FHEM definierten HMCCUDEV und HMCCUCHN Devices aus der CCU und aktualisiert alle Readings aller Client Devices.&lt;br /&gt;
&lt;br /&gt;
==Autocreate von Client Devices==&lt;br /&gt;
HMCCU bietet eine Möglichkeit, um automatisch Client Devices in FHEM für Geräte oder Kanäle in der CCU anzulegen. Dazu wird der Befehl &#039;&#039;&#039;get devicelist&#039;&#039;&#039; mit folgender Syntax aufgerufen:&lt;br /&gt;
&amp;lt;pre&amp;gt;get &amp;lt;io-dev&amp;gt; devicelist create &amp;lt;dev-expr&amp;gt; [Options ...] [&amp;lt;attr&amp;gt;=&amp;lt;value [...]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der Parameter &#039;&#039;dev-expr&#039;&#039; spezifiziert per regulärem Ausdruck, für welche CCU Geräte oder Kanäle ein Device in FHEM angelegt werden soll. Es ist davon abzuraten, an dieser Stelle &amp;quot;.*&amp;quot; zu verwenden, da so sehr viele (meist unnütze) FHEM Devices angelegt werden.&lt;br /&gt;
Folgende &#039;&#039;Options&#039;&#039; sind möglich:&lt;br /&gt;
*t={chn|dev|all} - Es werden nur Kanäle (chn) oder Geräte (dev) berücksichtigt (ab 3.6).&lt;br /&gt;
*p=&amp;lt;prefix&amp;gt; - Der Text &#039;&#039;prefix&#039;&#039; wird den Namen der neuen FHEM Devices vorangestellt.&lt;br /&gt;
*s=&amp;lt;suffix&amp;gt; - Der Text &#039;&#039;suffix&#039;&#039; wird an die Namen der neuen FHEM Devices angehängt.&lt;br /&gt;
*f=&amp;lt;format&amp;gt; - Mit &#039;&#039;format&#039;&#039; kann ein Template für die FHEM Devicenamen festgelegt werden. In einem Template können folgende Platzhalter verwendet werden: %n = CCU Geräte- oder Kanalname, %d = CCU Gerätename, %a = CCU Geräte- oder Kanaladresse.&lt;br /&gt;
*defattr - Sorgt dafür, dass für die neu definierten FHEM Devices einige Defaultattribute gesetzt werden, sofern für den jeweiligen Gerätetyp vorhanden.&lt;br /&gt;
*duplicates - Erlaubt das Anlegen von doppelten Devices. Wenn diese Option fehlt, werden in FHEM vorhandene Geräte nicht neu angelegt.&lt;br /&gt;
*save - Nach dem Anlegen der Geräte wird die neue FHEM Konfiguration gespeichert.&lt;br /&gt;
An den Befehl kann eine Liste von Atributen angehängt werden, die den neuen FHEM-Devices zugewiesen werden sollen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: In FHEM Devices für alle CCU Geräte anlegen, deren Namen mit &amp;quot;HM-KL&amp;quot; beginnt. Alle neuen FHEM Devices beginnen mit &amp;quot;HM_&amp;quot;. Sofern vorhanden werden Default Attribute gesetzt. Die Konfiguration wird gespeichert.&lt;br /&gt;
&amp;lt;pre&amp;gt;get d_ccu devicelist create ^HM-KL.* t=dev f=HM_%n defattr save room=Homematic&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verwaltung von Default Attributen==&lt;br /&gt;
HMCCU bietet für FHEM Devices vom Typ HMCCUCHN und HMCCUDEV bei bestimmten Homamtic Gerätetypen Default Attribute an. Diese können in den Client Devices mit dem Befehl &#039;&#039;&#039;set defaults&#039;&#039;&#039; definiert werden. Der Befehl &#039;&#039;&#039;get defaults&#039;&#039;&#039; zeigt die für einen Gerätetyp vorhandenen Attribute an. HMCCU bietet jedem Benutzer die Möglichkeit, zusätzlich zu den in der Datei HMCCUConf.pm mitgelieferten Attribute eigene Vorlagendateien mit Default Attributen zu definieren.&lt;br /&gt;
&lt;br /&gt;
===Anzeigen der Gerätetypen mit Default Attributen===&lt;br /&gt;
Mit dem Befehl &#039;&#039;&#039;get defaults&#039;&#039;&#039; im I/O Device werden alle Homematic Gerätetypen angezeigt, für die Default Attribute vorhanden sind. Dabei werden auch benutzerdefinierte Attribute berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
===Default Attribute exportieren und importieren===&lt;br /&gt;
Der Befehl &#039;&#039;&#039;get exportdefaults&#039;&#039;&#039; schreibt die mitgelieferten Default Attribute aus HMCCUConf.pm in eine Vorlagendatei. Diese Datei kann der Benutzer nach seinen Bedürfnissen anpassen und anschließend mit dem Befehl &#039;&#039;&#039;set importdefaults&#039;&#039;&#039; in FHEM importieren. Das Anlegen von eigenen Default Attributen könnte so aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
get d_ccu exportdefaults /opt/fhem/hmccu_defattr.txt&lt;br /&gt;
&lt;br /&gt;
... Datei /opt/fhem/hmccu_defattr.txt editieren ...&lt;br /&gt;
&lt;br /&gt;
set d_ccu importdefaults /opt/fhem/hmccu_defattr.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beim Ausführen des Befehls &#039;&#039;&#039;set defaults&#039;&#039;&#039; in einem Client Device haben die benutzerdefinierten Attribute Priorität.&lt;br /&gt;
&lt;br /&gt;
===Benutzerdefinierte Attribute löschen===&lt;br /&gt;
Mit dem Befehl &#039;&#039;&#039;set cleardefaults&#039;&#039;&#039; werden alle mit &#039;&#039;&#039;set importdefaults&#039;&#039;&#039; importierten Default Attribute gelöscht. Danach sind wieder nur die in HMCCUConf.pm enthaltenen Default Attribute verfügbar.&lt;br /&gt;
&lt;br /&gt;
==Weitere Funktionen des Moduls HMCCU==&lt;br /&gt;
===Lesen und Ändern von CCU2 Systemvariablen===&lt;br /&gt;
Systemvariablen in der CCU2 können mit den Befehlen &#039;&#039;&#039;get vars&#039;&#039;&#039; und &#039;&#039;&#039;set var&#039;&#039;&#039; gelesen und geändert werden. Voraussetzung ist, dass die Variable in der CCU2 vorhanden ist, d.h. es ist nicht möglich, mit dem Befehl &#039;&#039;&#039;set var&#039;&#039;&#039; eine neue Variable in der CCU2 anzulegen.&lt;br /&gt;
Nach dem Auslesen einer Systemvariable wird der Wert in einem Reading im I/O Device gespeichert. Der Befehl &#039;&#039;&#039;get vars&#039;&#039;&#039; akzeptiert als Parameter einen regulären Ausdruck. Dadurch können mehrere Systemvariablen auf einmal gelesen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Lesen aller Systemvariablen, die mit A beginnen:&lt;br /&gt;
&amp;lt;pre&amp;gt;get d_ccu vars A.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beispiel: Setzen der Systemvariablen „Temperatur“ auf den Wert 20.5:&lt;br /&gt;
&amp;lt;pre&amp;gt;set d_ccu var Temperatur 20.5&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ausführen von CCU2 Programmen===&lt;br /&gt;
Ein in der CCU2 hinterlegtes Programm kann mit dem Befehl &#039;&#039;&#039;set execute&#039;&#039;&#039; ausgeführt werden. Einziger Parameter des Befehls ist der Name des Programms. Es spielt keine Rolle, ob das Programm in der CCU2 aktiv oder inaktiv ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Programm mit dem Namen &amp;quot;Schalter_Ein&amp;quot; ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;set d_ccu execute Schalter_Ein&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Aggregation von Gerätezuständen (ab 3.6)===&lt;br /&gt;
Hinter diesem etwas kryptischen Begriff verbirgt sich die Zusammenfassung von Zuständen von Client-Devices. Anwendungsbeispiele sind:&lt;br /&gt;
* Wieviele und welche Geräte haben einen niedrigen Batteriestand?&lt;br /&gt;
* Wieviele und welche Fenster sind geöffnet?&lt;br /&gt;
Für die Beantwortung dieser Fragen stellt HMCCU einige Befehle und Attribute bereit. Die Ergebnisse werden in Form von Readings im I/O Device bereitgestellt:&lt;br /&gt;
*&#039;&#039;Präfix&#039;&#039;_count = Anzahl der FHEM Devices, die für die Aggregation ausgewertet wurden.&lt;br /&gt;
*&#039;&#039;Präfix&#039;&#039;_list = Liste der FHEM Devices, die der if Bedingung Aggregtaionsregel entsprechen.&lt;br /&gt;
*&#039;&#039;Präfix&#039;&#039;_match - Anzahl der FHEM Devices, die der if Bedingung der Aggregationsregel entsprechen.&lt;br /&gt;
*&#039;&#039;Präfix&#039;&#039;_state - Ergebnis der Aggregationsregel (if oder else Wert).&lt;br /&gt;
Aggregationen werden automatisch bei Änderung von Readings neu berechnet. Alternativ kann mit dem Befehl &#039;&#039;&#039;get aggregation&#039;&#039;&#039; eine Aggregation explizit durchgeführt werden. Als Parameter wird der Name der Aggregationsregel oder &amp;quot;all&amp;quot; für alle Aggregationen übergeben:&lt;br /&gt;
&amp;lt;pre&amp;gt;get &amp;lt;io-dev&amp;gt; aggregation {all|&amp;lt;name&amp;gt;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konfiguration der Aggregationen erfolgt mit Hilfe von Regeln, die über das Attribut &#039;&#039;ccuaggregate&#039;&#039; definiert werden. Dabei werden mehrere Regeln durch ein Semikolon und optional ein Zeilenumbruch getrennt. Eine Aggregationsregel enthält mehrere, durch Komma getrennte Parameter, die das Verhalten einer Aggregation festlegen:&lt;br /&gt;
*&#039;&#039;&#039;name&#039;&#039;&#039;:&amp;lt;Name&amp;gt; - Legt den Namen einer Aggregation fest.&lt;br /&gt;
*&#039;&#039;&#039;filter&#039;&#039;&#039;:{name|alias|group|room|type}=&amp;lt;Incl-Expr&amp;gt;[!&amp;lt;Excl-Expr&amp;gt;] - Legt fest, welche Geräte in die Aggregation einbezogen werden:&lt;br /&gt;
**name: FHEM Device Name&lt;br /&gt;
**alias: FHEM Device Alias&lt;br /&gt;
**group: FHEM Device &#039;&#039;group&#039;&#039; Attribut&lt;br /&gt;
**room: FHEM Device &#039;&#039;room&#039;&#039; Attribut&lt;br /&gt;
**type: Homematic Gerätetyp&lt;br /&gt;
*&#039;&#039;&#039;read&#039;&#039;&#039;:&amp;lt;Read-Expr&amp;gt; - Legt fest, welche Readings für die Aggregation verwendet werden (z.B. state oder LOWBAT).&lt;br /&gt;
*&#039;&#039;&#039;if&#039;&#039;&#039;:{any|all}=&amp;lt;Value&amp;gt; - Legt die Bedingung fest, unter der die Aggregationsregel greift:&lt;br /&gt;
**any: Regel greift, wenn das Reading mindestens eins der über &#039;&#039;Filter&#039;&#039; selektierten FHEM Devices den Wert &#039;&#039;Value&#039;&#039; hat.&lt;br /&gt;
**all: Regel greift, wenn die Readings aller der über &#039;&#039;Filter&#039;&#039; selektierten FHEM Devices den Wert &#039;&#039;Value&#039;&#039; haben.&lt;br /&gt;
*&#039;&#039;&#039;else&#039;&#039;&#039;:&amp;lt;Value&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;prefix&#039;&#039;&#039;:{RULE|&amp;lt;Text&amp;gt;} - Legt das Präfix für die Readings fest, die das Ergebnis einer Aggregation beinhalten wobei &amp;quot;RULE&amp;quot; für den Namen der Aggregationsregel steht.&lt;br /&gt;
*&#039;&#039;&#039;coll&#039;&#039;&#039;:{NAME|&amp;lt;Attribute&amp;gt;}[!&amp;lt;Default&amp;gt;] - Legt fest, welches Attribut der FHEM Devices, die in die Aggregation einbezogen werden, in das _list Reading aufgenommen werden, sofern sie die if Bedingung erfüllen. Dabei entspricht &amp;quot;NAME&amp;quot; dem FHEM-Devicename. Der optionale Parameter Default legt den Inhalt des _list Readings fest, wenn keines der FHEM Devices die if Bedingung erfüllt. Voreingestellt ist &amp;quot;no match&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Aggregation der Batteriezustände aller Homematic Geräte in FHEM (Annahme: Alle gehören zum Raum &amp;quot;Homematic&amp;quot;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr d_ccu ccuaggregate name:battery,filter:room=Homematic,read:(LOWBAT|LOW_BAT),if:any=yes,else:no,prefix=battery_,coll:alias&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Diese Aggregationsregel könnte folgende Readings im I/O Device generieren (Annahme: Batterien von 2 Fenstersensoren leer):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
battery_count: 50&lt;br /&gt;
battery_list: Fenster Bad,Fenster Wohnzimmer&lt;br /&gt;
battery_match: 2&lt;br /&gt;
battery_state: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ausführen von Homematic Scripts===&lt;br /&gt;
Mit dem Befehl &#039;&#039;&#039;set hmscript&#039;&#039;&#039; kann ein beliebiges Homematic Script an die CCU2 zur Ausführung gesendet werden. Wenn das Script zeilenweise Daten im Format &amp;quot;Parameter=Value&amp;quot; zurück gibt, werden diese als Readings mit dem Namen &#039;&#039;Parameter&amp;quot; im I/O Device gespeichert.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das folgende Homematic Script wertet alle CCU2 Systemvariablen aus. Das Ergebnis wird als Readings gespeichert (äquivalent zu Befehl &#039;&#039;&#039;get vars&#039;&#039;&#039;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
object osysvar;&lt;br /&gt;
string ssysvarid;&lt;br /&gt;
foreach (ssysvarid, dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedIDs())&lt;br /&gt;
{&lt;br /&gt;
   osysvar = dom.GetObject(ssysvarid);&lt;br /&gt;
   WriteLine (osysvar.Name() # &amp;quot;=&amp;quot; # osysvar.Value());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Script auf dem FHEM-Server unter /opt/fhem/sysvars.scr gespeichert wird, kann es wie folgt ausgeführt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;set d_ccu hmscript /opt/fhem/sysvars.scr&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:Alexa-Fhem&amp;diff=18227</id>
		<title>Diskussion:Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:Alexa-Fhem&amp;diff=18227"/>
		<updated>2017-01-02T12:14:43Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Formatierung angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vorschlag zur Optimierung der Anleitungs-Struktur ==&lt;br /&gt;
&lt;br /&gt;
Für eine bessere Strukturierung/Nachvollziehbareit ohne zu viele Sprünge in der Anleitung, schlage ich vor die Abschnitte 2.2 bis 2.4 (Installation in FHEM) an das Ende der Anleitung zu verschieben, da dann bereits &#039;&#039;applicationId&#039;&#039; und &#039;&#039;oauthClientID&#039;&#039; bekannt sind.&lt;br /&gt;
&lt;br /&gt;
Die Struktur könnte wie folgt optimiert werden:&lt;br /&gt;
&lt;br /&gt;
# Einführung&lt;br /&gt;
## Arbeitsweise und Datenfluss&lt;br /&gt;
## Anmerkungen&lt;br /&gt;
## Abgrenzung Alexa Smart Home Skill und Alexa Custom Skill&lt;br /&gt;
# Vorbereitung&lt;br /&gt;
## Alexa Skills anlegen&lt;br /&gt;
### Smart Home Skill&lt;br /&gt;
### Custom Skill&lt;br /&gt;
## AWS Lambda Funktion anlegen&lt;br /&gt;
# Installation&lt;br /&gt;
## Alexa-FHEM installieren&lt;br /&gt;
## Alexa-Fhem aus FHEM starten&lt;br /&gt;
## Alexa Device anlegen&lt;br /&gt;
# Einrichtung&lt;br /&gt;
## Alexa Skills aktivieren&lt;br /&gt;
## Geräte suchen&lt;br /&gt;
# Nutzung&lt;br /&gt;
## Smart Home Skill&lt;br /&gt;
## Custom Skill&lt;br /&gt;
# Troubleshooting&lt;br /&gt;
## Allgemeiner Hinweis&lt;br /&gt;
## [...]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Slanesh|Slanesh]] ([[Benutzer Diskussion:Slanesh|Diskussion]]) 13:14, 2. Jan. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:Alexa-Fhem&amp;diff=18226</id>
		<title>Diskussion:Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:Alexa-Fhem&amp;diff=18226"/>
		<updated>2017-01-02T12:05:42Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Vorschlag zur Optimierung der Seiten-Struktur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für eine bessere Strukturierung/Nachvollziehbareit ohne zu viele Sprünge in der Anleitung, schlage ich vor die Abschnitte 2.2 bis 2.4 (Installation in FHEM) an das Ende der Anleitung zu verschieben, da dann bereits &#039;&#039;applicationId&#039;&#039; und &#039;&#039;oauthClientID&#039;&#039; bekannt sind.&lt;br /&gt;
&lt;br /&gt;
Die Struktur könnte wie folgt optimiert werden:&lt;br /&gt;
&lt;br /&gt;
 1. Einführung&lt;br /&gt;
 1.1 Arbeitsweise und Datenfluss&lt;br /&gt;
 1.2 Anmerkungen&lt;br /&gt;
 1.3 Abgrenzung Alexa Smart Home Skill und Alexa Custom Skill&lt;br /&gt;
 &lt;br /&gt;
 2. Vorbereitung&lt;br /&gt;
 2.1 Alexa Skills anlegen&lt;br /&gt;
 2.2.1 Smart Home Skill&lt;br /&gt;
 2.2.2 Custom Skill&lt;br /&gt;
 2.2 AWS Lambda Funktion anlegen&lt;br /&gt;
 &lt;br /&gt;
 3. Installation&lt;br /&gt;
 3.1 Alexa-FHEM installieren&lt;br /&gt;
 3.2 Alexa-Fhem aus FHEM starten&lt;br /&gt;
 3.3 Alexa Device anlegen&lt;br /&gt;
 &lt;br /&gt;
 4. Einrichtung&lt;br /&gt;
 4.1 Alexa Skills aktivieren&lt;br /&gt;
 4.2 Geräte suchen&lt;br /&gt;
 &lt;br /&gt;
 5. Nutzung&lt;br /&gt;
 5.1 Smart Home Skill&lt;br /&gt;
 5.2 Custom Skill&lt;br /&gt;
 &lt;br /&gt;
 6. Troubleshooting&lt;br /&gt;
 6.1 Allgemeiner Hinweis&lt;br /&gt;
 6.2 [...]&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=18197</id>
		<title>Alexa-Fhem</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa-Fhem&amp;diff=18197"/>
		<updated>2017-01-01T19:26:50Z</updated>

		<summary type="html">&lt;p&gt;Slanesh: Kleine Korrekturen/Ergänzungen (Tippfehler, Installation, Verweis, Link-Bezeichnung)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Alexa-Fhem&#039;&#039;&#039; ist eine in JavaScript und auf NodeJS basierende Software, welche es ermöglicht, der digitalen Amazon Assistentin Alexa zusätzliche Skills für die Heimautomatisierung via FHEM beizubringen. Eine erste funktionierende Version wurde von [https://forum.fhem.de/index.php?action=profile;u=430 justme1968] im [https://forum.fhem.de/index.php/topic,60244.0.html Forum] veröffentlicht.&lt;br /&gt;
Das ist eine erste Version der Dokumentation zur Installation und Einrichtung, eine Erweiterung wird sicherlich in nächster Zeit noch folgen.&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Anbindung von FHEM an Amazon Assistent Alexa&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModTechName=&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModOwner=justme1968&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Einführung==&lt;br /&gt;
&lt;br /&gt;
===Arbeitsweise und Datenfluss===&lt;br /&gt;
[[Datei:2gpXyLN.jpg|200px|thumb|right|Grafische Darstellung der beteiligten Komponenten]]&lt;br /&gt;
Echo -&amp;gt; AVS -&amp;gt; AWS Lambda -&amp;gt; alexa-fhem -&amp;gt; AWS Lambds -&amp;gt; AVS -&amp;gt; Echo&lt;br /&gt;
 &lt;br /&gt;
*Der Echo (oder ein anderes Alexa/AVS fähiges device)  nimmt Audiodaten auf und schickt diese an AVS  (Amazon Voice Service) zur Erkennung&lt;br /&gt;
*AVS führt die Spracherkennung durch und erzeugt ein Event mit Informationen zu den Erkannten Daten&lt;br /&gt;
:*Beim Custom Skill kommen die dazu nötgen Informationen aus dem &#039;&#039;Interaction Model&#039;&#039; der Alexa Skills Konfiguration&lt;br /&gt;
:*Beim Home Automation Skill sind die möglichen Sätze fest vorgegeben &lt;br /&gt;
*Das Event wird an den unter &#039;&#039;Configruation&#039;&#039; in der Alexa Skills Konfiguration hinterlegten Endpoint geschickt&lt;br /&gt;
:*Beim Home Automation Skill ist das zwingend eine AWS Lambda Routine&lt;br /&gt;
:*Beim Custom Skill kann das im Prinzip auch ein eigener Web Service sein&lt;br /&gt;
*Das Event wird vom &amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; code an alexa-fhem weitergeleitet&lt;br /&gt;
*alexa-fhem steuert FHEM und sendet ein Antwort Event zurück&lt;br /&gt;
*&amp;lt;code&amp;gt;lambda.js&amp;lt;/code&amp;gt; nimmt diese Antwort entgegen und gibt sie an AVS zurück&lt;br /&gt;
*AVS sogt dafür das der echo &#039;antwortet&#039; und das die Card in der Alexa App erscheint&lt;br /&gt;
&lt;br /&gt;
===Anmerkungen===&lt;br /&gt;
*Ein Skill hat keinen zugriff auf die Audiodaten&lt;br /&gt;
*Mit dem Skill API kann ein Skill zu zu keiner Zeit von sich aus aktiv werden und &#039;einfach&#039; Daten an den Echo schicken oder ihn dazu bringen irgendetwas zu tun.&lt;br /&gt;
*Es ist ein kleines Wunder wie schnell die Reaktion auf einen gesprochenen Satz erfolgt wenn man berücksichtigt welchen Weg die Daten insgesamt gehen.&lt;br /&gt;
&lt;br /&gt;
=== Abgrenzung des &#039;&#039;&#039;Alexa Smart Home Skills&#039;&#039;&#039; und des &#039;&#039;&#039;Alexa Custom Skills&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Smart_Home|Alexa Smart Home Skill]] ist ein Amazon-Alexa-Standard-Skill, der wesentliche Basisfunktionalitäten bereitstellt. Zu diesen gehört im Wesentlichen die Funktionalität, durch Alexa-FHEM bereitgestellte Devices im Alexa-Account des Benutzers anzulegen. Der Alexa Smart Home Skill reagiert auf gesprochene Interaktion in einem beschränkten Umfang. Beispielsweise genügt ein &amp;quot;Alexa, schalte die Wohnzimmerlampe an&amp;quot; um eine Interaktion zwischen Alexa Smart Home Skill und FHEM-Alexa auszulösen. Nach erfolgreicher Einrichtung wird dieser Skill in der Alexa-App bzw. im Web in der Rubrik &amp;quot;Smart Home&amp;quot; als Skill angezeigt.&lt;br /&gt;
&lt;br /&gt;
Der [[Alexa-Fhem#Custom|Alexa Custom Skill]] ist kein Standard-Smart-Home-Skill, sondern ein individuell entwickelter Skill, so wie alle anderen Skills auch. Er wird daher auch nicht in der Alexa-App unter der Rubrik &amp;quot;Smart Home&amp;quot; angezeigt. Gesprochene Interaktion mit diesem Skill erfolgt dadurch, dass entweder der Skill explizit gestartet wird (z.B. &amp;quot;Alexa, starte [Name des Skills]&amp;quot;) oder direkt angesprochen wird (z.B. &amp;quot;Alexa, frage [Name des Skills] wie ist der Status von [Device] &amp;quot;). Der Alexa Custom Skill befindet sich in Entwicklung und wird hinsichtlich seiner Funktionalitäten laufend weiterentwickelt. Die Einrichtung dieses Skills ist grundsätzlich optional, jedoch werden anspruchsvollere Steuerungsmöglichkeiten nur mit diesem realisiert werden können.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
Grundvoraussetzung für alle folgenden Schritte ist, dass ein Amazon-Account vorhanden ist. Es wird davon ausgegangen, dass bereits für alle folgenden Amazon-Dienste vorab das Konto jeweils eingerichtet wurde, die Einrichtung dieser ist nicht Bestandteil dieser Anleitungen.&lt;br /&gt;
&lt;br /&gt;
Es sei an dieser Stelle darauf hingewiesen, dass für die Nutzung der Amazon AWS-Dienste zwingend die Daten einer Kreditkarte angegeben werden müssen. Nach gegenwärtigem Kenntnisstand sollen jedoch keine Kosten für die Nutzung der im Rahmen dieses How To beschriebenen Dienste anfallen, sofern diese in einem Rahmen genutzt werden, der selbst eine intensive private Nutzung nicht überschreitet. Der Benutzer sei an dieser Stelle auf die von Amazon veröffentlichten Preislisten verwiesen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Da die einzelnen Schritte der Anleitung an verschiedenen Stellen unterbrochen und später fortgesetzt werden müssen, empfiehlt es sich, die Anleitung einmal vollständig gelesen zu haben. Dies vermeidet Fehler, die ansonsten geschehen können. Während der Konfiguration bietet es sich an diese Schritte dann parallel in gleichzeitig geöffneten Browserfenster durchzuführen. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzungen ===&lt;br /&gt;
Folgende grundlegende Voraussetzungen sollten erfüllt sein, bevor du mit der Einrichtung beginnst:&lt;br /&gt;
* Amazon Echo oder Amazon Dot&lt;br /&gt;
* node.js (vermutlich ab Version 0.12.7, getestet mit 4.2.6. Kann in Debian z.B. mit &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo apt-get install nodejs-legacy&amp;lt;/source&amp;gt; installiert werden)&lt;br /&gt;
* Weiterleitung von Port 3000 vom Router aus auf den Rechner, auf dem Alexa-Fhem läuft&lt;br /&gt;
* Es empfiehlt sich ein alexa Gerät in FHEM anzulegen.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem installieren ===&lt;br /&gt;
# Die tgz-Datei unter Linux entpacken (Windows macht die Rechte kaputt!) (Quelle: https://forum.fhem.de/index.php/topic,60244.0.html) (neuere Version verügbar, bitte Hinweise unter Custom Skill beachten:https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117) &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;tar -xzf alexa-fhem-0.1.3.tgz&amp;lt;/source&amp;gt;&lt;br /&gt;
# Verzeichnis &#039;&#039;package&#039;&#039; in &#039;&#039;alexa-fhem&#039;&#039; umbenennen &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;mv package alexa-fhem&amp;lt;/source&amp;gt;&lt;br /&gt;
# Durch &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;cd alexa-fhem&amp;lt;/source&amp;gt; in das Verzeichnis wechseln&lt;br /&gt;
# Mit (kein sudo!) &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;npm install&amp;lt;/source&amp;gt; alle Abhängigkeiten installieren&lt;br /&gt;
# SSL Zertifikat erzeugen durch Aufruf von (kein sudo!)&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./createKey.sh&amp;lt;/source&amp;gt;. Hierbei beachten, dass ein Kennwort vergeben werden soll, das mindestens aus 4 Zeichen besteht.&lt;br /&gt;
# Die Datei &#039;&#039;config-sample.json&#039;&#039; nach &#039;&#039;~/.alexa/config.json&#039;&#039; kopieren (~/.alexa gegebenenfalls vorher anlegen) und die Werte auf die eigene Umgebung hin anpassen. Der Filter funktioniert hierbei wie bei [http://www.fhemwiki.de/wiki/Homebridge_einrichten#Einstellungen_f.C3.BCr_homebridge homebridge-fhem],die folgenden Zeilen sind anzupassen oder zu löschen:&amp;lt;br&amp;gt;&amp;quot;nat-pmp&amp;quot;: -&amp;gt; wenn nat-pmp verwendet werden soll: die ip des eigenen routers,&amp;lt;br&amp;gt;&amp;quot;nat-upnp&amp;quot;: -&amp;gt; wenn nat-upnp verwendet werden soll: &#039;&#039;true&#039;&#039;,&amp;lt;br&amp;gt;&amp;quot;applicationId&amp;quot;: -&amp;gt; SkillID aus &amp;quot;Alexa Custom Skill anlegen&amp;quot; Punkt 7 (s.u.),&amp;lt;br&amp;gt;&amp;quot;oauthClientID&amp;quot;: -&amp;gt; &#039;&#039;Client Id&#039;&#039; aus Punkt 1. &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&lt;br /&gt;
# Durch Aufruf von &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;./bin/alexa&amp;lt;/source&amp;gt; den Dienst starten (kein sudo!)&lt;br /&gt;
&lt;br /&gt;
Der Start des Alexa-Dienstes auf der Console ist immer dann zu empfehlen, wenn man auf die Ausgaben des Dienstes angewiesen ist und beispielsweise sehen möchte, welche Devices durch den Dienst bereitgestellt werden oder ob Fehler auftreten. Beendet man die Console-Session wird auch der Dienst wieder beendet. Insofern ist die vorgenannte Vorgehensweise nur für ein Debugging zu empfehlen und nicht im Regelbetrieb. Nachfolgend ist beschrieben, wie man den Alexa-Dienst aus FHEM heraus starten / stoppen und neu starten kann.&lt;br /&gt;
&lt;br /&gt;
=== Alexa-Fhem aus FHEM heraus starten ===&lt;br /&gt;
Zunächst das Start-up-Skript aus diesem Post herunterladen [https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271 https://forum.fhem.de/index.php/topic,60244.msg517271.html#msg517271] und unter /etc/init.d/alexa speichern.&lt;br /&gt;
&lt;br /&gt;
Das Script geht davon aus, das der alexa-fhem script unter /opt/fhem/alexa-fhem liegt, und die logfiles später unter /opt/fhem/log. Sollte das nicht der Fall sein, muss das Skript angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Nun folgende Kommandos ausführen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;sudo chmod 755 /etc/init.d/alexa&lt;br /&gt;
sudo update-rc.d alexa defaults&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; den User fhem für die Nutzung von sudo zulassen (&amp;lt;code&amp;gt;sudo nano /etc/sudoers&amp;lt;/code&amp;gt;), z.B. durch Anfügen der nachfolgenden Zeile:&lt;br /&gt;
&amp;lt;code&amp;gt;fhem ALL=(ALL) NOPASSWD: ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun folgende Devices anlegen (ggf. einem Raum zuordnen, z.B. AlexaControl):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.Status dummy&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa dummy&lt;br /&gt;
attr FHEM.Alexa event-on-change-reading state&lt;br /&gt;
attr FHEM.Alexa webCmd status:start:stop:restart&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:75%;&amp;quot;&amp;gt;define FHEM.Alexa.DOIF DOIF ([FHEM.Alexa] eq &amp;quot;start&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa start &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;stop&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa stop &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;restart&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa restart &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)}) &lt;br /&gt;
DOELSEIF ([FHEM.Alexa] eq &amp;quot;status&amp;quot;) &lt;br /&gt;
(set FHEM.Alexa on, {system (&amp;quot;sudo /etc/init.d/alexa status &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;)})&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Device mit dem Modul 39_alexa.pm anlegen ===&lt;br /&gt;
&lt;br /&gt;
Das Modul 39_alexa.pm stellt innerhalb von FHEM verschiedene Attribute z.B. alexaName oder alexaRoom zur Verfügung. Manche dieser Attribute (wie z.b. alexaName) werden in beiden Skills verwendet, andere werden ausschließlich bei einer Nutzung des Alexa Custom Skill verwendet.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung des Alexa Device geschieht durch die nachfolgende Definition:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;define MyAlexa alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skills anlegen ===&lt;br /&gt;
&lt;br /&gt;
==== Smart Home ====&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Apps &amp;amp; Services =====&lt;br /&gt;
# Klicke nach der Anmeldung auf &#039;&#039;APPS &amp;amp; SERVICES&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Klicke anschließend auf &#039;&#039;Security Profiles&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-05-apps_and_services_-_security_profiles.png|200px]]&lt;br /&gt;
# Wähle anschließend &#039;&#039;Create a New Security Profile&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-06-apps_and_services_-_create_a_new_security_profile.png|200px]]&lt;br /&gt;
# Gebe dann ein Namen und eine Beschreibung für das Profil ein und bestätige die Eingaben durch anklicken von &#039;&#039;Save&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-07-apps_and_services_-_security_profile_management.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Login with Amazon =====&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo &#039;&#039;Client Id&#039;&#039; und &#039;&#039;Client Secret&#039;&#039; zu finden ist}}&lt;br /&gt;
# Nachdem du die vorherigen Schritte befolgt hast, siehst du im Browser das Profil dass du angelegt hast. Klicke jetzt oben rechts auf &#039;&#039;Login with Amazon&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-08-login_with_amazon.png|200px]]&lt;br /&gt;
# Auf der neu geladenen Seite klickst du dann auf &#039;&#039;Sign up&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-09-login_with_amazon_-_sign_up.png|200px]]&lt;br /&gt;
# Wähle anschließend im Dropdown Menü das vorher angelegte Profil aus und bestätige das anschließend mit &#039;&#039;Confirm&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-10-login_with_amazon_-_create_new_profile.png|200px]] [[Datei:Developer.amazon.com-11-login_with_amazon_-_create_new_profile2.png|200px]]&lt;br /&gt;
# Im folgenden Fenster gibst du dann die Adresse [https://www.amazon.com/gp/help/customer/display.html?nodeId=468496 https://www.amazon.com/gp/help/customer/display.html?nodeId=468496] ein und bestätigst die Eingabe mit &#039;&#039;Save&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-12-login_with_amazon_-_enter_consent_screen_information.png|200px]]&lt;br /&gt;
# Klicke dann bei dem neu angelegten Eintrag auf der rechten Seite auf das Zahnrad und wähle &#039;&#039;Web Settings&#039;&#039; aus&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-13-login_with_amazon_-_web_settings.png|200px]]&lt;br /&gt;
# Im neu geladenen Fenster klickst du dann auf &#039;&#039;Edit&#039;&#039;&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-14-login_with_amazon_-_edit.png|200px]]&lt;br /&gt;
# Füge zuletzt dann bei &#039;&#039;Allowed Return URLs&#039;&#039; die Adresse [https://layla.amazon.co.uk/api/skill/link/xxx https://layla.amazon.co.uk/api/skill/link/xxx], [https://pitangui.amazon.com/api/skill/link/xxx https://pitangui.amazon.com/api/skill/link/xxx], und [https://layla.amazon.com/api/skill/link/xxx https://layla.amazon.com/api/skill/link/xxx] hinzu. xxx muss hierbei durch den Wert ersetzt werden, der bei Punkt 6 &#039;&#039;&#039;Skill Kit einrichten&#039;&#039;&#039; unter &#039;&#039;&#039;Redirect Urls&#039;&#039;&#039; am Ende der URLs angezeigt wird.&amp;lt;br/&amp;gt;[[Datei:Developer.amazon.com-15-login_with_amazon_-_allowed_return_urls.png|200px]]&lt;br /&gt;
&lt;br /&gt;
===== Skill Kit einrichten =====&lt;br /&gt;
# Wähle im Menü den Punkt &#039;&#039;Alexa&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Klicke dann &#039;&#039;Get started&#039;&#039; beim Punkt &#039;&#039;Alexa Skills Kit&#039;&#039; an&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
# Wähle dann auf der neu geladenen Seite oben rechts &#039;&#039;Add a New Skill&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-18-alexa_-_alex_skills_kit_-_add_a_new_skill.png|200px]]&lt;br /&gt;
# Auf der folgenden Seite wählst du &#039;&#039;Smart Home Skill API&#039;&#039; sowie &#039;&#039;German&#039;&#039; als Sprache aus und gibst ein Name für den Skill ein was du dann mit &#039;&#039;Next&#039;&#039; bestätigst.&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-19-alexa_-_alex_skills_kit_-_skill_information.png|200px]]&lt;br /&gt;
# Die folgende Seite klickst du mit &#039;&#039;Next&#039;&#039; dann weiter&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-20-alexa_-_alex_skills_kit_-_interaction_model.png|200px]]&lt;br /&gt;
# Auf der Seite Configuration gibst du dann unter &#039;&#039;&#039;Authorization URL&#039;&#039;&#039; die Adresse: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;https://www.amazon.com/ap/oa&amp;lt;/source&amp;gt;an, bei &#039;&#039;&#039;Scope&#039;&#039;&#039;: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;profile:user_id&amp;lt;/source&amp;gt; und bei &#039;&#039;&#039;Access Token URI&#039;&#039;&#039;: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;https://api.amazon.com/auth/o2/token&amp;lt;/source&amp;gt;sowie bei &#039;&#039;&#039;Privacy Policy URL&#039;&#039;&#039; die Adresse: &amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Folgende Felder müssen individuell ausgefüllt werden:&amp;lt;br /&amp;gt;* &#039;&#039;Service Endpoint Type&#039;&#039; -&amp;gt; Europe auswählen und im Textfeld den Wert aus Punkt 12 &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; eintragen&amp;lt;br /&amp;gt;* &#039;&#039;Client Id&#039;&#039; -&amp;gt; &#039;&#039;Client Id&#039;&#039; aus Punkt 1. &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&amp;lt;br /&amp;gt;* &#039;&#039;Client Secret&#039;&#039; -&amp;gt; &#039;&#039;Client Secret&#039;&#039; aus Punkt 1. &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-21-alexa_-_alex_skills_kit_-_configuration.png|200px]]&lt;br /&gt;
# &amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-22-alexa_-_alex_skills_kit_-_test.png|200px]]&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=[g|Info]|RNText=Hier wird beschrieben, wo die &#039;&#039;Alexa Skill Id&#039;&#039; zu finden ist}}&lt;br /&gt;
Zur späteren Verwendung unter Punkt 7 &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; wird noch die Application Id benötigt. An diese kommt man wie folgt:&lt;br /&gt;
# Wähle im Menü den Punkt &#039;&#039;Alexa&#039;&#039; aus&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-03-apps_and_services.png|200px]]&lt;br /&gt;
# Klicke dann &#039;&#039;Get started&#039;&#039; beim Punkt &#039;&#039;Alexa Skills Kit&#039;&#039; an&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-17-alexa_-_alex_skills_kit_-_get_started.png|200px]]&lt;br /&gt;
# Beim vorher angelegten Eintrag auf &#039;&#039;Edit&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-23-alexa_-_alex_skills_kit_-_overview.png|200px]]&lt;br /&gt;
# Die Id, die nun oben angezeigt wird, ist die gesuchte &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==== Custom ====&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; die daten unter &#039;interaction model&#039; unten gelten nur für skill version 0.1.3. ab version 0.1.4 werden die daten im alexa device erzeugt. wie das geht steht hier   {{Link2Forum|Topic=60244|Message=540117|LinkText=im Forum}}.&lt;br /&gt;
&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://developer.amazon.com angemeldet sein{{Randnotiz|RNTyp=[g|Info]|RNText=Bei Punkt 6 wird die Skill ID angezeigt (siehe Screenshot), die später als zusätzlicher Trigger für AWS Lambda verwendet wird. Bitte per Copy / Paste speichern.}}&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-01-login2.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Developer.amazon.com-02-userpass2.png|200px]]&lt;br /&gt;
# Wähle im Menü den Punkt &#039;&#039;Alexa&#039;&#039; aus und klicke dann &#039;&#039;Get started&#039;&#039; beim Punkt &#039;&#039;Alexa Skills Kit&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_1.PNG|400px]]&lt;br /&gt;
# Klicke dann oben rechts auf &#039;&#039;Add a new skill&#039;&#039;&lt;br /&gt;
# Auf der Seite &#039;&#039;&#039;Create a new Alexa Skill&#039;&#039;&#039; werden folgende Optionen gewählt / Informationen eingetragen:&lt;br /&gt;
#:* Skill Type = Custom Interaction Model&lt;br /&gt;
#:* Language = German&lt;br /&gt;
#:* Name: Hier dem Skill einen beliebigen Namen geben. Dieser wird in der Alexa App unter &amp;quot;Meine Skills&amp;quot; angezeigt.&lt;br /&gt;
#:* Invocation Name: Name des Skills, unter dem dieser später gestartet wird. Z.B. &amp;quot;Alexa, starte James&amp;quot;&amp;lt;br /&amp;gt;[[Datei:CustomSkill_2.PNG|400px]]&lt;br /&gt;
# Mit &#039;&#039;Next&#039;&#039; die Seite verlassen.&lt;br /&gt;
# Auf der Seite &#039;&#039;&#039;Interaction Model&#039;&#039;&#039; folgende Eingaben tätigen:&lt;br /&gt;
#* In die Box &#039;&#039;&#039;Intent Schema&#039;&#039;&#039; den Programmcode aus folgendem Post einfügen: [https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230 https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230]&amp;lt;br /&amp;gt;[[Datei:CustomSkill_3.PNG|400px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
#* Nun auf &#039;&#039;Add Slot Type&#039;&#039; klicken und die Custom Slot Types (siehe [https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230 https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230]) einrichten. Bitte beachten, dass das Pipeline-Zeichen einen Zeilenumbruch darstellen soll. Im Screenshot ist sichtbar, wie das aussehen muss.&amp;lt;br /&amp;gt; Für FHEM_DEVICE und FHEM_ROOM bitte die eigenen in FHEM definierten Devices und Räume benennen (siehe oben alexaName und alexaRoom).&amp;lt;br /&amp;gt;[[Datei:CustomSkill_4.PNG|400px]]&amp;lt;br /&amp;gt;Der Screenshot zeigt die Einrichtung für FHEM_DEVICE. Nach der Einrichtung von FHEM_DEVICE &#039;&#039;SAVE&#039;&#039; klicken und die weiteren Slot Types (FHEM_ROOM, FHEM_SWITCH_ACTION und FHEM_artikel) jeweils durch klicken auf &#039;&#039;Add Slot Type&#039;&#039; einrichten.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
#* Unter Sample Utterances bitte den Text aus [https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230 https://forum.fhem.de/index.php/topic,60244.msg528230.html#msg528230] reinkopieren&amp;lt;br /&amp;gt;[[Datei:CustomSkill_5.PNG|400px]]&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
#* Eingaben mit &#039;&#039;Next&#039;&#039; abschließen.&lt;br /&gt;
# Auf der Folgeseite &#039;&#039;Configuration&#039;&#039; bitte folgende Angaben machen:&lt;br /&gt;
#* Service Endpoint Type = AWS Lambda&lt;br /&gt;
#* Geographical Region = Europe&lt;br /&gt;
#* Im Feld &#039;&#039;Europe&#039;&#039; wird die ARN eingetragen, die man erst in nachfolgenden Abschnitt erhält! Es muss hier also erst mal pausiert werden! Den Browser Tab geöffnet lassen!&lt;br /&gt;
#* Sobald man die ARN hat geht es hier weiter...&lt;br /&gt;
#* Do you allow users to create an account or link to an existing account with you? = Yes&lt;br /&gt;
#* Authorization URL = https://www.amazon.com/ap/oa&lt;br /&gt;
#* Client ID = Client ID von oben aus &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&lt;br /&gt;
#* Domain List - nichts eingeben&lt;br /&gt;
#* Scope = profile:user_id&lt;br /&gt;
#* Redirect URLs - sollten vorbelegt sein&lt;br /&gt;
#* Authorization Grant Type - Auth Code Grant auswählen&lt;br /&gt;
#* Access Token URI = https://api.amazon.com/auth/o2/token&lt;br /&gt;
#* Client Secret = siehe oben bei &#039;&#039;&#039;Login with Amazon&#039;&#039;&#039;&lt;br /&gt;
#* Client Authentication Scheme = HTTP Basic&lt;br /&gt;
#* Privacy Policy URL = https://www.amazon.com/gp/help/customer/display.html?nodeId=468496&lt;br /&gt;
#* Das sollte jetzt alles wie folgt aussehen:&amp;lt;br /&amp;gt;[[Datei:CustomSkill_6.PNG|400px]]&amp;lt;br /&amp;gt;[[Datei:CustomSkill_7.PNG|400px]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Einrichtung des Custom Skill abgeschlossen. Auf der Folgeseite lässt sich der Skill dann testen. In der Alexa App sollte der Skill nun auch sichtbar sein. Er musshier noch aktiviert werden und die Kontoverknüpfung eingerichtet werden, was selbsterklärend ist.&lt;br /&gt;
&lt;br /&gt;
=== AWS Lambda Funktion anlegen ===&lt;br /&gt;
Für folgende Schritte muss man unter der Adresse http://aws.amazon.com angemeldet sein&lt;br /&gt;
# Anmeldung auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-01-site.png|200px]]&lt;br /&gt;
# Anmeldedaten eingeben&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-02-login.png|200px]]&lt;br /&gt;
# Den Punkt &#039;&#039;Lambda&#039;&#039; links auf der Startseite auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-03-lambda.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Get Started Now&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-04-get_started_now.png|200px]]&lt;br /&gt;
# Den Blueprint &#039;&#039;Blank function&#039;&#039; auswählen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-05-select_blueprint.png|200px]]&lt;br /&gt;
# Im neuen Fenster dann auf den gestrichelten Kasten klicken und &#039;&#039;Alexa Smart Home&#039;&#039; auswählen und mit &#039;&#039;Next&#039;&#039; bestätigen&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers1.png|200px]]&amp;lt;br /&amp;gt;&#039;&#039;Achtung! Es ist möglich, dass ihr hier &#039;&#039;&#039;Alexa Smart Home&#039;&#039;&#039; überhaupt nicht auswählen könnt. Dann solltet ihr ganz rechts oben in der Ecke mal schauen, welche Region bzw. welches Land ausgewählt ist. Ich empfehle hier &#039;&#039;&#039;Ireland&#039;&#039;&#039; auszuwählen. Dann erscheint bei den Funktionen auch &#039;&#039;&#039;Alexa Smart Home&#039;&#039;&#039;.&#039;&#039;&lt;br /&gt;
# Bei &#039;&#039;Application Id&#039;&#039; den Wert eintragen, dessen Ermittlung unter &#039;&#039;&#039;Skill Kit einrichten&#039;&#039;&#039; in der zusätzlichen Beschreibung beschrieben wird, den Haken bei &#039;&#039;Enable trigger&#039;&#039; setzen und mit &#039;&#039;Next&#039;&#039; bestätigen &amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-06-configure_triggers3.png|200px]]&lt;br /&gt;
# Auf der Konfigurationsseite bei &#039;&#039;Name&#039;&#039; den Wert FHEM eingeben, bei &#039;&#039;Runtime&#039;&#039; Node.js 4.3. Bei &#039;&#039;Role&#039;&#039; den Wert &#039;&#039;Choose an existing role&#039;&#039; wählen (wenn es noch keine existing role gibt: zuerst Create a custom role -&amp;gt; in dem Popup dann lambda_basic_execution und auf Allow)  und bei &#039;&#039;Existing role&#039;&#039; dann &#039;&#039;x&#039;&#039; wählen. Der Quellcode der Datei lambda.js aus dem Quellpaket wird dann an die Stelle des großen Textfeldes vollständig eingefügt. Dann noch den Hostname im Quellcode an den eigenen anpassen. Anschließend alles mit &#039;&#039;Next&#039;&#039; bestätigen.&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-07-configure_function.png|200px]]&lt;br /&gt;
# Auf der Übersichtsseite dann &#039;&#039;Create function&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-08-review.png|200px]]&lt;br /&gt;
# Klicke dann auf der Übersichtsseite oben links auf &#039;&#039;Functions&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-09-go_overview.png|200px]]&lt;br /&gt;
# Wähle dann die angelegte Funktion aus und klicke dann im Menü &#039;&#039;Action&#039;&#039; auf den Punkt &#039;&#039;Show ARN&#039;&#039;&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-1-show_arn.png|200px]]&lt;br /&gt;
# Es wird nun eine ARN Adresse angezeigt, die für den Punkt 6 bei &#039;&#039;&#039;Skill Kit einrichten&#039;&#039;&#039; benötigt wird&amp;lt;br /&amp;gt;[[Datei:Aws.amazon.com-10-2-arn.png|200px]]&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
Nachdem die Alexa Skills installiert bzw. definiert wurden, müssen diese noch in deiner Alexa eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
=== Alexa Skill ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden (Per Desktop-Browser, nicht die App unter iOS oder Android verwenden. Diese hat Probleme mit der OAuth Verknüpfung.)&lt;br /&gt;
# Auf &#039;&#039;Skills&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Oben rechts &#039;&#039;Meine Skills&#039;&#039;  auswählen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-03-meine_skills.png|200px]]&lt;br /&gt;
# In der Liste der Skills sollte das angelegte FHEM Skill angezeigt werden. Dieses anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-02-liste_skills.png|200px]]&lt;br /&gt;
# Oben Rechts in den Details des Skills auf &#039;&#039;Skill aktivieren&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-04-skill_details.png|200px]]&lt;br /&gt;
# In dem neu geöffneten Fenster die Authorisierung bestätigen&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-05-amazon_auth.png|200px]]&lt;br /&gt;
# Anschließend sollte die Verbindung erfolgreich aufgebaut worden sein &amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-06-success.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Geräte ===&lt;br /&gt;
# Auf http://alexa.amazon.de anmelden&lt;br /&gt;
# Auf &#039;&#039;Smart Home&#039;&#039; klicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-01-startseite.png|200px]]&lt;br /&gt;
# Anschließend den Punkt &#039;&#039;Geräte suchen&#039;&#039; anklicken&amp;lt;br /&amp;gt;[[Datei:Alexa.amazon.de-07-Gerätesuche.png|200px]]&lt;br /&gt;
# Wurde soweit alles korrekt eingerichtet, werden nun die gefundenen Geräte angezeigt.&lt;br /&gt;
&lt;br /&gt;
Tip: Es macht Sinn, unter &#039;&#039;Meine Gruppen&#039;&#039; Gruppen benannt nach den Räumen einzurichten. Hierdurch kann Alexa die Geräte besser auseinander halten, vor allem wenn die den gleichen Alias (z.B. &amp;quot;Licht&amp;quot;) haben.&lt;br /&gt;
== Nutzung ==&lt;br /&gt;
Um den Namen zu bestimmen unter dem ein Gerät mit Alexa angesprochen wird verwendet Alexa-Fhem mit absteigender Priorität:&lt;br /&gt;
* das alexaName Attribut&lt;br /&gt;
* das alias Attribut&lt;br /&gt;
* das NAME Internal&lt;br /&gt;
&lt;br /&gt;
Damit Alexa ein Gerät eindeutig identifizieren kann sollten eindeutige Bezeichnungen möglichst aus einem Wort und ohne Ziffern verwendet werden. Wenn Alexa einen Namen nicht versteht sollte man unter [http://alexa.amazon.de/spa/index.html] nachsehen was tatsächlich verstanden wurde und die Benennung anpassen.&lt;br /&gt;
&lt;br /&gt;
=== Smart Home Skill ===&lt;br /&gt;
Gruppen (Räume) müssen in der Alexa App konfiguriert werden. Über das API lassen sich nur der Name und die Schalteigenschaften übergeben.&lt;br /&gt;
&lt;br /&gt;
==== Sprachkommandos ====&lt;br /&gt;
Nach erfolgreicher Einrichtung des Smart Home Skills sollte Alexa mit den folgenden Befehlen nutzbar sein:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; ein”&lt;br /&gt;
“alexa, schalte &amp;lt;gerät/gruppe&amp;gt; aus”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;wert&amp;gt; prozent”&lt;br /&gt;
“alexa, stelle &amp;lt;gerät/gruppe&amp;gt; auf &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; prozent”&lt;br /&gt;
“alexa, erhöhe &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
“alexa, reduziere &amp;lt;gerät/gruppe&amp;gt; um &amp;lt;anzahl&amp;gt; grad”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Custom Skill ===&lt;br /&gt;
Der Custom Skill erlaubt im Gegensatz zum Smart Home Skill eine weitreichende Konfiguration der möglichen Kommandos.&lt;br /&gt;
&lt;br /&gt;
Das Prinzip der Kommandokonfiguration ist {{Link2Forum|Topic=60244|Message=532513|LinkText=im Forum}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
TODO: Abfragen, Attribute (alexaMapping, alexaTypes, fhemIntents, articles, prepositions)&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
====Allgemeiner Hinweis====&lt;br /&gt;
Besonders wichtig ist, dass man sich sehr genau an diese Anleitung hält. Ein häufiger Fehler ist, dass die einfachen Anführungszeichen in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 8 einfach weggelassen werden. Diese sind zwingend notwendig. Es darf auch nur der reine Hostname eingetragen werden. Also kein &#039;&#039;http://&#039;&#039; davor. Entweder eine feste IP Adresse oder den Hostnamen, um den Rechner zu erreichen, den ihr über den Port 3000 freigegeben habt. Das sollte dann so aussehen:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
const PORT=3000;&lt;br /&gt;
const HOST=&#039;mein.host.name&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Freigabe von Port 3000====&lt;br /&gt;
{{Randnotiz|RNTyp=Fehl|RNText=Derzeit müsst ihr über einen echten IPv4 Anschluss verfügen, damit der Amazon Lambda-Server euch erreichen kann. DS-Lite Anschlüsse wie die von &amp;lt;b&amp;gt;UnityMedia&amp;lt;/b&amp;gt; z.B. funktionieren derzeit leider nicht. Eine möglicher &amp;quot;Workaround&amp;quot; wird hier beschrieben: https://forum.fhem.de/index.php/topic,60244.msg518276.html#msg518276}}&lt;br /&gt;
&lt;br /&gt;
Auf dem Router muss der Port 3000 Protokoll TCP freigegeben werden. D.h. von außen muss man wenn man den Port 3000 aufruft, auf dem intern laufenden node.js Alexa-Dienst zugreifen können.&lt;br /&gt;
Je nach Router gestaltet sich das Portforwarding bzw. die Portumleitung etwas schwieriger.&lt;br /&gt;
&lt;br /&gt;
Bei einem Speedport Router der Telekom beispielsweise, muss der Router komplett neu gestartet werden, wenn die Portfreigabe eingerichtet wurde. &lt;br /&gt;
&lt;br /&gt;
Bei der Fritz!Box ist das nicht nötig, bei dieser finden die Freigabe unter &#039;&#039;Internet -&amp;gt; Freigaben -&amp;gt; Portfreigaben&#039;&#039; statt. Dort wählt man dann den Rechner aus und richtet eine neue Freigabe ein. Wichtig hierbei ist, dass man Portfreigabe auswählt und nicht MyFRITZ!-Freigabe. Bei Port von bis trägt man 3000 ein, bei Port extern ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um die Portweiterleitung zu testen, solltet ihr euch auch nicht im gleichen Netz befinden. Viele Router blockieren den Netzaufruf aus dem gleichen Netz. Am besten testet ihr es, wenn ihr an eurem Mobiltelefon W-LAN deaktiviert und im Browser folgende Seite aufruft: &#039;&#039;https://mein.hostname:3000&#039;&#039;. Wenn ihr im Browser dann einen Quellcode von Alexa seht, funktioniert die Portumleitung.&lt;br /&gt;
&lt;br /&gt;
Wenn bis hier alles funktioniert und es läuft dennoch nicht rund, liegt das Problem woanders. Kommt z.B. bei der Gerätesuche kein Request rein (sichtbar auf dem Bildschirm, wenn bin/alexa gestartet wurden), kann evtl. der Lambda-Dienst falsch konfiguriert sein.&lt;br /&gt;
&lt;br /&gt;
====Probleme mit node.js - npm install====&lt;br /&gt;
&lt;br /&gt;
Falls eine Fehlermeldung auftritt, dass &amp;quot;npm&amp;quot; nicht gefunden werden kann, bitte NodeJS entsprechend der Anleitung im Homebridge-Artikel vorgehen: [http://www.fhemwiki.de/wiki/Homebridge_einrichten#NodeJS_installieren NodeJS installieren] sowie [http://www.fhemwiki.de/wiki/Homebridge_einrichten#Python.2C_g.2B.2B.2C_MDNS_installieren Python, g++, MDNS installieren], siehe auch folgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
====Es kommen diverse Fehlermeldungen beim Starten von alexa-fhem und es beendet sich====&lt;br /&gt;
Wenn man auf der Konsole angemeldet ist, den Befehl&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;node -v&amp;lt;/source&amp;gt;eingeben. Ist die Version niedriger als die geforderte 0.12, muss eine neuere installiert werden. Hier darf man dann im Wiki unter http://www.fhemwiki.de/wiki/Homebridge_einrichten#NodeJS_installieren nachschauen. NodeJS V4 sollte hierbei schon ausreichen. Solange die node.js Version nicht passt, gar nicht groß rum experimentieren! Bitte beachtet, dass alle Voraussetzungen unter http://www.fhemwiki.de/wiki/Alexa-Fhem#Voraussetzungen erfüllt sind! Keine Experimente mit Versionen die darunter liegen.&lt;br /&gt;
&lt;br /&gt;
====Fehlermeldung &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039; Fehler angezeigt beim Start von alexa-fhem====&lt;br /&gt;
Wenn ihr dann alexa-fhem über die Konsole startet und bekommt folgenden Fehler: &#039;&#039;NAT-PMP failed: Error: timeout&#039;&#039;, lasst euch davon nicht irritieren. Das bedeutet lediglich, dass der Port nicht automatich freigegeben wurde über uPNP. Alternativ prüft, ob die Funktion der Portfreigabe via uPNP auf eurem Router aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
====Nach Start auf der Console beendet sich Alexa-FHEM sofort wieder====&lt;br /&gt;
Unmittelbar nach dem Start von Alexa-FHEM werden ein paar UPNP Fehlermeldungen ausgegeben. Unmittelbar danach beendet sich Alexa-FHEM wieder. &lt;br /&gt;
&lt;br /&gt;
Viele scheinen ein Problem mit UPNP auf dem Raspberry Pi zu haben. Wenn dieses Problem auftritt einfach in der &amp;lt;code&amp;gt;~/.alexa/config.json&amp;lt;/code&amp;gt; die folgenden Zeilen rauslöschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        &amp;quot;nat-pmp&amp;quot;: &amp;quot;10.0.1.1&amp;quot;,&lt;br /&gt;
        &amp;quot;nat-upnp&amp;quot;: true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt erneut Alexa-FHEM starten. Sollte nun laufen.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn alexa-fhem keine Geräte findet?====&lt;br /&gt;
Zunächst müssen die Geräte, die angesprochen werden wollen, unter FHEM ein neues Attribut zugewiesen bekommen. Dazu das Gerät in FHEM öffnen und das Attribut &#039;&#039;genericDeviceType switch&#039;&#039; hinzufügen, wenn es ein Schalter mit der Funktiona AN/AUS sein soll. Wenn man will, kann man dem Gerät jetzt noch über das Attribut &#039;&#039;alias&#039;&#039; eine besseren Namen geben, mit dem Alexa das Gerät dann auch finden kann.&lt;br /&gt;
Anschließend muss alexa-fhem neu gestartet werden und die definierten Geräte sollten nun gefunden werden.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn Alexa zwar Geräte findet, diese aber nicht angesprochen werden können?====&lt;br /&gt;
Zuerst die Informationen zum Datenfluss ganz oben ansehen. Dann am besten von hinten nach vorne vorgehen:&lt;br /&gt;
* wenn nichts bei alexa-fhem ankommt: port forwarding prüfen&lt;br /&gt;
* wenn lambda.js nichts los wird: im cloudwatch log nachsehen&lt;br /&gt;
* wenn bei lambda.js nichts ankommt: den trigger prüfen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zunächst sollte man sich unter &#039;&#039;http://aws.amazon.com&#039;&#039; das Logfile seiner erstellten Funktion anschauen. Ist überhaupt ein Logfile vorhanden? Falls nicht, liegt es vermutlich am Trigger.&lt;br /&gt;
Den solltet ihr überprüfen. Scheinbar kommt es hin und wieder vor, dass dieser nicht gesetzt ist. Dazu einfach auf &#039;&#039;Triggers&#039;&#039; klicken und mit &#039;&#039;Add trigger&#039;&#039; erneut einen anlegen. Hier muss, wie in der Anleitung unter &#039;&#039;&#039;AWS Lambda Funktion anlegen&#039;&#039;&#039; Punkt 7, die &#039;&#039;Application Id&#039;&#039; stehen und der Haken bei &#039;&#039;Enable trigger&#039;&#039; gesetzt sein. Dann alexa-fhem neu starten.&lt;br /&gt;
Wenn ihr Änderugen gemacht habt und den alexa-fhem Dienst noch nicht neu gestartet habt, wäre jetzt der richtige Zeitpunkt.&lt;br /&gt;
&lt;br /&gt;
====Was ist zu tun, wenn sich der Alexa-Service nicht starten lässt?====&lt;br /&gt;
Schaut bitte in das Unterverzeichnis [alexa-fhem (also dort, wo Ihr Alexa-FHEM instelliert habt]/bin. Die dort befindliche Datei &#039;&#039;alexa&#039;&#039; muss ausführbar sein. Also z.B. so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;2755327 4 -rwxr-xr-x 1 pi pi  339 Nov 26 23:20 alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
Sollte dies nicht der Fall sein bitte mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:70%;&amp;quot;&amp;gt;chmod +x alexa&amp;lt;/source&amp;gt;&lt;br /&gt;
die Datei ausführbar machen. Sofern der User &amp;quot;pi&amp;quot; Eigentümer ist, ist kein sudo erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Slanesh</name></author>
	</entry>
</feed>