<?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=Loredo</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=Loredo"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Loredo"/>
	<updated>2026-04-21T13:21:30Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30962</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30962"/>
		<updated>2019-07-11T14:37:40Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Encoding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch weitere Informationsquellen/-dateien des SVN) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support für FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilft jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sich über den FHEM Installer im oben erwähnten Developer-Modus das über das Analyseverfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
==== META.json Abschnitt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
==== Encoding ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30961</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30961"/>
		<updated>2019-07-11T14:35:46Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Erweiterung eines FHEM Moduls mit META.json Pod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch weitere Informationsquellen/-dateien des SVN) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support für FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilft jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sich über den FHEM Installer im oben erwähnten Developer-Modus das über das Analyseverfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
==== META.json Abschnitt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
==== Encoding ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30960</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30960"/>
		<updated>2019-07-11T14:34:31Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Erweiterung eines FHEM Moduls mit META.json Pod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch weitere Informationsquellen/-dateien des SVN) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support für FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilft jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
==== META.json Abschnitt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
==== Encoding ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30959</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30959"/>
		<updated>2019-07-11T14:32:36Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Erweiterung eines FHEM Moduls mit META.json Pod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch weitere Informationsquellen/-dateien des SVN) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support für FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
==== META.json Abschnitt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
==== Encoding ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30958</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30958"/>
		<updated>2019-07-11T14:29:30Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch weitere Informationsquellen/-dateien des SVN) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
==== META.json Abschnitt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
==== Encoding ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30956</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30956"/>
		<updated>2019-07-11T13:21:18Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Development Module and Package Meta Data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch die in FHEM bereits bekannten) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
==== META.json Abschnitt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
==== Encoding ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30955</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30955"/>
		<updated>2019-07-11T13:00:14Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul bereits geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch die in FHEM bereits bekannten) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
==== META.json Abschnitt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
==== Encoding ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30954</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30954"/>
		<updated>2019-07-11T12:58:43Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Anzeigen der Modulversion über FHEM::Meta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul bereits geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch die in FHEM bereits bekannten) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (= version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30953</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30953"/>
		<updated>2019-07-11T12:57:01Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul bereits geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch die in FHEM bereits bekannten) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Hauptseite&amp;diff=30952</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Hauptseite&amp;diff=30952"/>
		<updated>2019-07-11T12:56:15Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Banner für wichtige Mitteilungen ---------         --&amp;gt; &lt;br /&gt;
&amp;lt;!-- Banner für wichtige Mitteilungen ---------          &lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: red; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Es finden aktuell Wartungsarbeiten an der FHEM-Infrastruktur statt. Es kann daher zu kurzzeitigen Ausfällen und Beeinträchtigungen beim Zugriff auf FHEM-Dienste (Forum, SVN, Wiki, fhem.de) kommen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wir bitten um etwas Geduld. Sämtliche FHEM-Dienste werden im Laufe des Tages wieder wie gewohnt zur Verfügung stehen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
     Ende von Banner für wichtige Mitteilungen --------  --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende von Banner für wichtige Mitteilungen --------  --&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;h1 style=&amp;quot;font-family:sans-serif; font-size: 1.8em; border: none; text-align: center;&amp;quot;&amp;gt;&#039;&#039;&#039;FHEM Wiki - Informationsportal zum FHEM SmartHome-Server&#039;&#039;&#039;&amp;lt;/h1&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;flexbox&amp;quot;&amp;gt; &amp;lt;!-- Beginn der Inhaltsboxen --&amp;gt;&lt;br /&gt;
&amp;lt;div  class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 1; flex: 1 1 80%; background-color:#cce5ff;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Was ist FHEM?&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;FHEM&#039;&#039;&#039; ([https://register.dpma.de/DPMAregister/marke/register/3020152110040/DE R]) ist ein in Perl geschriebener, GPL v2 lizensierter Server für die Heimautomatisierung. Man kann mit FHEM häufig auftretende Aufgaben automatisieren, wie z.B. Lampen / Rollladen / Heizung / usw. schalten, oder Ereignisse wie Temperatur / Feuchtigkeit / Stromverbrauch protokollieren und visualisieren.&lt;br /&gt;
&lt;br /&gt;
Das Programm läuft als Server, man kann es über WEB, dedizierte Smartphone Apps oder telnet bedienen, TCP Schnittstellen für JSON und XML existieren ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um es zu verwenden, benötigt man einen 24/7 Rechner (NAS, RPi, PC, MacMini, etc) mit einem Perl Interpreter und angeschlossene Interfaces wie CUL-, EnOcean-, Z-Wave-USB-Stick etc. für einen Zugang zu den Aktoren und Sensoren.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 4; background-color:#efefef;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wie fange ich an?&#039;&#039;&#039;&lt;br /&gt;
* [[Datei:Info_green.png|20px]][http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM][[Datei:Info_green.png|20px]]&amp;lt;br /&amp;gt;DAS Einsteiger-PDF. &#039;&#039;&#039;Pflichtlektüre!&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Quick-Start]], english version: [[Quick-Start/en|Quick-Start]] &lt;br /&gt;
* kleiner FHEM-Kurs, benötigt keine Hardware: [[Erste Schritte in FHEM]] / [[First steps in FHEM]]&lt;br /&gt;
* [[Systemübersicht]]&lt;br /&gt;
* Phasen eines FHEM-Projekts:&lt;br /&gt;
** [[Planung]]&lt;br /&gt;
** [[Umsetzung]] (Implementierung)&lt;br /&gt;
** [[Betrieb]] (&amp;quot;Produktion&amp;quot;)&lt;br /&gt;
* [[:Kategorie:Glossary|Glossar]] (Erklärung für bestimmte Begriffe)&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[:Kategorie:HOWTOS|Verschiedene HowTos]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[:Kategorie:FAQ|Frequently asked Questions - Häufig gestellte Fragen mit Antworten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;!-- Verlinkte Wiki-Seite für Anfänger ist leer, darum auskommentiert&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[Help:Reading|How to read FHEMWiki]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 6; background-color:#fff0e0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Unterstützte Hardware (Auszug)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[:Kategorie:Hardware Typen|Hardware Typen]] - Funktionsbezogene Übersicht (z.B. [[:Kategorie:Unterhaltungselektronik|Unterhaltungselektronik / Multimedia]], [[:Kategorie:Heizungssteuerung|Heizungssteuerung]], [[:Kategorie:Energieverbrauchsmessung|Energieverbrauchsmessung]], etc.)&lt;br /&gt;
* [[:Kategorie:Server Hardware|Server Hardware]] - Hardware, auf der FHEM installiert werden kann&lt;br /&gt;
* [[:Kategorie:EMS Components|EMS]], [[:Kategorie:FHT Components|FHT]], [[:Kategorie:HMS Components|HMS]] Komponenten&lt;br /&gt;
* [[:Kategorie:1-Wire|1-Wire System]]&lt;br /&gt;
* [[:Kategorie:EIB/KNX|EIB/KNX Komponenten]]&lt;br /&gt;
* [[:Kategorie:FS20 Components|FS20 Komponenten]]&lt;br /&gt;
* [[:Kategorie:EnOcean Components|EnOcean Komponenten]]&lt;br /&gt;
* [[:Kategorie:HomeMatic Components|HomeMatic Komponenten]]&lt;br /&gt;
* [[:Kategorie:MAX|MAX! Komponenten]]&lt;br /&gt;
* [[:Kategorie:panStamp|panStamp Komponenten]]&lt;br /&gt;
* [[:Kategorie:Z-Wave Components|Z-Wave Komponenten]]&lt;br /&gt;
* [[:Kategorie:ZigBee|Zigbee Komponenten]]&lt;br /&gt;
* [[:Kategorie:IP Components|Geräte mit Webinterface (&amp;quot;IP&amp;quot;)]]&lt;br /&gt;
* [[:Kategorie:Other Components|Andere Komponenten / Sonstige Systeme]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[:Kategorie:Hardware|Alle Hardware-Kategorien]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 5; background-color:#F8F8FF;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ideen und Lösungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[:Kategorie:Code_Snippets|Verschiedene kommentierte Lösungen und Code-Schnippsel]]&lt;br /&gt;
* [[:Kategorie:Examples|Beispielanwendungen - Hardwarelösungen - Fremdsystemanbindungen]]&lt;br /&gt;
* [[Anwendungsszenarien]]&lt;br /&gt;
* [[Trick der Woche|Tipp der Woche]]&lt;br /&gt;
* [[Wie kann ich...]]?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[:Kategorie:FHEM|FHEM-Haupt-Kategorien]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 7; background-color:#FFFFE7;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Developers Corner&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Informationen zur Modul-Entwicklung:&lt;br /&gt;
** [[DevelopmentModuleIntro|Development Module Introduction]]&lt;br /&gt;
** [[Meta|Development Module and Package Meta Data]]&lt;br /&gt;
** [[DevelopmentModuleAPI|Development Module API]]&lt;br /&gt;
** [[DevelopmentFHEMWEB-API|Development FHEMWEB API]]&lt;br /&gt;
** [[Blocking Call]]&lt;br /&gt;
** [[CoProcess]]&lt;br /&gt;
** [[HttpUtils]]&lt;br /&gt;
** [[DevIo]]&lt;br /&gt;
** [[Guidelines zur Dokumentation]]&lt;br /&gt;
** [[DevelopmentGuidelinesAV|Development Guidelines AV-Module]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Organisatorisches:&lt;br /&gt;
** [[How to write a patch]]&lt;br /&gt;
** [[SVN Nutzungsregeln]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[:Kategorie:Development|Alle Artikel zu Development]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 3; background-color:#d7ffff;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;FHEM Wiki News&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:20em;overflow:scroll;overflow-x:hidden;&amp;quot;&amp;gt;{{FHEMWiki_News}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[FHEMWiki:News|News]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 2; background-color:#e7f8ff;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Was ist FHEM Wiki?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FHEM Wiki&#039;&#039;&#039; ergänzt die stets tagesaktuelle, von den zuständigen Entwicklern gepflegte {{Link2CmdRef}} (Befehls-Referenz) um weitergehende Informationen rund um FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.&lt;br /&gt;
&lt;br /&gt;
Das FHEMWiki stellt neben der {{Link2CmdRef}}, dem [http://forum.fhem.de/ Forum] und der [http://www.fhem.de FHEM] Seite die zentrale Informationsquelle rund um FHEM dar. Bedeutung und Zusammenspiel dieser Elemente [[Dokumentationsstruktur|ist hier]] erläutert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- {{NUMBEROFUSERS}} [[Special:Listusers|Benutzer]] haben sich seit Mai 2013 registriert und {{NUMBEROFARTICLES}} Artikel geschrieben. ({{NUMBEROFEDITS}} Seitenänderungen bislang).--&amp;gt;&lt;br /&gt;
Bitte [[FHEMWiki:Support | unterstütze uns]] und hilf, [[:Kategorie:NeedsEditing| das Wiki zu erweitern]]. Vielen Dank!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[FHEMWiki:Über_FHEMWiki|über FHEMWiki]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 8; background-color:#F8F8FF;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Letzte Änderungen&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:small;color:black;&amp;quot;&amp;gt;&amp;lt;small&amp;gt;{{Special:Recentchanges/8}}&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[Special:Recentchanges|Änderungen]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 9; flex: 1 1 80%; background-color:#FFFFAA;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Die letzten fünf neuen Seiten&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;small&amp;gt;{{Special:NewPages/5}}&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[Special:NewPages|Neue Seiten]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 10; background-color:#DDD68F;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Administratives zum Wiki&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Allgemeine Aktivitäten:&#039;&#039;&lt;br /&gt;
* Registrierung zur Mitarbeit: wende Dich bitte an einen [[FHEMWiki:Administratoren|Administrator]]&lt;br /&gt;
* Basiswissen über die Mitarbeit an einem Wiki erarbeiten ([http://de.wikipedia.org/wiki/Wikipedia:Beteiligen z.B. Wikipedia])&lt;br /&gt;
* Erweiterung und Korrektur von Artikeln, wo immer nötig&lt;br /&gt;
* Ein(ig)e der [[Spezial:Gewünschte Seiten|gewünschten Seiten]] erstellen &lt;br /&gt;
* Ideen aus dem [http://forum.fhem.de Forum] in bestehende oder neue Artikel einarbeiten&lt;br /&gt;
* [[Spezial:Verwaiste Seiten|verwaiste Seiten]] in sinnvoller Weise verlinken&lt;br /&gt;
* [[Spezial:Sackgassenseiten|Sackgassenseiten]] wikifizieren (Links auf andere Seiten einfügen)&lt;br /&gt;
* [[Datei:Info_red.png|20px]] &#039;&#039;&#039;Tips / Regeln / Hinweise auf &amp;quot;[[FHEMWiki:Über FHEMWiki|Über FHEMWiki]]&amp;quot; beachten!&#039;&#039;&#039; [[Datei:Info_red.png|20px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sonstiges:&#039;&#039;&lt;br /&gt;
* Zum Ausprobieren bitte die [[FHEMWiki:Sandbox]] benutzen&lt;br /&gt;
* [//meta.wikimedia.org/wiki/Help:Contents Wiki Benutzerhandbuch].&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Wiki-Konfigurationsvariablen]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [[FHEMWiki:Interna|Internes zu diesem Wiki]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- Ende der Flexbox --&amp;gt;&lt;br /&gt;
[[Kategorie:FHEM]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Hauptseite&amp;diff=30951</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Hauptseite&amp;diff=30951"/>
		<updated>2019-07-11T12:54:59Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Banner für wichtige Mitteilungen ---------         --&amp;gt; &lt;br /&gt;
&amp;lt;!-- Banner für wichtige Mitteilungen ---------          &lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: red; border: 1px solid maroon; border-radius: 8px; padding: 0 1em 1em 1em; font-size: bigger; text-align: center; color: white;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Es finden aktuell Wartungsarbeiten an der FHEM-Infrastruktur statt. Es kann daher zu kurzzeitigen Ausfällen und Beeinträchtigungen beim Zugriff auf FHEM-Dienste (Forum, SVN, Wiki, fhem.de) kommen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wir bitten um etwas Geduld. Sämtliche FHEM-Dienste werden im Laufe des Tages wieder wie gewohnt zur Verfügung stehen.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
     Ende von Banner für wichtige Mitteilungen --------  --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende von Banner für wichtige Mitteilungen --------  --&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;h1 style=&amp;quot;font-family:sans-serif; font-size: 1.8em; border: none; text-align: center;&amp;quot;&amp;gt;&#039;&#039;&#039;FHEM Wiki - Informationsportal zum FHEM SmartHome-Server&#039;&#039;&#039;&amp;lt;/h1&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;flexbox&amp;quot;&amp;gt; &amp;lt;!-- Beginn der Inhaltsboxen --&amp;gt;&lt;br /&gt;
&amp;lt;div  class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 1; flex: 1 1 80%; background-color:#cce5ff;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Was ist FHEM?&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;FHEM&#039;&#039;&#039; ([https://register.dpma.de/DPMAregister/marke/register/3020152110040/DE R]) ist ein in Perl geschriebener, GPL v2 lizensierter Server für die Heimautomatisierung. Man kann mit FHEM häufig auftretende Aufgaben automatisieren, wie z.B. Lampen / Rollladen / Heizung / usw. schalten, oder Ereignisse wie Temperatur / Feuchtigkeit / Stromverbrauch protokollieren und visualisieren.&lt;br /&gt;
&lt;br /&gt;
Das Programm läuft als Server, man kann es über WEB, dedizierte Smartphone Apps oder telnet bedienen, TCP Schnittstellen für JSON und XML existieren ebenfalls.&lt;br /&gt;
&lt;br /&gt;
Um es zu verwenden, benötigt man einen 24/7 Rechner (NAS, RPi, PC, MacMini, etc) mit einem Perl Interpreter und angeschlossene Interfaces wie CUL-, EnOcean-, Z-Wave-USB-Stick etc. für einen Zugang zu den Aktoren und Sensoren.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 4; background-color:#efefef;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wie fange ich an?&#039;&#039;&#039;&lt;br /&gt;
* [[Datei:Info_green.png|20px]][http://fhem.de/Heimautomatisierung-mit-fhem.pdf Heimautomatisierung mit FHEM][[Datei:Info_green.png|20px]]&amp;lt;br /&amp;gt;DAS Einsteiger-PDF. &#039;&#039;&#039;Pflichtlektüre!&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[Quick-Start]], english version: [[Quick-Start/en|Quick-Start]] &lt;br /&gt;
* kleiner FHEM-Kurs, benötigt keine Hardware: [[Erste Schritte in FHEM]] / [[First steps in FHEM]]&lt;br /&gt;
* [[Systemübersicht]]&lt;br /&gt;
* Phasen eines FHEM-Projekts:&lt;br /&gt;
** [[Planung]]&lt;br /&gt;
** [[Umsetzung]] (Implementierung)&lt;br /&gt;
** [[Betrieb]] (&amp;quot;Produktion&amp;quot;)&lt;br /&gt;
* [[:Kategorie:Glossary|Glossar]] (Erklärung für bestimmte Begriffe)&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[:Kategorie:HOWTOS|Verschiedene HowTos]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* [[:Kategorie:FAQ|Frequently asked Questions - Häufig gestellte Fragen mit Antworten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;!-- Verlinkte Wiki-Seite für Anfänger ist leer, darum auskommentiert&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[Help:Reading|How to read FHEMWiki]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 6; background-color:#fff0e0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Unterstützte Hardware (Auszug)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[:Kategorie:Hardware Typen|Hardware Typen]] - Funktionsbezogene Übersicht (z.B. [[:Kategorie:Unterhaltungselektronik|Unterhaltungselektronik / Multimedia]], [[:Kategorie:Heizungssteuerung|Heizungssteuerung]], [[:Kategorie:Energieverbrauchsmessung|Energieverbrauchsmessung]], etc.)&lt;br /&gt;
* [[:Kategorie:Server Hardware|Server Hardware]] - Hardware, auf der FHEM installiert werden kann&lt;br /&gt;
* [[:Kategorie:EMS Components|EMS]], [[:Kategorie:FHT Components|FHT]], [[:Kategorie:HMS Components|HMS]] Komponenten&lt;br /&gt;
* [[:Kategorie:1-Wire|1-Wire System]]&lt;br /&gt;
* [[:Kategorie:EIB/KNX|EIB/KNX Komponenten]]&lt;br /&gt;
* [[:Kategorie:FS20 Components|FS20 Komponenten]]&lt;br /&gt;
* [[:Kategorie:EnOcean Components|EnOcean Komponenten]]&lt;br /&gt;
* [[:Kategorie:HomeMatic Components|HomeMatic Komponenten]]&lt;br /&gt;
* [[:Kategorie:MAX|MAX! Komponenten]]&lt;br /&gt;
* [[:Kategorie:panStamp|panStamp Komponenten]]&lt;br /&gt;
* [[:Kategorie:Z-Wave Components|Z-Wave Komponenten]]&lt;br /&gt;
* [[:Kategorie:ZigBee|Zigbee Komponenten]]&lt;br /&gt;
* [[:Kategorie:IP Components|Geräte mit Webinterface (&amp;quot;IP&amp;quot;)]]&lt;br /&gt;
* [[:Kategorie:Other Components|Andere Komponenten / Sonstige Systeme]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[:Kategorie:Hardware|Alle Hardware-Kategorien]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 5; background-color:#F8F8FF;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Ideen und Lösungen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[:Kategorie:Code_Snippets|Verschiedene kommentierte Lösungen und Code-Schnippsel]]&lt;br /&gt;
* [[:Kategorie:Examples|Beispielanwendungen - Hardwarelösungen - Fremdsystemanbindungen]]&lt;br /&gt;
* [[Anwendungsszenarien]]&lt;br /&gt;
* [[Trick der Woche|Tipp der Woche]]&lt;br /&gt;
* [[Wie kann ich...]]?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[:Kategorie:FHEM|FHEM-Haupt-Kategorien]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 7; background-color:#FFFFE7;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Developers Corner&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Informationen zur Modul-Entwicklung:&lt;br /&gt;
** [[DevelopmentModuleIntro|Development Module Introduction]]&lt;br /&gt;
** [[DevelopmentModuleAPI|Development Module API]]&lt;br /&gt;
** [[DevelopmentFHEMWEB-API|Development FHEMWEB API]]&lt;br /&gt;
** [[Blocking Call]]&lt;br /&gt;
** [[CoProcess]]&lt;br /&gt;
** [[HttpUtils]]&lt;br /&gt;
** [[DevIo]]&lt;br /&gt;
** [[Meta]]&lt;br /&gt;
** [[Guidelines zur Dokumentation]]&lt;br /&gt;
** [[DevelopmentGuidelinesAV|Development Guidelines AV-Module]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Organisatorisches:&lt;br /&gt;
** [[How to write a patch]]&lt;br /&gt;
** [[SVN Nutzungsregeln]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;[[:Kategorie:Development|Alle Artikel zu Development]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 3; background-color:#d7ffff;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;FHEM Wiki News&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:20em;overflow:scroll;overflow-x:hidden;&amp;quot;&amp;gt;{{FHEMWiki_News}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[FHEMWiki:News|News]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 2; background-color:#e7f8ff;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Was ist FHEM Wiki?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;FHEM Wiki&#039;&#039;&#039; ergänzt die stets tagesaktuelle, von den zuständigen Entwicklern gepflegte {{Link2CmdRef}} (Befehls-Referenz) um weitergehende Informationen rund um FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.&lt;br /&gt;
&lt;br /&gt;
Das FHEMWiki stellt neben der {{Link2CmdRef}}, dem [http://forum.fhem.de/ Forum] und der [http://www.fhem.de FHEM] Seite die zentrale Informationsquelle rund um FHEM dar. Bedeutung und Zusammenspiel dieser Elemente [[Dokumentationsstruktur|ist hier]] erläutert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- {{NUMBEROFUSERS}} [[Special:Listusers|Benutzer]] haben sich seit Mai 2013 registriert und {{NUMBEROFARTICLES}} Artikel geschrieben. ({{NUMBEROFEDITS}} Seitenänderungen bislang).--&amp;gt;&lt;br /&gt;
Bitte [[FHEMWiki:Support | unterstütze uns]] und hilf, [[:Kategorie:NeedsEditing| das Wiki zu erweitern]]. Vielen Dank!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[FHEMWiki:Über_FHEMWiki|über FHEMWiki]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 8; background-color:#F8F8FF;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Letzte Änderungen&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:small;color:black;&amp;quot;&amp;gt;&amp;lt;small&amp;gt;{{Special:Recentchanges/8}}&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[Special:Recentchanges|Änderungen]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 9; flex: 1 1 80%; background-color:#FFFFAA;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Die letzten fünf neuen Seiten&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;small&amp;gt;{{Special:NewPages/5}}&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;&amp;lt;small&amp;gt;&#039;&#039;&#039;Mehr [[Special:NewPages|Neue Seiten]]&#039;&#039;&#039;&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpagebox&amp;quot; style=&amp;quot;order: 10; background-color:#DDD68F;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Administratives zum Wiki&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Allgemeine Aktivitäten:&#039;&#039;&lt;br /&gt;
* Registrierung zur Mitarbeit: wende Dich bitte an einen [[FHEMWiki:Administratoren|Administrator]]&lt;br /&gt;
* Basiswissen über die Mitarbeit an einem Wiki erarbeiten ([http://de.wikipedia.org/wiki/Wikipedia:Beteiligen z.B. Wikipedia])&lt;br /&gt;
* Erweiterung und Korrektur von Artikeln, wo immer nötig&lt;br /&gt;
* Ein(ig)e der [[Spezial:Gewünschte Seiten|gewünschten Seiten]] erstellen &lt;br /&gt;
* Ideen aus dem [http://forum.fhem.de Forum] in bestehende oder neue Artikel einarbeiten&lt;br /&gt;
* [[Spezial:Verwaiste Seiten|verwaiste Seiten]] in sinnvoller Weise verlinken&lt;br /&gt;
* [[Spezial:Sackgassenseiten|Sackgassenseiten]] wikifizieren (Links auf andere Seiten einfügen)&lt;br /&gt;
* [[Datei:Info_red.png|20px]] &#039;&#039;&#039;Tips / Regeln / Hinweise auf &amp;quot;[[FHEMWiki:Über FHEMWiki|Über FHEMWiki]]&amp;quot; beachten!&#039;&#039;&#039; [[Datei:Info_red.png|20px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sonstiges:&#039;&#039;&lt;br /&gt;
* Zum Ausprobieren bitte die [[FHEMWiki:Sandbox]] benutzen&lt;br /&gt;
* [//meta.wikimedia.org/wiki/Help:Contents Wiki Benutzerhandbuch].&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Wiki-Konfigurationsvariablen]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [[FHEMWiki:Interna|Internes zu diesem Wiki]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- Ende der Flexbox --&amp;gt;&lt;br /&gt;
[[Kategorie:FHEM]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30950</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30950"/>
		<updated>2019-07-11T12:49:50Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul bereits geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch die in FHEM bereits bekannten) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
=encoding utf8&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use FHEM::Meta;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return FHEM::Meta::InitMod( __FILE__, $hash );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	return $@ unless ( FHEM::Meta::SetInternals($hash) );&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30949</id>
		<title>Meta</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Meta&amp;diff=30949"/>
		<updated>2019-07-11T12:49:01Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Die Seite wurde neu angelegt: „= Development Module and Package Meta Data =   == Einleitung ==  Neben den für ein FHEM Modul notwendigen obligatorischen Metadaten…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Development Module and Package Meta Data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Neben den für ein FHEM Modul notwendigen [[DevelopmentModuleIntro|obligatorischen]] Metadaten (CommandRef, Kurzbeschreibung, Typ), gibt es in FHEM das Perl Package FHEM::Meta (oder kurz Meta.pm). Die Einbindung in ein FHEM Modul (= stellt Devices zur Verfügung) oder ein FHEM Package (= stellt Subroutinen für ein oder mehrere FHEM Module bereit) ermöglicht es, Informationen über das Modul in Form eines JSON [https://perldoc.perl.org/perlpod.html Pod] (auch META.json genannt) direkt in die Datei mit einzubetten. Darüber wird es möglich, diese Zusatzinformationen auch bereits auszuwerten und anzuzeigen, ohne dass ein Modul bereits geladen oder verwendet wird. Beispielsweise kann ermittelt werden, welche Perl Module für die Nutzung des Moduls notwendig sind und ob eine bestimmte Version vorausgesetzt wird. Außerdem können Informationen über die Version des Moduls, die Historie, den Autor, für Supportanfragen und vieles weiteres hinterlegt werden.&lt;br /&gt;
&lt;br /&gt;
Das Grundschema für die JSON Struktur basiert dabei auf der offiziellen [https://metacpan.org/pod/CPAN::Meta::Spec CPAN::Meta::Spec] Spezifikation, welche auch bei regulär veröffentlichten Perl Modulen verwendet wird. Das FHEM::Meta Package hilft dabei, diese JSON Informationen aus der Datei auszulesen und stellt diese im globalen %modules Hash des jeweiligen Moduls zur weiteren Verarbeitung bereit. Meta wertet dabei die in der Moduldatei (bei Modulen, die im SVN veröffentlicht sind, auch die in FHEM bereits bekannten) hinterlegten Maintenance und Supportdaten aus, so dass diese Informationen für sämtliche FHEM Module grundsätzlich bereitgestellt werden können. Meta erweitert die Standard Spezifikation dafür mit eigenen JSON Attributen, die spezifikationskonform im Namen mit &amp;lt;code&amp;gt;x_&amp;lt;/code&amp;gt; beginnen. Diese Art, zusätzliche Informationen über die Funktionalität eines Modules bereitzustellen, ohne dass ein Modul dafür tatsächlich geladen werden muss, steht jedem Modul als Erweiterung zur Verfügung. Es ist also denkbar, dass Module darüber bekanntmachen, welche Netzwerk-Protokolle sie beherrschen, wie bestimmte Geräte im Netzwerk gefunden werden können und mit welchen define-Parametern ein Gerät in FHEM angelegt werden kann. Hierzu gibt es erste Ansätze, die sich in [https://forum.fhem.de/index.php/topic,67368.0.html Planung] befinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der FHEM Installer ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Installer ist ein FHEM Modul, welches ein graphisches Interface für die Metadaten bereitstellt. Mit Hilfe des FHEM Installers werden die Metadaten auch für Module in den Speicher geladen, welche keine explizite Unterstützung eingebaut haben. Sobald man die Informationen für ein bestimmtes Modul oder Package abfragt, wird der Meta-Hash über die Funktion FHEM::Meta::Load() geladen. Für FHEM Module, die beim Start von FHEM bereits in Verwendung sind, werden die Metadaten automatisch im Voraus geladen, so dass sie zur Laufzeit zur Verfügung stehen. Es ist geplant, dass dies auch zur Laufzeit für Module, für die der Benutzer ein neues Device anlegt, geschieht.&lt;br /&gt;
&lt;br /&gt;
Die Grundfunktion des FHEM Installer ist jedoch nicht die Bereitstellung der Metadaten, sondern die Auswertung derselben. In seiner weiteren Entwicklung soll er dabei unterstützen fehlende Systemkomponenten, die für die Nutzung eines FHEM Moduls notwendig sind, zu installieren und aktuell zu halten. Die Installation und Aktualisierung von Perl Modulen ist bereits jetzt in einer ersten Ausbaustufe möglich.&lt;br /&gt;
&lt;br /&gt;
Stellt man am FHEM Installer Device das Attribut &amp;lt;code&amp;gt;installerMode&amp;lt;/code&amp;gt; auf developer, dann werden einige weitere Get Befehle sichtbar, über die sich auch der Inhalt des kummulierten META.json Hashes anzeigen lässt. Dies ist oft hilfreich für ein initiales Verständnis, welche Informationen FHEM::Meta bereits über ein Modul gesammelt hat, bevor man diese über einen eigenen META.json Pod in der Moduldatei ergänzen oder verändern möchte.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Weiterentwicklung von FHEM::Meta ist stark an die weitere Entwicklung des FHEM Installer geknüpft. Dort geht es dann insbesondere darum, dass FHEM Module aus anderen Installationsquellen neben dem SVN die gleiche Metadaten einliefern können, insbesondere was Versionierung und Historie angehen. Dieses und mehr ist jedoch ein ganz eigenes Kapitel und soll deshalb für das Thema FHEM::Meta nur kurz erwähnt sein.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der search-Befehl ==&lt;br /&gt;
&lt;br /&gt;
Der FHEM Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; ist ein Wrapper, um den Get-Befehl &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; beim FHEM Installer Device im Schnellzugriff über die FHEM Befehlszeile aufzurufen. Hierüber lassen sich die Metadaten aller FHEM Module durchsuchen und ermöglicht so das Auffinden von FHEM Modulen für eine bestimmte Funktion oder ein Gebiet. FHEM Module, die einen META.json Pod bereitstellen, können dort Schlagworte hinterlegen, über die das Modul in der Suche gefunden werden können soll. FHEM::Meta generiert für Module, die über das SVN bereitgestellt werden, bereits einige Schlagworte basierend auf dem hinterlegten Support Forum in MAINTAINER.txt. Auch Der Modul Typ (helper|device|command) findet sich als eigenes Schlagwort wieder. Man erhält also Out-of-the-Box bereits eine ziemlich gute Kategorisierung über den Anwendungsbereich eines bestimmten Moduls und welche anderen Module noch in diesen Bereich fallen. Ein Modulname alleine hingegen lässt oftmals nicht auf die Funktionalität dahinter schließen, insbesondere wenn Hersteller- oder Produktnamen eine Rolle spielen, die man selbst bisher nicht kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Erweiterung eines FHEM Moduls mit META.json Pod ==&lt;br /&gt;
&lt;br /&gt;
Möchte ein Modulautor aktiven Support FHEM::Meta einbauen, dann ist der erste Schritt die Bereitstellung eines META.json Abschnitts am Ende der Modul- oder Paketdatei. Dieser Abschnitt beinhaltet ein reguläres JSON Objekt. Deshalb empfiehlt es sich den Abschnitt vor dem hinzufügen über einen JSON Validator auf seine Syntax zu überprüfen. Ansonsten wird von FHEM::Meta beim laden eine entsprechende Meldung im FHEM Log ausgegeben und es werden keinerlei Metadaten mehr über das Modul bereitgestellt. Sobald ein META.json Abschnitt vorhanden ist, geht FHEM::Meta davon aus, dass dieses maßgeblich ist und wird deshalb nur noch Daten ergänzen, die dort nicht enthalten sind. Fehlt also ein valides META.json Objekt als Basis, so werden auch diese Ergänzungen nicht erfolgen und der Modulautor muss zunächst zwingend das JSON Gerüst korrigieren.&lt;br /&gt;
&lt;br /&gt;
Für das Hinzufügen des META.json Abschnitts kann man mit der Beispieldatei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.txt contrib/META.json.txt] als Ausgangsbasis starten. Die oben erwähnte Spezifikation sollte man einmal gelesen haben um zu verstehen, welches Format für ein Datenfeld gilt und welche Angaben die Spezifikation als zwingend vorschreibt. Es ist empfehlenswert alle dort als &#039;&#039;mandatory&#039;&#039; erwähnten Angaben in META.json anzugeben, auch wenn diese Informationen vielleicht teilweise in anderen Dateien in FHEM bereits vorhanden sind (gilt natürlich nur für Module, die auch über das SVN verteilt werden). Beispielsweise sollte eine (Kurz-)Beschreibung trotzdem enthalten sein. Der Grund ist, dass zumindest theoretisch dann auch andere 3rd-party Tools, die mit Perl Modulen hantieren, diese Informationen in vereinfachter Art ebenfalls auslesen und auswerten können. Diese Tools könnten darauf bestehen, dass sie eben diese als zwingend spezifizierten Attribute dort auch vorfinden. FHEM::Meta fügt fehlende Informationen zwar zur Laufzeit selbst hinzu, dies hilt jedoch anderen Tools, die das JSON Objekt direkt auswerten, eben nicht. Wie genau ein Modulautor dieser Empfehlung folgen möchte, ist ihm überlassen.&lt;br /&gt;
&lt;br /&gt;
Die Inhalte aus der Beispieldatei oben sollten als Mindestvoraussetzung angesehen werden. Insbesondere der Abschnitt &amp;lt;code&amp;gt;prereqs&amp;lt;/code&amp;gt; für verwendete Perl Module ist hier wichtig, da das Vorhandensein eines selben eine wesentlich schnellere Ladezeit der Metainformationen zur Folge hat, da die Abhängigkeiten nicht durch eine Analyse erfolgen muss. Das bedeutet jedoch auch, dass diese Informationen vollständig sein müssen und der Autor dafür verantwortlich ist, das diese stimmig sind. Als Hilfestellung, was man hier für sein Modul eintragen sollte, kann man sichüber den FHEM Installer im oben erwähnten Developer-Modus das über das Analyse-Verfahren erzeugte META.json ansehen und dort den entsprechenden prereqs Abschnitt kopieren. Im Grunde werden dort alle &amp;quot;use&amp;quot; und &amp;quot;require&amp;quot; Aufrufe, die ein Modul macht, aufgeführt. Das schließt auch den Aufruf von Perl Builtin Funktionen wie &amp;quot;use strict;&amp;quot; oder ähnliches ein. Es ist empfehlenswert diese hier ebenfalls mit aufzuführen. Über die Metadaten kann man dann auch als FHEM Entwickler entsprechende Statistiken über die Code/Modul Qualität (so man die Nutzung von &amp;quot;use strict;&amp;quot; denn beispielhaft als positiv wirkend interpretieren möchte) fahren.&lt;br /&gt;
&lt;br /&gt;
Hat man das JSON Objekt für sein Modul nun also fertig, dann kopiert man es in seine Moduldatei &#039;&#039;hinter&#039;&#039; den letzten commandRef Abschnitt und &#039;&#039;vor&#039;&#039; der Schlussformel &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt;. Dabei wird das META.json Objekt von folgender Markierung umschlossen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=for :application/json;q=META.json &#039;&#039;&#039;00_myModule.pm&#039;&#039;&#039;&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei ist 00_myModule.pm durch den Dateinamen der jeweiligen Moduldatei zu ersetzen. Auf diese Weise wird sichergestellt, dass eine Metainformation auch wirklich zu genau dieser Moduldatei dazugehört.&lt;br /&gt;
Alle Informationen innerhalb des META.json sind im UTF-8 Format. Dies machen wir deshalb zusätzlich nochmals zum Beginn des &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; Abschnitts &#039;&#039;vor&#039;&#039; dem ersten CommandRef Eintrag deutlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
=pod&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;=encoding utf8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=for :application/json;q=META.json 00_myModule.pm&lt;br /&gt;
{ ... }&lt;br /&gt;
=end :application/json;q=META.json&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Beispiel, wie sich der META.json Abschnitt in eine Moduldatei einfügt, zeigt die Datei [https://svn.fhem.de/trac/browser/trunk/fhem/contrib/META.json.full.txt contrib/META.json.full.txt].&lt;br /&gt;
Für Fortgeschrittene sind dort außerdem weitere Beispieleinträge für Metadaten, die der FHEM Installer auswerten und verarbeiten kann.&lt;br /&gt;
&lt;br /&gt;
Hat man nun also den META.json Abschnitt ordnungsgemäß hinzugefügt, kann man mit Hilfe des FHEM Installer überprüfen, ob die Daten richtig hinterlegt worden sind und geladen werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eigenständiges Laden der Metadaten aus einem FHEM Modul heraus ==&lt;br /&gt;
&lt;br /&gt;
Ein FHEM Modul kann selbstständig die Unterstützung für das Laden der Metadaten in den %modules Hash einbauen, um diese unabhängig vom FHEM Installer zur Verfügung zu haben.&lt;br /&gt;
Hierfür muss am Beginn der Moduldatei zunächst &amp;lt;code&amp;gt;use FHEM::Meta;&amp;lt;/code&amp;gt; hinzugefügt werden und die &amp;lt;code&amp;gt;X_Initialize();&amp;lt;/code&amp;gt; Funktion am Ende um einen Initialisierungsaufruf erweitert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;use FHEM::Meta;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	&#039;&#039;&#039;return FHEM::Meta::InitMod( __FILE__, $hash );&#039;&#039;&#039;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden dann beim Initialisieren des Moduls nach $modules{&amp;lt;TYPE&amp;gt;}{META} geladen und stehen dort bereit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Anzeigen der Modulversion über FHEM::Meta ==&lt;br /&gt;
&lt;br /&gt;
Im META.json Objekt kann eine Version des Moduls explizit in [https://semver.org/ semantischer Form] (beispielsweise v1.2.3) angegeben werden. Ist dies nicht der Fall, dann generiert FHEM::Meta eine eigene Versionsnummer auf Basis der Revisionsnummer aus dem Subversion Repository im &amp;lt;code&amp;gt;$Id$&amp;lt;/code&amp;gt; Abschnitt der Moduldatei. Dies gilt jedoch nur für Module, die auch tatsächlich über das SVN verteilt werden, ansonsten wird dieser Abschnitt ignoriert. Durch die Angabe der Versionsnummer im META.json Objekt wird es somit erstmals möglich, dass auch Module außerhalb des SVN mit einer einheitlichen Art der Versionierung auftreten können.&lt;br /&gt;
Eine semantische Versionsnummer wird von FHEM::Meta automatisch über die Perl Builtin Module version in einen Float Wert umgewandelt, um nummerische Vergleiche zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
FHEM::Meta bietet eine Funktion, um die essentiellen Metadaten zum Versionsstand eines Moduls als Internal mit dem Namen FVERSION anzuzeigen. Dafür kann man an den Beginn der &amp;lt;code&amp;gt;X_Define()&amp;lt;/code&amp;gt; Funktion folgenden Aufruf setzen:&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	&#039;&#039;&#039;return $@ unless ( FHEM::Meta::SetInternals($hash) );&#039;&#039;&#039;&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum aktuellen Zeitpunkt wird hierdurch lediglich das Internal FVERSION gesetzt. Dieses sieht dann beispielsweise so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
00_myModule.pm:v0.5.6-s19500/2019-05-30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Informationen sind hier verpackt:&lt;br /&gt;
* Dateiname des Moduls inkl. Präfix&lt;br /&gt;
* semantische Version (version-Attribut in META.json vorhanden)&lt;br /&gt;
* Subversion Revision (-s steht für &amp;quot;Subversion&amp;quot;, danach folgt die Revisionsnummer des jeweiligen Commits)&lt;br /&gt;
* das Release Datum (hier konkret das Check-in Datum in das SVN)&lt;br /&gt;
&lt;br /&gt;
Für Module außerhalb des SVN werden diese Informationen entsprechend anders zusammengetragen oder müssen/können über das META.json Objekt bereitgestellt werden.&lt;br /&gt;
Hierbei ist zu erwähnen, dass ein FHEM Modul erst dann als dem SVN zugehörig angesehen wird, wenn es einen Eintrag in MAINTAINER.txt hat. Fehlt dieser Eintrag, dann wird das Modul nicht als FHEM Core Modul behandelt, sondern als externes 3rd-party Modul.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Modul_Astro&amp;diff=30804</id>
		<title>Modul Astro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Modul_Astro&amp;diff=30804"/>
		<updated>2019-06-22T09:08:25Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul stellt astronomische Daten zur Verfügung (etwa Sonnenauf- und Untergänge)&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=Astro&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=95_Astro.pm&lt;br /&gt;
|ModOwner=Prof. Dr. Peter A. Henning&lt;br /&gt;
}}&lt;br /&gt;
Diese Seite beschreibt die Konfiguration und Verwendung des Moduls 95_Astro.pm.&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Das Modul &#039;&#039;95_Astro.pm&#039;&#039; stellt astronomische Daten zur Verfügung (etwa Sonnenauf- und Untergänge). Die Berechungen sind für den Zeitraum 1900 - 2100 gültig.&lt;br /&gt;
&lt;br /&gt;
Ein SVG-Bild der gegenwärtigen Mondphase gibt es unter dem Link&lt;br /&gt;
  &amp;amp;lt;ip addresse von fhem&amp;amp;gt;/fhem/Astro_moonwidget?name=&#039;&amp;amp;lt;device name&amp;amp;gt;&#039;&lt;br /&gt;
Optionale Web-Parameter sind &lt;br /&gt;
 [&amp;amp;amp;size=&#039;&amp;amp;lt;width&amp;amp;gt;x&amp;amp;lt;height&amp;amp;gt;&#039;]&lt;br /&gt;
 [&amp;amp;amp;mooncolor=&amp;amp;lt;color&amp;amp;gt;]&lt;br /&gt;
 [&amp;amp;amp;moonshadow=&amp;amp;lt;color&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;li&amp;gt;Calculations are only valid between the years 1900 and 2100&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;Attention: Timezone is taken from the local Perl settings, NOT automatically defined for a location&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;This module uses the global attribute &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; to determine its output data&amp;lt;br/&amp;gt;&lt;br /&gt;
         (default: EN=english). For German output set &amp;lt;code&amp;gt;attr global language DE&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;The time zone is determined automatically from the local settings of the &amp;lt;br/&amp;gt;&lt;br /&gt;
        operating system. If geocordinates from a different time zone are used, the results are&amp;lt;br/&amp;gt;&lt;br /&gt;
        not corrected automatically.&lt;br /&gt;
==Definition==&lt;br /&gt;
Ein Astro-Device wird definiert durch &lt;br /&gt;
 define &amp;lt;name&amp;gt; Astro&lt;br /&gt;
Dieses Modul verwendet das globale Attribut language zur Bestimmung der Anzeigedaten (Standard: EN=english). Für deutsche Ausgabedaten muss in FHEM das Attribut&lt;br /&gt;
  attr global language DE&lt;br /&gt;
gesetzt werden. &lt;br /&gt;
==Position des Beobachters==&lt;br /&gt;
Das Modul verwendet verschiedene Attribute zur Bestimmung der Beobachterdefinition, die im &#039;&#039;global&#039;&#039;-Device von FHEM abgelegt sein sollten:&lt;br /&gt;
  attr global longitude &amp;amp;lt;value&amp;amp;gt; &lt;br /&gt;
  attr global latitude &amp;amp;lt;value&amp;amp;gt; &lt;br /&gt;
  attr global altitude &amp;amp;lt;value&amp;amp;gt;&lt;br /&gt;
Die beiden ersten Angaben erfolgen in Dezimalgrad, die dritte Angabe ist die Höhe in Metern über dem Meeresspiegel. Globale Definitionen dieser Werte werden nur verwendet, wenn keine lokalen Attribute mit diesen Namen vorhanden sind (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Die Zeitzone wird nicht automatisch eingestellt, sondern aus der lokalen Perl-Installation bezogen.&lt;br /&gt;
&lt;br /&gt;
==Ausgabedaten==&lt;br /&gt;
Readings mit dem Präfix &amp;lt;i&amp;gt;Sun&amp;lt;/i&amp;gt; beziehen sich auf die Sonne, solche mit dem Präfix &amp;lt;i&amp;gt;Moon&amp;lt;/i&amp;gt; auf den Mond.&lt;br /&gt;
*&amp;lt;i&amp;gt;Age&amp;lt;/i&amp;gt; = Winkel (in Dezimalgrad) des Körpers auf seiner Bahn&lt;br /&gt;
*&amp;lt;i&amp;gt;Az,Alt&amp;lt;/i&amp;gt; = Azimuth und Höhe (in Dezimalgrad) des Körpers über dem Horizont&lt;br /&gt;
*&amp;lt;i&amp;gt;Dec,Ra&amp;lt;/i&amp;gt; = Deklination und Rektaszension (in HH:MM) der Position des Körpers&lt;br /&gt;
*&amp;lt;i&amp;gt;Lat,Lon&amp;lt;/i&amp;gt; = geografische Breite und Länge der Position des Körpers&lt;br /&gt;
*&amp;lt;i&amp;gt;Diameter&amp;lt;/i&amp;gt; = Virtueller Durchmesser des Körpers in Bogenminuten&lt;br /&gt;
*&amp;lt;i&amp;gt;Distance,DistanceObserver&amp;lt;/i&amp;gt; = Entfernung (in km) des Körpers zum Erdmittelpunkt oder zum Beobachter &lt;br /&gt;
*&amp;lt;i&amp;gt;PhaseN,PhaseS&amp;lt;/i&amp;gt; = Nummerischer Wert und Stringwert für die Phase des Körpers&amp;lt;/li&amp;gt;&lt;br /&gt;
*&amp;lt;i&amp;gt;Sign&amp;lt;/i&amp;gt; = Tierkreiszeichen des Körpers auf seiner Bahn&lt;br /&gt;
*&amp;lt;i&amp;gt;Rise,Transit,Set&amp;lt;/i&amp;gt; = Zeiten (in HH:MM) für Aufgang, höchsten Punkt (Transit) und Untergang des Körpers&lt;br /&gt;
 &lt;br /&gt;
Readings mit dem Präfix &amp;lt;i&amp;gt;Obs&amp;lt;/i&amp;gt; beziehen sich auf den Beobachter&lt;br /&gt;
&lt;br /&gt;
Weitere Readings umfassen&lt;br /&gt;
*&amp;lt;i&amp;gt;Date,Dayofyear&amp;lt;/i&amp;gt; = Datum&lt;br /&gt;
*&amp;lt;i&amp;gt;JD&amp;lt;/i&amp;gt; = Julianisches Datum&lt;br /&gt;
*&amp;lt;i&amp;gt;Season,SeasonN&amp;lt;/i&amp;gt; = Stringwert und nummerischer Wert für die Jahreszeit&lt;br /&gt;
*&amp;lt;i&amp;gt;Time,Timezone&amp;lt;/i&amp;gt; raten Sie mal...&lt;br /&gt;
*&amp;lt;i&amp;gt;IsDST&amp;lt;/i&amp;gt; = 1 wenn Sommerzeit gilt, 0 sonst&lt;br /&gt;
*&amp;lt;i&amp;gt;GMST,LMST&amp;lt;/i&amp;gt; = Greenwich und Local Mean Sidereal Time (in HH:MM)&lt;br /&gt;
&lt;br /&gt;
=Bedienung=&lt;br /&gt;
==Get==&lt;br /&gt;
Achtung: Die Ergebnisse von Get-Aufrufen werden nicht in die Readings geschrieben, sondern nur die Ergebnisse zyklischer Updates. Das dient dazu, schnell und ohne Readings spezielle Datenwerte (etwa für andere Zeiten oder Orte) zu generieren. Möglichkeiten für Aufrufe:&lt;br /&gt;
 get &amp;amp;lt;name&amp;amp;gt; json [&amp;amp;lt;reading&amp;amp;gt;]&lt;br /&gt;
 get &amp;amp;lt;name&amp;amp;gt; json [&amp;amp;lt;reading&amp;amp;gt;] YYYY-MM-DD&lt;br /&gt;
 get &amp;amp;lt;name&amp;amp;gt; json [&amp;amp;lt;reading&amp;amp;gt;] YYYY-MM-DD HH:MM:[SS]&lt;br /&gt;
liefert JSON-Code für den kompletten Datensatz oder nur einen Datenwert der astronomischen Daten entweder für die gegenwärtige Zeit, oder für ein Datum und eine Zeit im Argument. &lt;br /&gt;
 get &amp;amp;lt;name&amp;amp;gt; text [&amp;amp;lt;reading&amp;amp;gt;]&lt;br /&gt;
 get &amp;amp;lt;name&amp;amp;gt; text [&amp;amp;lt;reading&amp;amp;gt;] YYYY-MM-DD&lt;br /&gt;
 get &amp;amp;lt;name&amp;amp;gt; text [&amp;amp;lt;reading&amp;amp;gt;] YYYY-MM-DD HH:MM:[SS]&lt;br /&gt;
liefert Text für den kompletten Datensatz oder nur einen Datenwert der astronomischen Daten entweder für die gegenwärtige Zeit, oder für ein Datum und eine Zeit im Argument.                 &lt;br /&gt;
 get &amp;amp;lt;name&amp;amp;gt; version &lt;br /&gt;
zeigt die aktuelle Modulversion an.&lt;br /&gt;
&lt;br /&gt;
==Attribute==     &lt;br /&gt;
  attr &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;interval&amp;amp;gt;&lt;br /&gt;
Update-Interval in Sekunden. Default sind 3600 Sekunden, ein Wert 0 verhindert das periodische Update.&lt;br /&gt;
Das Astro-Module verwendet verschiedene Attribute zur Bestimmung der Beobachterdefinition, die entweder im &#039;&#039;global&#039;&#039;-Device von FHEM abgelegt sein sollten (siehe oben), oder als lokale Attribute gespeichert sind:&lt;br /&gt;
  attr &amp;amp;lt;name&amp;amp;gt; longitude &amp;amp;lt;value&amp;amp;gt; &lt;br /&gt;
  attr &amp;amp;lt;name&amp;amp;gt; latitude &amp;amp;lt;value&amp;amp;gt; &lt;br /&gt;
  attr &amp;amp;lt;name&amp;amp;gt; altitude &amp;amp;lt;value&amp;amp;gt;&lt;br /&gt;
Die beiden ersten Angaben erfolgen in Dezimalgrad, die dritte Angabe ist die Höhe in Metern über dem Meeresspiegel. &lt;br /&gt;
  attr  &amp;amp;lt;name&amp;amp;gt;  horizon &amp;amp;lt;value&amp;amp;gt;&lt;br /&gt;
Nutzerdefinierter Horizontwinkel in Dezimalgrad, Defaulwert 0°&lt;br /&gt;
&lt;br /&gt;
=Verwendung ohne Astro-Device=&lt;br /&gt;
Es ist nicht notwendig, für die gelegentliche Verwendung der astronomischen Daten ein Device zu definieren. Es muss lediglich das Modul geladen werden, z.B. durch den Perl-Code&lt;br /&gt;
  LoadModule(&amp;quot;Astro&amp;quot;);&lt;br /&gt;
Die Verwendung von &#039;&#039;require&#039;&#039; wird nicht empfohlen, da je nach Konstellation dabei Warnmeldungen im Logfile ausgegeben werden können.&lt;br /&gt;
Dann kann man z.B. durch den Code&lt;br /&gt;
  my $somehash&lt;br /&gt;
  Astro_Get( $somehash,&amp;quot;somehash&amp;quot;,&amp;quot;text&amp;quot;, &amp;quot;SunRise&amp;quot;,&amp;quot;2019-12-24&amp;quot;);&lt;br /&gt;
den Sonnenuntergang an Heiligabend 2019 berechnen.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;Astro_Get&#039;&#039; bekommt im ersten Argument eine hash-Referenz übergeben, die auch leer sein kann. Wenn sie aber nicht leer ist, versucht das Modul, sich die notwendigen Attribute aus diesem Hash zu holen (etwa geografische Länge und Beite). Es kann z.B. ein beliebiges Dummy-Device angelegt werden, sagen wir mit dem Namen &amp;quot;Blabla&amp;quot;. Gibt man diesem als Attribut einen Horizontwinkel, oder andere Geodaten, kann man mit &lt;br /&gt;
  Astro_Get( $defs{&amp;quot;Blabla&amp;quot;},&amp;quot;Blabla&amp;quot;,&amp;quot;text&amp;quot;, &amp;quot;CustomTwilightEvening&amp;quot;,&amp;quot;2019-12-24&amp;quot;);&lt;br /&gt;
den Sonnenuntergang für diesen Horizontwinkel erhalten. Natürlich geht auch&lt;br /&gt;
  Astro_Get( $defs{&amp;quot;global&amp;quot;},&amp;quot;global&amp;quot;,&amp;quot;text&amp;quot;, &amp;lt;reading&amp;gt;,&amp;lt;datum&amp;gt; );&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Tradfri&amp;diff=29847</id>
		<title>Tradfri</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Tradfri&amp;diff=29847"/>
		<updated>2019-03-11T00:18:03Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Die Seite wurde neu angelegt: „Das Modul wird hier beschrieben: TRÅDFRI“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Modul wird hier beschrieben:&lt;br /&gt;
[[TRÅDFRI]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Siri&amp;diff=29846</id>
		<title>Siri</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Siri&amp;diff=29846"/>
		<updated>2019-03-11T00:16:45Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Die Seite wurde neu angelegt: „Die Funktionsweise wird hier beschrieben: Homebridge_einrichten“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Funktionsweise wird hier beschrieben:&lt;br /&gt;
[[Homebridge_einrichten]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa&amp;diff=29845</id>
		<title>Alexa</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa&amp;diff=29845"/>
		<updated>2019-03-10T21:13:20Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt zwei Betriebsmodi für das alexa Modul, die separat beschrieben sind:&lt;br /&gt;
&lt;br /&gt;
# Public FHEM Connector Skill: [[FHEM_Connector]]&lt;br /&gt;
# Private Skills: [[Alexa-Fhem|alexa-fhem]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Alexa&amp;diff=29844</id>
		<title>Alexa</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Alexa&amp;diff=29844"/>
		<updated>2019-03-10T21:12:20Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Die Seite wurde neu angelegt: „Es gibt zwei Betriebsmodi für das alexa Modul, die separat beschrieben sind:  Public FHEM Connector Skill: FHEM_Connector Private Skills: Alexa-Fhem|ale…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt zwei Betriebsmodi für das alexa Modul, die separat beschrieben sind:&lt;br /&gt;
&lt;br /&gt;
Public FHEM Connector Skill: [[FHEM_Connector]]&lt;br /&gt;
Private Skills: [[Alexa-Fhem|alexa-fhem]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21233</id>
		<title>Weckautomation</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21233"/>
		<updated>2017-04-09T11:15:01Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Definition des Weckprogramms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Module ROOMMATE und GUEST können dazu genutzt werden, Bewohner und Gäste in FHEM als ein Device zu repräsentieren und durch Events deren Status zu erfassen bzw. zu ändern (beispielsweise durch das GEOFANCY Modul für [[Anwesenheitserkennung]]). Das zur Modulfamilie dazugehörige Modul RESIDENTS fasst die Status mehrerer Bewohner logisch zusammen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen unterstützen die Module auch bei der Erstellung einer Weckautomation, indem sie die Logik kapseln und häufig verwendete Standardfunktionen bereitstellen. Die Verwendung soll in diesem Artikel anhand eines Beispiels näher erläutert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Weckprogramm_Ergebnisdarstellung.png|500px|thumb|right|Darstellung der Beispiel-Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
== Was soll erreicht werden? ==&lt;br /&gt;
&lt;br /&gt;
Hier ein kurzer Überblick über die Funktionen, die wir am Ende realisiert haben werden:&lt;br /&gt;
&lt;br /&gt;
; 3 unterschiedliche Wecker&lt;br /&gt;
: 1 für Werktage Mo-Fr&lt;br /&gt;
: 1 für werktägliche Samstage&lt;br /&gt;
: 1 für Sonn- und Feiertage&lt;br /&gt;
; Automatischer Reset der Weckzeiten&lt;br /&gt;
: werktäglicher Wecker soll auf einen Standardwert zurückstellen, falls er mal verstellt wurde&lt;br /&gt;
: automatischer Reset des werktäglicher Weckers soll zeitweise abschaltbar sein&lt;br /&gt;
: nach einem Sonn- oder Feiertagen soll der automatische Reset des werktäglichen Weckers immer wieder eingeschaltet werden&lt;br /&gt;
: die Samstags- und Sonntags-Wecker sollen immer nach ihrer Ausführung resettet werden&lt;br /&gt;
; jeder Wecker startet ein Weckprogramm 30 Minuten vor der programmierten Zeit&lt;br /&gt;
: langsames hochfahren der Rollläden&lt;br /&gt;
: Wakeup Light über eine HUE Birne von Warmweiß/2000K zu Kaltweiß/5600K&lt;br /&gt;
: an Werktagen: Chillout Weckmusik wird langsam lauter gestellt&lt;br /&gt;
: Snooze Funktion über die SONOS Taste am Gerät an Werktagen (erneutes Play nach 5 Minuten)&lt;br /&gt;
: forciertes Aufstehen an Werktagen durch automatischen Wechsel des Bewohner Devices zu &amp;quot;awake&amp;quot; und dadurch starten der &amp;quot;aufgestanden sein&amp;quot; Prozesse (siehe unten)&lt;br /&gt;
; Starten des Weckprogramms nur bei tatsächlicher Anwesenheit des betroffenen Bewohners&lt;br /&gt;
; Ansage der Uhrzeit zur gewählten Weckzeit&lt;br /&gt;
; Prozess / Automation für:&lt;br /&gt;
: &amp;lt;u&amp;gt;bettfertig machen&amp;lt;/u&amp;gt;: Lichtszene setzen, Chillout Musik in Schlafzimmer und Badezimmer abspielen&lt;br /&gt;
: &amp;lt;u&amp;gt;schlafen legen&amp;lt;/u&amp;gt;: Ansage der eingestellten Weckzeit &amp;amp; Ausschalten aller Verbraucher&lt;br /&gt;
: &amp;lt;u&amp;gt;aufgestanden sein&amp;lt;/u&amp;gt;: Ansage Raumluftqualität, Wettervorhersage; Lokalradio einschalten und in Räume verteilen; Küchenlicht an, HUE in Schlafzimmer mit Aufwach-Farbtemperatur&lt;br /&gt;
; Berücksichtigung / Steuerung des Haus Modus&lt;br /&gt;
: Wechsel zwischen Morgen-, Tag-, Abend- und Nacht-Modus entsprechend der Schlafgewohnheiten (zusätzlich zur Tageszeit abhängigen Steuerung/Umschaltung, die hier aber nicht Thema sein soll)&lt;br /&gt;
; Statuswerte, Events, Readings und Funktionen:&lt;br /&gt;
: Wurde ein Wecker ausgelöst?&lt;br /&gt;
: Ist gerade ein Weckprogramm aktiv?&lt;br /&gt;
: Abbrechen/sofortiges beenden des Weckprogramms&lt;br /&gt;
: Verhindern von durch Fehlkonfiguration parallel ausgeführten Weckern für die selbe Person&lt;br /&gt;
: Welcher ist der nächste Wecker, der bis Mitternacht des nächsten Tages ausgeführt wird und wann ist das?&lt;br /&gt;
: Wann wurde ein Wecker zuletzt ausgeführt und welcher Wecker wurde überhaupt zuletzt ausgeführt?&lt;br /&gt;
: Wie viele Bewohner werden gerade geweckt?&lt;br /&gt;
: Wie viele Bewohner sind gerade aufgestanden?&lt;br /&gt;
: Schaltung bei erstem Bewohner, der geweckt wird&lt;br /&gt;
: Schaltung bei erstem Bewohner, der aufgestanden ist&lt;br /&gt;
; Statistik&lt;br /&gt;
: Wie lange dauerte der Schlaf des Bewohners?&lt;br /&gt;
: Wie lange war in dem Haus niemand wach?&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei zu erwähnen ist, dass die Prozesse so umgesetzt worden sind, dass Bewohner sowohl zeitgleich, als auch zeitversetzt oder komplett getrennt ins Bett gehen und aufwachen können.&lt;br /&gt;
Dafür werden einige Schaltungen pro Bewohner und dessen Schlafzimmer vorgenommen und andere erst dann, wenn die RESIDENTS Bewohnergruppe einen bestimmten Status erreicht hat.&lt;br /&gt;
&lt;br /&gt;
== Notwendige Devices anlegen ==&lt;br /&gt;
&lt;br /&gt;
=== RESIDENTS und ROOMMATE Devices ===&lt;br /&gt;
Wir starten mit einem RESIDENTS Device, um die Bewohner Status später logisch zusammenfassen zu können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define rgr_Bewohner RESIDENTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend legen wir pro Bewohner ein ROOMMATE Device an. Dafür verwenden wir eine Funktion, die in RESIDENTS eingebaut ist und die Devices korrekt untereinander verbindet (die Reihenfolge, in der RESIDENTS und ROOMMATE/GUEST Geräte definiert werden, sind hier entscheidend). Der Einfachheit halber definieren wir in diesem Beispiel nur einen Bewohner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rgr_Bewohner addRoommate Julian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wurde nun automatisch ein Device namens &amp;quot;rr_Julian&amp;quot; angelegt (abgeleitet aus dem angegebenen Vornamen aus dem addRoommate Befehl).&lt;br /&gt;
Anschließend setzen wir einmalig den initialen Status für die Bewohner mittels set Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der automatische Wechsel des Status bei Anwesenheit/Abwesenheit wird hier nicht weiter thematisiert, hier sei auf den Artikel [[Anwesenheitserkennung]] verwiesen, insbesondere den GEOFANCY Teil.&lt;br /&gt;
&lt;br /&gt;
=== Wecker Devices anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die Devices, über die die Weckzeit und das Auslöseverhalten eingestellt werden, sind eigentlich normale Dummy Devices. Das zugewiesene ROOMMATE/GUEST/RESIDENTS Device &amp;quot;versklavt&amp;quot; diese Geräte jedoch und führt bestimmte Befehle zur Wecksteuerung und -Verwaltung aus, sobald das Dummy-Device geändert wird. Der Vorteil dabei ist, dass man sich eine Menge eigenen Code und viele unterschiedliche Notify und Dummy Devices spart, was wiederum der Übersichtlichkeit zu Gute kommt.&lt;br /&gt;
&lt;br /&gt;
Wir legen nun unsere drei Wecker für unseren Beispiel Bewohner an. Dafür führen wir einfach 3 mal den selben Befehl hintereinander aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Logdatei erscheinen verschiedene Meldungen über alle automatisch angelegte Devices inkl. Name und Typ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015.03.28 12:19:49 3: RESIDENTStk rr_Julian_wakeuptimer1: new notify macro device Macro_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new at-device at_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_awoken created&lt;br /&gt;
2015.03.28 12:19:51 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new notify macro device Macro_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new at-device at_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new notify macro device Macro_rr_Julian_wakeuptimer3 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new at-device at_rr_Julian_wakeuptimer3 created&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Rückgabe in FHEMWEB erhält man eine Meldung wie diese hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dummy rr_Julian_wakeuptimer1 and other pending devices created and pre-configured. &lt;br /&gt;
You may edit Macro_rr_Julian_wakeuptimer1 to define your wake-up actions &lt;br /&gt;
and at_rr_Julian_wakeuptimer1 for optional at-device adjustments.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht wurden anfänglich eine ganze Menge von Notify-Macros und Watchdogs sowie ein at-Device pro Wecker angelegt.&lt;br /&gt;
Dabei sind vor allem die Macro-Devices und die Wecker Dummy Devices interessant. Hier werden Weck- und Auslöseverhalten konfiguriert. die at- und Watchdog-Devices können aber für fortgeschrittene Nutzer beliebig angepasst werden. Auch die Dummy Devices können bis auf wenige Ausnahmen (Attribut &amp;quot;userattr&amp;quot;) vollständig umkonfiguriert werden. Wer Devices umbenennt, sollte unbedingt darauf achten, dass auch das entsprechende Attribut im Wecker-Dummy-Device angepasst wird.&lt;br /&gt;
&lt;br /&gt;
Allen Devices ist ein entsprechender Kommentar hinzugefügt, der dessen Funktion kurz erklärt.&lt;br /&gt;
Alle Macros enthalten bereits ein Gerüst für den Weckprozess mit einigen Beispielen. Die Beispielschaltungen sind dabei noch auskommentiert. Nicht auskommentierter Code sollte als notwendiger Teil für die Weckautomation betrachtet werden und wird dort auch durch einen entsprechenden Kommentar erklärt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir jetzt Schritt für Schritt das oben beschriebene Szenario konfigurieren.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Auslöseverhaltens ==&lt;br /&gt;
&lt;br /&gt;
In der Grundkonfiguration löst jeder Wecker sein eigenes Weckprogramm täglich zur voreingestellten Zeit aus. Dabei wird allerdings kein längeres Programm gestartet, sondern lediglich einmalig das im Attribut wakeupMacro hinterlegte Notify-Macro getriggert. Das ist in der Beispiel-Grundkonfiguration kein Problem und lässt lediglich einen Logfile Eintrag erstellen.&lt;br /&gt;
&lt;br /&gt;
Als erstes möchten wir, dass alle 3 Timer das selbe Macro zum Wecken verwenden, damit wir den Code nur einmal pflegen müssen. Die anderen beiden Macros löschen wir anschließend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer2&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun konfigurieren wir die Auslöseverhalten so, wie wir es oben vorgegeben haben:&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 1 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Mo-Fr auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Hierfür muss ein [http://fhem.de/commandref.html#holiday holiday-Device] erstellt sein und in der global Config im Attribut &#039;holidays2we‘ verlinkt sein. Ansonsten erhält man beim setzen einer Weckzeit später entsprechende Fehlermeldungen, die darauf hinweisen.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupEnforced 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDefaultTime 07:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetdays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Ein Reset findet normalerweise nach jeder Auslösung statt, sprich wenn das Weckprogramm tatsächlich gestartet wurde. Dies kann man auf bestimmte Tage einschränken.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum einfacheren Aktivieren/Deaktivieren des Resets wollen wir ein weiteres Dummy nutzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetSwitcher rr_Julian_wakeuptimer1_resetswitcher&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Der Dummy-Gerätename kann frei gewählt werden. Sofern es nicht existiert wird es automatisch angelegt und vorkonfiguriert.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 2 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Samstags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupEnforce 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDefaultTime 09:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupResetdays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 3 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Sonntags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDays 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auch an Feiertagen ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupHolidays orHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen nur forcieren, wenn eine frühere Weckzeit als die Standard Weckzeit eingestellt wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupEnforce 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDefaultTime 10:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition des Weckprogramms ==&lt;br /&gt;
&lt;br /&gt;
Die Aktionen, welche innerhalb der 30 Minuten Weckzeitraum abgearbeitet werden sollen, sind im Device Macro_rr_Julian_wakeuptimer1 hinterlegt.&lt;br /&gt;
Dieses Macro wird 2 Mal aufgerufen: Das erste Mal beim Beginn des Weckprogramms und ein zweites Mal beim Ende des Weckprogramms. Der Hintergrund ist, dass das Macro beim Beenden dann entsprechend dafür sorgen kann bisher nicht ausgeführte Befehle des Programmablaufes zu stornieren. Hierfür ist der delete-Befehl am Anfang des Macros gedacht.&lt;br /&gt;
&lt;br /&gt;
Das Macro Template hat bereits alle oben beschriebenen Funktionen als auskommentierte FHEM Befehle enthalten. Diese sollen natürlich nur dem Beispiel und der eigenen Inspiration dienen. Wir müssten diese an dieser Stelle lediglich einkommentieren...&lt;br /&gt;
Insgesamt fällt bei genauerem hinsehen folgendes auf:&lt;br /&gt;
&lt;br /&gt;
* es stehen bestimmte Umgebungsvariablen bereit, die während des Programmablaufes genutzt werden können&lt;br /&gt;
* das Macro ist in 3 Bereiche unterteilt und nutzt dafür die Umgebungsvariable $EVTPART0 bzw. ob deren Wert auf &amp;quot;start&amp;quot; oder &amp;quot;stop&amp;quot; steht&lt;br /&gt;
* der erste Bereich mit dem delete-Befehl wird immer ausgeführt. Er räumt durch das Macro erzeugte temporäre at-Devices auf (entweder weil das Programm früher beendet werden soll oder von vorne beginnen soll)&lt;br /&gt;
* der zweite Bereich &amp;quot;start&amp;quot; führt erste FHEM Befehle direkt nach dem Beginn des Weckprogramms aus. Außerdem werden weitere Befehle in bestimmten Etappen zur zeitversetzten Ausführung vorgemerkt. Dafür werden temporär erzeugte at-Devices verwendet.&lt;br /&gt;
* der Name der at-Devices folgt einem bestimmten Schema, nämlich atTmp_&amp;lt;LAUFENDE-NUMMER&amp;gt;_$NAME. Die laufende Nummer muss man manuell hochzählen, der Rest kann einfach kopiert werden. Wenn man davon abweicht, muss man den delete-Befehl am Anfang auch anpassen.&lt;br /&gt;
* bei der Definition der at-Devices müssen mehrere FHEM Befehle hintereinander mit 2 Semikolon statt einem getrennt werden (siehe auch [http://fhem.de/commandref_DE.html#command Kommando-Referenz]).&lt;br /&gt;
* bei bedingten Schaltungen empfehlt es sich für übersichtlicheren Code die :FILTER Funktion zu nutzen (siehe auch [http://fhem.de/commandref_DE.html#devspec Kommando-Referenz]).&lt;br /&gt;
* es ist unbedingt darauf zu achten, dass das letzte at-Device nicht nach der wakeupOffset Zeit definiert wird, da es ansonsten automatisch gelöscht und somit nicht mehr ausgeführt wird&lt;br /&gt;
* nach einem ordentlichen Ende des Weckprogramms wird ein at-Device erzeugt, welches das Benutzer-Device automatisch nach &amp;quot;awoken&amp;quot; oder &amp;quot;home&amp;quot; schaltet, abhängig davon ob das Wecken forciert werden soll oder nicht. Dieser Teil wird tatsächlich nur geplant, wenn das Weckprogramm ordentlich beendet wurde. Wurde das Weckprogramm durch ein &amp;quot;set rr_Julian_wakeuptimer1 stop&amp;quot; bzw. durch Klick auf das blaue Device-Icon beendet, so werden die Post-Wakeup Befehle nicht mehr ausgeführt, weil man davon ausgehen kann, dass ein Abbruch des Programms und somit aller seiner weiteren Schaltungen gewünscht ist.&lt;br /&gt;
&lt;br /&gt;
Man kann sein Weckprogramm auf zwei Arten testen:&lt;br /&gt;
&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;trigger&amp;quot;: hier werden die aktuellen Auslösedefinitionen berücksichtigt; sprich, wenn heute nicht der richtige Tag ist, wird das Programm nicht gestartet&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;start&amp;quot; kann man alle Auslösedefinitionen umgehen und das Weckprogramm direkt auslösen&lt;br /&gt;
&lt;br /&gt;
Zu Debug-Zwecken kann man auf das Wecker Dummy-Device das Attribut &amp;quot;verbose&amp;quot; auf 4 setzen. Im Logfile wird dann sehr ausführlich geloggt, warum wie geschaltet oder nicht geschaltet wird und wie die Entscheidungen getroffen worden sind, Readings zu aktualisieren etc. Damit lässt sich prüfen, ob das gewünschte Auslöseverhalten tatsächlich richtig funktioniert.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;bettfertig machen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Möchte der Bewohner nun ins Bett gehen und sich dabei noch etwas darauf einstimmen, kann er sein &amp;quot;bettfertig machen&amp;quot;-Programm dadurch starten, dass er den Status seines ROOMMATE-Devices in FHEM auf &amp;quot;gotosleep&amp;quot; setzt.&lt;br /&gt;
In unserem Beispiel werden dann die Aktionen aus Macro_rr_Julian_gotosleep ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich wird im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;gotosleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;gotosleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_gotosleep aus. Dort werden dann Schaltungen vorgenommen, die von größerer Tragweite sind, als wenn nur ein einzelner Bewohner ins Bett geht. Beispielsweise könnte man in bestimmten Räumen das Licht oder Geräte ausschalten, die man ansonsten unberührt gelassen hätte, wenn andere noch wach blieben.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;schlafen legen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Legt sich der Bewohner ins Bett und möchte schlafen, wechselt er den Status seines ROOMMATE-Devices auf &amp;quot;asleep&amp;quot;. Ich mache das bei mir durch einen extra Wandschalter.&lt;br /&gt;
&lt;br /&gt;
In unserem Beispiel werden jetzt die Aktionen aus Macro_rr_Julian_asleep ausgeführt. In dem Macro wird besonders Wert darauf gelegt, dass ausschließlich Aktionen ausgeführt werden, die mit dem Schlafzimmer des Bewohners zu tun haben, damit andere Bewohner in anderen Räumen nicht beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich werden im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erniedrigt, das Reading &amp;quot;residentsAsleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;asleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;asleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_asleep aus. Dort werden dann auch wieder Schaltungen vorgenommen, die von größerer Tragweite sind. Beispielsweise werden alle noch übrigen Lichter im Haus ausgeschaltet und die Musikwiedergabe in Gemeinschaftsräumen (wie hier dem Badezimmer) gestoppt.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;aufgestanden sein&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Wir gehen nun davon aus, dass irgendwann morgens das Weckprogramm wie oben zuvor definiert abgespielt wird. Dabei wechselt im Device rgr_Bewohner das Reading residentsTotalWakeup auf 1 (oder höher bei mehreren gleichzeitig aktiven Weckprogrammen unterschiedlicher Bewohner).&lt;br /&gt;
&lt;br /&gt;
Während des Weckprogramms (oder natürlich auch davor) kann der Bewohner jederzeit in den Status &amp;quot;awoken&amp;quot; wechseln. Ich nutze bei mir auch hier wieder den Wandschalter.&lt;br /&gt;
Dadurch wird ein evtl. noch laufendes Weckprogramm unterbrochen (die at-Devices in FHEM werden automatisch aufgräumt) und die Aktionen in Macro_rr_Julian_awoken werden ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Neben dem expliziten Wechsel zum Status &amp;quot;awoken&amp;quot; kann aber, wie oben beschrieben, auch das Weckprogramm selbst den Bewohner auf diesen Status setzen. Dies wird dann als forciertes Wecken bezeichnet; sozusagen um seinen Hintern aus dem Bett zu bewegen :-)&lt;br /&gt;
Sinnvollerweise wechselt der Status des Bewohners nach kurzer Zeit dann automatisch von &amp;quot;awoken&amp;quot; auf &amp;quot;home&amp;quot;, also den Standard-Status wenn man zuhause ist.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich zum Wechsel des ROOMMATE-Devices auf &amp;quot;awoken&amp;quot; wird auch wieder das RESIDENTS-Device automatisch angepasst: Das Reading &amp;quot;residentsAsleep&amp;quot; wird um 1 erniedrigt, das Reading &amp;quot;residentsAwoken&amp;quot; um 1 erhöht und ein Event erzeugt. &lt;br /&gt;
Außerdem wird der Gesamtstatus auf &amp;quot;awoken&amp;quot; gesetzt. Dies löst Macro_rgr_Bewohner_awoken aus. Hier werden auch wieder Schaltungen vorgenommen, die das Haus dann für den ersten, der aufsteht, entsprechend einzustellen, also beispielsweise das Licht in der Küche einschalten.&lt;br /&gt;
Zusätzlich wird dann ein temporäres at-Devices angelegt, welches dafür sorgt, dass der Haus Modus nach 1,5h von &amp;quot;Morgen&amp;quot; auf &amp;quot;Tag&amp;quot; wechselt. Allerdings ist der Haus Modus wie schon erwähnt hier nicht das Hauptthema und wird aktuell auch noch nicht direkt vom RESIDENTS Toolkit unterstützt (Sneak-Peek auf zukünftige Erweiterungen ;-)).&lt;br /&gt;
&lt;br /&gt;
== Snooze Funktion bei SONOS ==&lt;br /&gt;
&lt;br /&gt;
Damit man an gewissen Tagen auch dem Wecker mal auf&#039;n Kopp hauen kann (bzw. auf den Start/Stop Button am SONOS Gerät), kann man ein einfaches DOIF erzeugen, welches dafür sorgt, dass man nach 5 Minuten wieder daran erinnert wird aufzustehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Sonos_Snooze DOIF (&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and (&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	) or&lt;br /&gt;
	(&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSEIF&lt;br /&gt;
(&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and&lt;br /&gt;
	([Sonos_Bedroom:transportState] eq &amp;quot;STOPPED&amp;quot; or [Sonos_Bedroom:transportState] eq &amp;quot;PAUSED_PLAYBACK&amp;quot;) and&lt;br /&gt;
	([?rr_Julian:wakeup] == 1 or [rr_Julian:wakeup:sec] &amp;lt; 600) and&lt;br /&gt;
	!$we&lt;br /&gt;
)&lt;br /&gt;
(&lt;br /&gt;
	set Sonos_Bedroom:FILTER=transportState!=PLAYING Play&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSE&lt;br /&gt;
&lt;br /&gt;
attr alias Automation: Sonos Snoozing&lt;br /&gt;
attr cmdState off|on|standby&lt;br /&gt;
attr comment snooze function for wake-up program via SONOS device button&lt;br /&gt;
attr devStateIcon off:general_aus on:general_an@green standby:general_an@orange&lt;br /&gt;
attr wait 0:300:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das DOIF hier greift nur während ein Weckprogramm läuft oder maximal noch 10 Minuten danach; zudem nur wochentags :-)&lt;br /&gt;
&lt;br /&gt;
Außerdem zeigt der DOIF Status an, ob die Snooze Funktion gerade scharf geschaltet ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass das ROOMMATE Device ein Event bei der Änderung des wakeup Readings auslöst, also z.B. das Attribut event-on-change-reading dann entsprechend auch &amp;quot;wakeup&amp;quot; enthält.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21232</id>
		<title>Weckautomation</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21232"/>
		<updated>2017-04-09T10:58:10Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Module ROOMMATE und GUEST können dazu genutzt werden, Bewohner und Gäste in FHEM als ein Device zu repräsentieren und durch Events deren Status zu erfassen bzw. zu ändern (beispielsweise durch das GEOFANCY Modul für [[Anwesenheitserkennung]]). Das zur Modulfamilie dazugehörige Modul RESIDENTS fasst die Status mehrerer Bewohner logisch zusammen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen unterstützen die Module auch bei der Erstellung einer Weckautomation, indem sie die Logik kapseln und häufig verwendete Standardfunktionen bereitstellen. Die Verwendung soll in diesem Artikel anhand eines Beispiels näher erläutert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Weckprogramm_Ergebnisdarstellung.png|500px|thumb|right|Darstellung der Beispiel-Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
== Was soll erreicht werden? ==&lt;br /&gt;
&lt;br /&gt;
Hier ein kurzer Überblick über die Funktionen, die wir am Ende realisiert haben werden:&lt;br /&gt;
&lt;br /&gt;
; 3 unterschiedliche Wecker&lt;br /&gt;
: 1 für Werktage Mo-Fr&lt;br /&gt;
: 1 für werktägliche Samstage&lt;br /&gt;
: 1 für Sonn- und Feiertage&lt;br /&gt;
; Automatischer Reset der Weckzeiten&lt;br /&gt;
: werktäglicher Wecker soll auf einen Standardwert zurückstellen, falls er mal verstellt wurde&lt;br /&gt;
: automatischer Reset des werktäglicher Weckers soll zeitweise abschaltbar sein&lt;br /&gt;
: nach einem Sonn- oder Feiertagen soll der automatische Reset des werktäglichen Weckers immer wieder eingeschaltet werden&lt;br /&gt;
: die Samstags- und Sonntags-Wecker sollen immer nach ihrer Ausführung resettet werden&lt;br /&gt;
; jeder Wecker startet ein Weckprogramm 30 Minuten vor der programmierten Zeit&lt;br /&gt;
: langsames hochfahren der Rollläden&lt;br /&gt;
: Wakeup Light über eine HUE Birne von Warmweiß/2000K zu Kaltweiß/5600K&lt;br /&gt;
: an Werktagen: Chillout Weckmusik wird langsam lauter gestellt&lt;br /&gt;
: Snooze Funktion über die SONOS Taste am Gerät an Werktagen (erneutes Play nach 5 Minuten)&lt;br /&gt;
: forciertes Aufstehen an Werktagen durch automatischen Wechsel des Bewohner Devices zu &amp;quot;awake&amp;quot; und dadurch starten der &amp;quot;aufgestanden sein&amp;quot; Prozesse (siehe unten)&lt;br /&gt;
; Starten des Weckprogramms nur bei tatsächlicher Anwesenheit des betroffenen Bewohners&lt;br /&gt;
; Ansage der Uhrzeit zur gewählten Weckzeit&lt;br /&gt;
; Prozess / Automation für:&lt;br /&gt;
: &amp;lt;u&amp;gt;bettfertig machen&amp;lt;/u&amp;gt;: Lichtszene setzen, Chillout Musik in Schlafzimmer und Badezimmer abspielen&lt;br /&gt;
: &amp;lt;u&amp;gt;schlafen legen&amp;lt;/u&amp;gt;: Ansage der eingestellten Weckzeit &amp;amp; Ausschalten aller Verbraucher&lt;br /&gt;
: &amp;lt;u&amp;gt;aufgestanden sein&amp;lt;/u&amp;gt;: Ansage Raumluftqualität, Wettervorhersage; Lokalradio einschalten und in Räume verteilen; Küchenlicht an, HUE in Schlafzimmer mit Aufwach-Farbtemperatur&lt;br /&gt;
; Berücksichtigung / Steuerung des Haus Modus&lt;br /&gt;
: Wechsel zwischen Morgen-, Tag-, Abend- und Nacht-Modus entsprechend der Schlafgewohnheiten (zusätzlich zur Tageszeit abhängigen Steuerung/Umschaltung, die hier aber nicht Thema sein soll)&lt;br /&gt;
; Statuswerte, Events, Readings und Funktionen:&lt;br /&gt;
: Wurde ein Wecker ausgelöst?&lt;br /&gt;
: Ist gerade ein Weckprogramm aktiv?&lt;br /&gt;
: Abbrechen/sofortiges beenden des Weckprogramms&lt;br /&gt;
: Verhindern von durch Fehlkonfiguration parallel ausgeführten Weckern für die selbe Person&lt;br /&gt;
: Welcher ist der nächste Wecker, der bis Mitternacht des nächsten Tages ausgeführt wird und wann ist das?&lt;br /&gt;
: Wann wurde ein Wecker zuletzt ausgeführt und welcher Wecker wurde überhaupt zuletzt ausgeführt?&lt;br /&gt;
: Wie viele Bewohner werden gerade geweckt?&lt;br /&gt;
: Wie viele Bewohner sind gerade aufgestanden?&lt;br /&gt;
: Schaltung bei erstem Bewohner, der geweckt wird&lt;br /&gt;
: Schaltung bei erstem Bewohner, der aufgestanden ist&lt;br /&gt;
; Statistik&lt;br /&gt;
: Wie lange dauerte der Schlaf des Bewohners?&lt;br /&gt;
: Wie lange war in dem Haus niemand wach?&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei zu erwähnen ist, dass die Prozesse so umgesetzt worden sind, dass Bewohner sowohl zeitgleich, als auch zeitversetzt oder komplett getrennt ins Bett gehen und aufwachen können.&lt;br /&gt;
Dafür werden einige Schaltungen pro Bewohner und dessen Schlafzimmer vorgenommen und andere erst dann, wenn die RESIDENTS Bewohnergruppe einen bestimmten Status erreicht hat.&lt;br /&gt;
&lt;br /&gt;
== Notwendige Devices anlegen ==&lt;br /&gt;
&lt;br /&gt;
=== RESIDENTS und ROOMMATE Devices ===&lt;br /&gt;
Wir starten mit einem RESIDENTS Device, um die Bewohner Status später logisch zusammenfassen zu können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define rgr_Bewohner RESIDENTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend legen wir pro Bewohner ein ROOMMATE Device an. Dafür verwenden wir eine Funktion, die in RESIDENTS eingebaut ist und die Devices korrekt untereinander verbindet (die Reihenfolge, in der RESIDENTS und ROOMMATE/GUEST Geräte definiert werden, sind hier entscheidend). Der Einfachheit halber definieren wir in diesem Beispiel nur einen Bewohner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rgr_Bewohner addRoommate Julian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wurde nun automatisch ein Device namens &amp;quot;rr_Julian&amp;quot; angelegt (abgeleitet aus dem angegebenen Vornamen aus dem addRoommate Befehl).&lt;br /&gt;
Anschließend setzen wir einmalig den initialen Status für die Bewohner mittels set Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der automatische Wechsel des Status bei Anwesenheit/Abwesenheit wird hier nicht weiter thematisiert, hier sei auf den Artikel [[Anwesenheitserkennung]] verwiesen, insbesondere den GEOFANCY Teil.&lt;br /&gt;
&lt;br /&gt;
=== Wecker Devices anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die Devices, über die die Weckzeit und das Auslöseverhalten eingestellt werden, sind eigentlich normale Dummy Devices. Das zugewiesene ROOMMATE/GUEST/RESIDENTS Device &amp;quot;versklavt&amp;quot; diese Geräte jedoch und führt bestimmte Befehle zur Wecksteuerung und -Verwaltung aus, sobald das Dummy-Device geändert wird. Der Vorteil dabei ist, dass man sich eine Menge eigenen Code und viele unterschiedliche Notify und Dummy Devices spart, was wiederum der Übersichtlichkeit zu Gute kommt.&lt;br /&gt;
&lt;br /&gt;
Wir legen nun unsere drei Wecker für unseren Beispiel Bewohner an. Dafür führen wir einfach 3 mal den selben Befehl hintereinander aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Logdatei erscheinen verschiedene Meldungen über alle automatisch angelegte Devices inkl. Name und Typ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015.03.28 12:19:49 3: RESIDENTStk rr_Julian_wakeuptimer1: new notify macro device Macro_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new at-device at_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_awoken created&lt;br /&gt;
2015.03.28 12:19:51 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new notify macro device Macro_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new at-device at_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new notify macro device Macro_rr_Julian_wakeuptimer3 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new at-device at_rr_Julian_wakeuptimer3 created&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Rückgabe in FHEMWEB erhält man eine Meldung wie diese hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dummy rr_Julian_wakeuptimer1 and other pending devices created and pre-configured. &lt;br /&gt;
You may edit Macro_rr_Julian_wakeuptimer1 to define your wake-up actions &lt;br /&gt;
and at_rr_Julian_wakeuptimer1 for optional at-device adjustments.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht wurden anfänglich eine ganze Menge von Notify-Macros und Watchdogs sowie ein at-Device pro Wecker angelegt.&lt;br /&gt;
Dabei sind vor allem die Macro-Devices und die Wecker Dummy Devices interessant. Hier werden Weck- und Auslöseverhalten konfiguriert. die at- und Watchdog-Devices können aber für fortgeschrittene Nutzer beliebig angepasst werden. Auch die Dummy Devices können bis auf wenige Ausnahmen (Attribut &amp;quot;userattr&amp;quot;) vollständig umkonfiguriert werden. Wer Devices umbenennt, sollte unbedingt darauf achten, dass auch das entsprechende Attribut im Wecker-Dummy-Device angepasst wird.&lt;br /&gt;
&lt;br /&gt;
Allen Devices ist ein entsprechender Kommentar hinzugefügt, der dessen Funktion kurz erklärt.&lt;br /&gt;
Alle Macros enthalten bereits ein Gerüst für den Weckprozess mit einigen Beispielen. Die Beispielschaltungen sind dabei noch auskommentiert. Nicht auskommentierter Code sollte als notwendiger Teil für die Weckautomation betrachtet werden und wird dort auch durch einen entsprechenden Kommentar erklärt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir jetzt Schritt für Schritt das oben beschriebene Szenario konfigurieren.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Auslöseverhaltens ==&lt;br /&gt;
&lt;br /&gt;
In der Grundkonfiguration löst jeder Wecker sein eigenes Weckprogramm täglich zur voreingestellten Zeit aus. Dabei wird allerdings kein längeres Programm gestartet, sondern lediglich einmalig das im Attribut wakeupMacro hinterlegte Notify-Macro getriggert. Das ist in der Beispiel-Grundkonfiguration kein Problem und lässt lediglich einen Logfile Eintrag erstellen.&lt;br /&gt;
&lt;br /&gt;
Als erstes möchten wir, dass alle 3 Timer das selbe Macro zum Wecken verwenden, damit wir den Code nur einmal pflegen müssen. Die anderen beiden Macros löschen wir anschließend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer2&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun konfigurieren wir die Auslöseverhalten so, wie wir es oben vorgegeben haben:&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 1 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Mo-Fr auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Hierfür muss ein [http://fhem.de/commandref.html#holiday holiday-Device] erstellt sein und in der global Config im Attribut &#039;holidays2we‘ verlinkt sein. Ansonsten erhält man beim setzen einer Weckzeit später entsprechende Fehlermeldungen, die darauf hinweisen.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupEnforced 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDefaultTime 07:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetdays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Ein Reset findet normalerweise nach jeder Auslösung statt, sprich wenn das Weckprogramm tatsächlich gestartet wurde. Dies kann man auf bestimmte Tage einschränken.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum einfacheren Aktivieren/Deaktivieren des Resets wollen wir ein weiteres Dummy nutzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetSwitcher rr_Julian_wakeuptimer1_resetswitcher&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Der Dummy-Gerätename kann frei gewählt werden. Sofern es nicht existiert wird es automatisch angelegt und vorkonfiguriert.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 2 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Samstags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupEnforce 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDefaultTime 09:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupResetdays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 3 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Sonntags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDays 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auch an Feiertagen ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupHolidays orHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen nur forcieren, wenn eine frühere Weckzeit als die Standard Weckzeit eingestellt wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupEnforce 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDefaultTime 10:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition des Weckprogramms ==&lt;br /&gt;
&lt;br /&gt;
Die Aktionen, welche innerhalb der 30 Minuten Weckzeitraum abgearbeitet werden sollen, sind im Device Macro_rr_Julian_wakeuptimer1 hinterlegt.&lt;br /&gt;
Dieses Macro wird 2 Mal aufgerufen: Das erste Mal beim Beginn des Weckprogramms und ein zweites Mal beim Ende des Weckprogramms. Der Hintergrund ist, dass das Macro beim Beenden dann entsprechend dafür sorgen kann bisher nicht ausgeführte Befehle des Programmablaufes zu stornieren. Hierfür ist die for-Schleife am Anfang des Macros gedacht und deckt per Default 10 Arbeitsschritte ab (ansonsten einfach die Zahl entsprechend erhöhen).&lt;br /&gt;
&lt;br /&gt;
Das Macro Template hat bereits alle oben beschriebenen Funktionen als auskommentierte FHEM Befehle enthalten. Diese sollen natürlich nur dem Beispiel und der eigenen Inspiration dienen. Wir müssten diese an dieser Stelle lediglich einkommentieren...&lt;br /&gt;
Insgesamt fällt bei genauerem hinsehen folgendes auf:&lt;br /&gt;
&lt;br /&gt;
* es stehen bestimmte Umgebungsvariablen bereit, die während des Programmablaufes genutzt werden können&lt;br /&gt;
* das Macro ist in 3 Bereiche unterteilt und nutzt dafür die Umgebungsvariable $EVTPART0 bzw. ob deren Wert auf &amp;quot;start&amp;quot; oder &amp;quot;stop&amp;quot; steht&lt;br /&gt;
* der erste Bereich mit der for-Schleife wird immer ausgeführt. Sie räumt durch das Macro erzeugte temporäre at-Devices auf (entweder weil das Programm früher beendet werden soll oder von vorne beginnen soll)&lt;br /&gt;
* der zweite Bereich &amp;quot;start&amp;quot; führt erste FHEM Befehle direkt nach dem Beginn des Weckprogramms aus. Außerdem werden weitere Befehle in bestimmten Etappen zur zeitversetzten Ausführung vorgemerkt. Dafür werden temporär erzeugte at-Devices verwendet.&lt;br /&gt;
* der Name der at-Devices folgt einem bestimmten Schema, nämlich atTmp_&amp;lt;LAUFENDE-NUMMER&amp;gt;_$NAME. Die laufende Nummer muss man manuell hochzählen, der Rest kann einfach kopiert werden. Dadurch wird das aufräumen oben im Macro einfacher.&lt;br /&gt;
* bei der Definition der at-Devices müssen mehrere FHEM Befehle hintereinander mit 2 Semikolon statt einem getrennt werden (siehe auch [http://fhem.de/commandref_DE.html#command Kommando-Referenz]).&lt;br /&gt;
* bei bedingten Schaltungen empfehlt es sich für übersichtlicheren Code die :FILTER Funktion zu nutzen (siehe auch [http://fhem.de/commandref_DE.html#devspec Kommando-Referenz]).&lt;br /&gt;
* es ist unbedingt darauf zu achten, dass das letzte at-Device nicht nach der wakeupOffset Zeit definiert wird, da es ansonsten automatisch gelöscht und somit nicht mehr ausgeführt wird&lt;br /&gt;
* nach einem ordentlichen Ende des Weckprogramms wird ein at-Device erzeugt, welches das Benutzer-Device automatisch nach &amp;quot;awoken&amp;quot; oder &amp;quot;home&amp;quot; schaltet, abhängig davon ob das Wecken forciert werden soll oder nicht. Dieser Teil wird tatsächlich nur geplant, wenn das Weckprogramm ordentlich beendet wurde. Wurde das Weckprogramm durch ein &amp;quot;set rr_Julian_wakeuptimer1 stop&amp;quot; bzw. durch Klick auf das blaue Device-Icon beendet, so werden die Post-Wakeup Befehle nicht mehr ausgeführt, weil man davon ausgehen kann, dass ein Abbruch des Programms und somit aller seiner weiteren Schaltungen gewünscht ist.&lt;br /&gt;
&lt;br /&gt;
Man kann sein Weckprogramm auf zwei Arten testen:&lt;br /&gt;
&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;trigger&amp;quot;: hier werden die aktuellen Auslösedefinitionen berücksichtigt; sprich, wenn heute nicht der richtige Tag ist, wird das Programm nicht gestartet&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;start&amp;quot; kann man alle Auslösedefinitionen umgehen und das Weckprogramm direkt auslösen&lt;br /&gt;
&lt;br /&gt;
Zu Debug-Zwecken kann man auf das Wecker Dummy-Device das Attribut &amp;quot;verbose&amp;quot; auf 4 setzen. Im Logfile wird dann sehr ausführlich geloggt, warum wie geschaltet oder nicht geschaltet wird und wie die Entscheidungen getroffen worden sind, Readings zu aktualisieren etc. Damit lässt sich prüfen, ob das gewünschte Auslöseverhalten tatsächlich richtig funktioniert.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;bettfertig machen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Möchte der Bewohner nun ins Bett gehen und sich dabei noch etwas darauf einstimmen, kann er sein &amp;quot;bettfertig machen&amp;quot;-Programm dadurch starten, dass er den Status seines ROOMMATE-Devices in FHEM auf &amp;quot;gotosleep&amp;quot; setzt.&lt;br /&gt;
In unserem Beispiel werden dann die Aktionen aus Macro_rr_Julian_gotosleep ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich wird im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;gotosleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;gotosleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_gotosleep aus. Dort werden dann Schaltungen vorgenommen, die von größerer Tragweite sind, als wenn nur ein einzelner Bewohner ins Bett geht. Beispielsweise könnte man in bestimmten Räumen das Licht oder Geräte ausschalten, die man ansonsten unberührt gelassen hätte, wenn andere noch wach blieben.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;schlafen legen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Legt sich der Bewohner ins Bett und möchte schlafen, wechselt er den Status seines ROOMMATE-Devices auf &amp;quot;asleep&amp;quot;. Ich mache das bei mir durch einen extra Wandschalter.&lt;br /&gt;
&lt;br /&gt;
In unserem Beispiel werden jetzt die Aktionen aus Macro_rr_Julian_asleep ausgeführt. In dem Macro wird besonders Wert darauf gelegt, dass ausschließlich Aktionen ausgeführt werden, die mit dem Schlafzimmer des Bewohners zu tun haben, damit andere Bewohner in anderen Räumen nicht beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich werden im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erniedrigt, das Reading &amp;quot;residentsAsleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;asleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;asleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_asleep aus. Dort werden dann auch wieder Schaltungen vorgenommen, die von größerer Tragweite sind. Beispielsweise werden alle noch übrigen Lichter im Haus ausgeschaltet und die Musikwiedergabe in Gemeinschaftsräumen (wie hier dem Badezimmer) gestoppt.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;aufgestanden sein&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Wir gehen nun davon aus, dass irgendwann morgens das Weckprogramm wie oben zuvor definiert abgespielt wird. Dabei wechselt im Device rgr_Bewohner das Reading residentsTotalWakeup auf 1 (oder höher bei mehreren gleichzeitig aktiven Weckprogrammen unterschiedlicher Bewohner).&lt;br /&gt;
&lt;br /&gt;
Während des Weckprogramms (oder natürlich auch davor) kann der Bewohner jederzeit in den Status &amp;quot;awoken&amp;quot; wechseln. Ich nutze bei mir auch hier wieder den Wandschalter.&lt;br /&gt;
Dadurch wird ein evtl. noch laufendes Weckprogramm unterbrochen (die at-Devices in FHEM werden automatisch aufgräumt) und die Aktionen in Macro_rr_Julian_awoken werden ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Neben dem expliziten Wechsel zum Status &amp;quot;awoken&amp;quot; kann aber, wie oben beschrieben, auch das Weckprogramm selbst den Bewohner auf diesen Status setzen. Dies wird dann als forciertes Wecken bezeichnet; sozusagen um seinen Hintern aus dem Bett zu bewegen :-)&lt;br /&gt;
Sinnvollerweise wechselt der Status des Bewohners nach kurzer Zeit dann automatisch von &amp;quot;awoken&amp;quot; auf &amp;quot;home&amp;quot;, also den Standard-Status wenn man zuhause ist.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich zum Wechsel des ROOMMATE-Devices auf &amp;quot;awoken&amp;quot; wird auch wieder das RESIDENTS-Device automatisch angepasst: Das Reading &amp;quot;residentsAsleep&amp;quot; wird um 1 erniedrigt, das Reading &amp;quot;residentsAwoken&amp;quot; um 1 erhöht und ein Event erzeugt. &lt;br /&gt;
Außerdem wird der Gesamtstatus auf &amp;quot;awoken&amp;quot; gesetzt. Dies löst Macro_rgr_Bewohner_awoken aus. Hier werden auch wieder Schaltungen vorgenommen, die das Haus dann für den ersten, der aufsteht, entsprechend einzustellen, also beispielsweise das Licht in der Küche einschalten.&lt;br /&gt;
Zusätzlich wird dann ein temporäres at-Devices angelegt, welches dafür sorgt, dass der Haus Modus nach 1,5h von &amp;quot;Morgen&amp;quot; auf &amp;quot;Tag&amp;quot; wechselt. Allerdings ist der Haus Modus wie schon erwähnt hier nicht das Hauptthema und wird aktuell auch noch nicht direkt vom RESIDENTS Toolkit unterstützt (Sneak-Peek auf zukünftige Erweiterungen ;-)).&lt;br /&gt;
&lt;br /&gt;
== Snooze Funktion bei SONOS ==&lt;br /&gt;
&lt;br /&gt;
Damit man an gewissen Tagen auch dem Wecker mal auf&#039;n Kopp hauen kann (bzw. auf den Start/Stop Button am SONOS Gerät), kann man ein einfaches DOIF erzeugen, welches dafür sorgt, dass man nach 5 Minuten wieder daran erinnert wird aufzustehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Sonos_Snooze DOIF (&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and (&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	) or&lt;br /&gt;
	(&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSEIF&lt;br /&gt;
(&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and&lt;br /&gt;
	([Sonos_Bedroom:transportState] eq &amp;quot;STOPPED&amp;quot; or [Sonos_Bedroom:transportState] eq &amp;quot;PAUSED_PLAYBACK&amp;quot;) and&lt;br /&gt;
	([?rr_Julian:wakeup] == 1 or [rr_Julian:wakeup:sec] &amp;lt; 600) and&lt;br /&gt;
	!$we&lt;br /&gt;
)&lt;br /&gt;
(&lt;br /&gt;
	set Sonos_Bedroom:FILTER=transportState!=PLAYING Play&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSE&lt;br /&gt;
&lt;br /&gt;
attr alias Automation: Sonos Snoozing&lt;br /&gt;
attr cmdState off|on|standby&lt;br /&gt;
attr comment snooze function for wake-up program via SONOS device button&lt;br /&gt;
attr devStateIcon off:general_aus on:general_an@green standby:general_an@orange&lt;br /&gt;
attr wait 0:300:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das DOIF hier greift nur während ein Weckprogramm läuft oder maximal noch 10 Minuten danach; zudem nur wochentags :-)&lt;br /&gt;
&lt;br /&gt;
Außerdem zeigt der DOIF Status an, ob die Snooze Funktion gerade scharf geschaltet ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass das ROOMMATE Device ein Event bei der Änderung des wakeup Readings auslöst, also z.B. das Attribut event-on-change-reading dann entsprechend auch &amp;quot;wakeup&amp;quot; enthält.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21231</id>
		<title>Weckautomation</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21231"/>
		<updated>2017-04-09T10:56:13Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Module ROOMMATE und GUEST können dazu genutzt werden, Bewohner und Gäste in FHEM als ein Device zu repräsentieren und durch Events deren Status zu erfassen bzw. zu ändern (beispielsweise durch das GEOFANCY Modul für [[Anwesenheitserkennung]]). Das zur Modulfamilie dazugehörige Modul RESIDENTS fasst die Status mehrerer Bewohner logisch zusammen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen unterstützen die Module auch bei der Erstellung einer Weckautomation, indem sie die Logik kapseln und häufig verwendete Standardfunktionen bereitstellen. Die Verwendung soll in diesem Artikel anhand eines Beispiels näher erläutert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Weckprogramm_Ergebnisdarstellung.png|500px|thumb|right|Darstellung der Beispiel-Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
== Was soll erreicht werden? ==&lt;br /&gt;
&lt;br /&gt;
Hier ein kurzer Überblick über die Funktionen, die wir am Ende realisiert haben werden:&lt;br /&gt;
&lt;br /&gt;
; 3 unterschiedliche Wecker&lt;br /&gt;
: 1 für Werktage Mo-Fr&lt;br /&gt;
: 1 für werktägliche Samstage&lt;br /&gt;
: 1 für Sonn- und Feiertage&lt;br /&gt;
; Automatischer Reset der Weckzeiten&lt;br /&gt;
: werktäglicher Wecker soll auf einen Standardwert zurückstellen, falls er mal verstellt wurde&lt;br /&gt;
: automatischer Reset des werktäglicher Weckers soll zeitweise abschaltbar sein&lt;br /&gt;
: nach einem Sonn- oder Feiertagen soll der automatische Reset des werktäglichen Weckers immer wieder eingeschaltet werden&lt;br /&gt;
: die Samstags- und Sonntags-Wecker sollen immer nach ihrer Ausführung resettet werden&lt;br /&gt;
; jeder Wecker startet ein Weckprogramm 30 Minuten vor der programmierten Zeit&lt;br /&gt;
: langsames hochfahren der Rollläden&lt;br /&gt;
: Wakeup Light über eine HUE Birne von Warmweiß/2000K zu Kaltweiß/5600K&lt;br /&gt;
: an Werktagen: Chillout Weckmusik wird langsam lauter gestellt&lt;br /&gt;
: Snooze Funktion über die SONOS Taste am Gerät an Werktagen (erneutes Play nach 5 Minuten)&lt;br /&gt;
: forciertes Aufstehen an Werktagen durch automatischen Wechsel des Bewohner Devices zu &amp;quot;awake&amp;quot; und dadurch starten der &amp;quot;aufgewacht sein&amp;quot; Prozesse (siehe unten)&lt;br /&gt;
; Starten des Weckprogramms nur bei tatsächlicher Anwesenheit des betroffenen Bewohners&lt;br /&gt;
; Ansage der Uhrzeit zur gewählten Weckzeit&lt;br /&gt;
; Prozess / Automation für:&lt;br /&gt;
: &amp;lt;u&amp;gt;bettfertig machen&amp;lt;/u&amp;gt;: Lichtszene setzen, Chillout Musik in Schlafzimmer und Badezimmer abspielen&lt;br /&gt;
: &amp;lt;u&amp;gt;schlafen legen&amp;lt;/u&amp;gt;: Ansage der eingestellten Weckzeit &amp;amp; Ausschalten aller Verbraucher&lt;br /&gt;
: &amp;lt;u&amp;gt;aufgewacht sein&amp;lt;/u&amp;gt;: Ansage Raumluftqualität, Wettervorhersage; Lokalradio einschalten und in Räume verteilen; Küchenlicht an, HUE in Schlafzimmer mit Aufwach-Farbtemperatur&lt;br /&gt;
; Berücksichtigung / Steuerung des Haus Modus&lt;br /&gt;
: Wechsel zwischen Morgen-, Tag-, Abend- und Nacht-Modus entsprechend der Schlafgewohnheiten (zusätzlich zur Tageszeit abhängigen Steuerung/Umschaltung, die hier aber nicht Thema sein soll)&lt;br /&gt;
; Statuswerte, Events, Readings und Funktionen:&lt;br /&gt;
: Wurde ein Wecker ausgelöst?&lt;br /&gt;
: Ist gerade ein Weckprogramm aktiv?&lt;br /&gt;
: Abbrechen/sofortiges beenden des Weckprogramms&lt;br /&gt;
: Verhindern von durch Fehlkonfiguration parallel ausgeführten Weckern für die selbe Person&lt;br /&gt;
: Welcher ist der nächste Wecker, der bis Mitternacht des nächsten Tages ausgeführt wird und wann ist das?&lt;br /&gt;
: Wann wurde ein Wecker zuletzt ausgeführt und welcher Wecker wurde überhaupt zuletzt ausgeführt?&lt;br /&gt;
: Wie viele Bewohner werden gerade geweckt?&lt;br /&gt;
: Wie viele Bewohner sind gerade aufgewacht?&lt;br /&gt;
: Schaltung bei erstem Bewohner, der geweckt wird&lt;br /&gt;
: Schaltung bei erstem Bewohner, der aufgewacht ist&lt;br /&gt;
; Statistik&lt;br /&gt;
: Wie lange dauerte der Schlaf des Bewohners?&lt;br /&gt;
: Wie lange war in dem Haus niemand wach?&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei zu erwähnen ist, dass die Prozesse so umgesetzt worden sind, dass Bewohner sowohl zeitgleich, als auch zeitversetzt oder komplett getrennt ins Bett gehen und aufwachen können.&lt;br /&gt;
Dafür werden einige Schaltungen pro Bewohner und dessen Schlafzimmer vorgenommen und andere erst dann, wenn die RESIDENTS Bewohnergruppe einen bestimmten Status erreicht hat.&lt;br /&gt;
&lt;br /&gt;
== Notwendige Devices anlegen ==&lt;br /&gt;
&lt;br /&gt;
=== RESIDENTS und ROOMMATE Devices ===&lt;br /&gt;
Wir starten mit einem RESIDENTS Device, um die Bewohner Status später logisch zusammenfassen zu können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define rgr_Bewohner RESIDENTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend legen wir pro Bewohner ein ROOMMATE Device an. Dafür verwenden wir eine Funktion, die in RESIDENTS eingebaut ist und die Devices korrekt untereinander verbindet (die Reihenfolge, in der RESIDENTS und ROOMMATE/GUEST Geräte definiert werden, sind hier entscheidend). Der Einfachheit halber definieren wir in diesem Beispiel nur einen Bewohner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rgr_Bewohner addRoommate Julian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wurde nun automatisch ein Device namens &amp;quot;rr_Julian&amp;quot; angelegt (abgeleitet aus dem angegebenen Vornamen aus dem addRoommate Befehl).&lt;br /&gt;
Anschließend setzen wir einmalig den initialen Status für die Bewohner mittels set Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der automatische Wechsel des Status bei Anwesenheit/Abwesenheit wird hier nicht weiter thematisiert, hier sei auf den Artikel [[Anwesenheitserkennung]] verwiesen, insbesondere den GEOFANCY Teil.&lt;br /&gt;
&lt;br /&gt;
=== Wecker Devices anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die Devices, über die die Weckzeit und das Auslöseverhalten eingestellt werden, sind eigentlich normale Dummy Devices. Das zugewiesene ROOMMATE/GUEST/RESIDENTS Device &amp;quot;versklavt&amp;quot; diese Geräte jedoch und führt bestimmte Befehle zur Wecksteuerung und -Verwaltung aus, sobald das Dummy-Device geändert wird. Der Vorteil dabei ist, dass man sich eine Menge eigenen Code und viele unterschiedliche Notify und Dummy Devices spart, was wiederum der Übersichtlichkeit zu Gute kommt.&lt;br /&gt;
&lt;br /&gt;
Wir legen nun unsere drei Wecker für unseren Beispiel Bewohner an. Dafür führen wir einfach 3 mal den selben Befehl hintereinander aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Logdatei erscheinen verschiedene Meldungen über alle automatisch angelegte Devices inkl. Name und Typ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015.03.28 12:19:49 3: RESIDENTStk rr_Julian_wakeuptimer1: new notify macro device Macro_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new at-device at_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_awoken created&lt;br /&gt;
2015.03.28 12:19:51 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new notify macro device Macro_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new at-device at_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new notify macro device Macro_rr_Julian_wakeuptimer3 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new at-device at_rr_Julian_wakeuptimer3 created&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Rückgabe in FHEMWEB erhält man eine Meldung wie diese hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dummy rr_Julian_wakeuptimer1 and other pending devices created and pre-configured. &lt;br /&gt;
You may edit Macro_rr_Julian_wakeuptimer1 to define your wake-up actions &lt;br /&gt;
and at_rr_Julian_wakeuptimer1 for optional at-device adjustments.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht wurden anfänglich eine ganze Menge von Notify-Macros und Watchdogs sowie ein at-Device pro Wecker angelegt.&lt;br /&gt;
Dabei sind vor allem die Macro-Devices und die Wecker Dummy Devices interessant. Hier werden Weck- und Auslöseverhalten konfiguriert. die at- und Watchdog-Devices können aber für fortgeschrittene Nutzer beliebig angepasst werden. Auch die Dummy Devices können bis auf wenige Ausnahmen (Attribut &amp;quot;userattr&amp;quot;) vollständig umkonfiguriert werden. Wer Devices umbenennt, sollte unbedingt darauf achten, dass auch das entsprechende Attribut im Wecker-Dummy-Device angepasst wird.&lt;br /&gt;
&lt;br /&gt;
Allen Devices ist ein entsprechender Kommentar hinzugefügt, der dessen Funktion kurz erklärt.&lt;br /&gt;
Alle Macros enthalten bereits ein Gerüst für den Weckprozess mit einigen Beispielen. Die Beispielschaltungen sind dabei noch auskommentiert. Nicht auskommentierter Code sollte als notwendiger Teil für die Weckautomation betrachtet werden und wird dort auch durch einen entsprechenden Kommentar erklärt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir jetzt Schritt für Schritt das oben beschriebene Szenario konfigurieren.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Auslöseverhaltens ==&lt;br /&gt;
&lt;br /&gt;
In der Grundkonfiguration löst jeder Wecker sein eigenes Weckprogramm täglich zur voreingestellten Zeit aus. Dabei wird allerdings kein längeres Programm gestartet, sondern lediglich einmalig das im Attribut wakeupMacro hinterlegte Notify-Macro getriggert. Das ist in der Beispiel-Grundkonfiguration kein Problem und lässt lediglich einen Logfile Eintrag erstellen.&lt;br /&gt;
&lt;br /&gt;
Als erstes möchten wir, dass alle 3 Timer das selbe Macro zum Wecken verwenden, damit wir den Code nur einmal pflegen müssen. Die anderen beiden Macros löschen wir anschließend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer2&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun konfigurieren wir die Auslöseverhalten so, wie wir es oben vorgegeben haben:&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 1 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Mo-Fr auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Hierfür muss ein [http://fhem.de/commandref.html#holiday holiday-Device] erstellt sein und in der global Config im Attribut &#039;holidays2we‘ verlinkt sein. Ansonsten erhält man beim setzen einer Weckzeit später entsprechende Fehlermeldungen, die darauf hinweisen.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupEnforced 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDefaultTime 07:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetdays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Ein Reset findet normalerweise nach jeder Auslösung statt, sprich wenn das Weckprogramm tatsächlich gestartet wurde. Dies kann man auf bestimmte Tage einschränken.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum einfacheren Aktivieren/Deaktivieren des Resets wollen wir ein weiteres Dummy nutzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetSwitcher rr_Julian_wakeuptimer1_resetswitcher&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Der Dummy-Gerätename kann frei gewählt werden. Sofern es nicht existiert wird es automatisch angelegt und vorkonfiguriert.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 2 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Samstags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupEnforce 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDefaultTime 09:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupResetdays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 3 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Sonntags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDays 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auch an Feiertagen ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupHolidays orHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen nur forcieren, wenn eine frühere Weckzeit als die Standard Weckzeit eingestellt wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupEnforce 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDefaultTime 10:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition des Weckprogramms ==&lt;br /&gt;
&lt;br /&gt;
Die Aktionen, welche innerhalb der 30 Minuten Weckzeitraum abgearbeitet werden sollen, sind im Device Macro_rr_Julian_wakeuptimer1 hinterlegt.&lt;br /&gt;
Dieses Macro wird 2 Mal aufgerufen: Das erste Mal beim Beginn des Weckprogramms und ein zweites Mal beim Ende des Weckprogramms. Der Hintergrund ist, dass das Macro beim Beenden dann entsprechend dafür sorgen kann bisher nicht ausgeführte Befehle des Programmablaufes zu stornieren. Hierfür ist die for-Schleife am Anfang des Macros gedacht und deckt per Default 10 Arbeitsschritte ab (ansonsten einfach die Zahl entsprechend erhöhen).&lt;br /&gt;
&lt;br /&gt;
Das Macro Template hat bereits alle oben beschriebenen Funktionen als auskommentierte FHEM Befehle enthalten. Diese sollen natürlich nur dem Beispiel und der eigenen Inspiration dienen. Wir müssten diese an dieser Stelle lediglich einkommentieren...&lt;br /&gt;
Insgesamt fällt bei genauerem hinsehen folgendes auf:&lt;br /&gt;
&lt;br /&gt;
* es stehen bestimmte Umgebungsvariablen bereit, die während des Programmablaufes genutzt werden können&lt;br /&gt;
* das Macro ist in 3 Bereiche unterteilt und nutzt dafür die Umgebungsvariable $EVTPART0 bzw. ob deren Wert auf &amp;quot;start&amp;quot; oder &amp;quot;stop&amp;quot; steht&lt;br /&gt;
* der erste Bereich mit der for-Schleife wird immer ausgeführt. Sie räumt durch das Macro erzeugte temporäre at-Devices auf (entweder weil das Programm früher beendet werden soll oder von vorne beginnen soll)&lt;br /&gt;
* der zweite Bereich &amp;quot;start&amp;quot; führt erste FHEM Befehle direkt nach dem Beginn des Weckprogramms aus. Außerdem werden weitere Befehle in bestimmten Etappen zur zeitversetzten Ausführung vorgemerkt. Dafür werden temporär erzeugte at-Devices verwendet.&lt;br /&gt;
* der Name der at-Devices folgt einem bestimmten Schema, nämlich atTmp_&amp;lt;LAUFENDE-NUMMER&amp;gt;_$NAME. Die laufende Nummer muss man manuell hochzählen, der Rest kann einfach kopiert werden. Dadurch wird das aufräumen oben im Macro einfacher.&lt;br /&gt;
* bei der Definition der at-Devices müssen mehrere FHEM Befehle hintereinander mit 2 Semikolon statt einem getrennt werden (siehe auch [http://fhem.de/commandref_DE.html#command Kommando-Referenz]).&lt;br /&gt;
* bei bedingten Schaltungen empfehlt es sich für übersichtlicheren Code die :FILTER Funktion zu nutzen (siehe auch [http://fhem.de/commandref_DE.html#devspec Kommando-Referenz]).&lt;br /&gt;
* es ist unbedingt darauf zu achten, dass das letzte at-Device nicht nach der wakeupOffset Zeit definiert wird, da es ansonsten automatisch gelöscht und somit nicht mehr ausgeführt wird&lt;br /&gt;
* nach einem ordentlichen Ende des Weckprogramms wird ein at-Device erzeugt, welches das Benutzer-Device automatisch nach &amp;quot;awoken&amp;quot; oder &amp;quot;home&amp;quot; schaltet, abhängig davon ob das Wecken forciert werden soll oder nicht. Dieser Teil wird tatsächlich nur geplant, wenn das Weckprogramm ordentlich beendet wurde. Wurde das Weckprogramm durch ein &amp;quot;set rr_Julian_wakeuptimer1 stop&amp;quot; bzw. durch Klick auf das blaue Device-Icon beendet, so werden die Post-Wakeup Befehle nicht mehr ausgeführt, weil man davon ausgehen kann, dass ein Abbruch des Programms und somit aller seiner weiteren Schaltungen gewünscht ist.&lt;br /&gt;
&lt;br /&gt;
Man kann sein Weckprogramm auf zwei Arten testen:&lt;br /&gt;
&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;trigger&amp;quot;: hier werden die aktuellen Auslösedefinitionen berücksichtigt; sprich, wenn heute nicht der richtige Tag ist, wird das Programm nicht gestartet&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;start&amp;quot; kann man alle Auslösedefinitionen umgehen und das Weckprogramm direkt auslösen&lt;br /&gt;
&lt;br /&gt;
Zu Debug-Zwecken kann man auf das Wecker Dummy-Device das Attribut &amp;quot;verbose&amp;quot; auf 4 setzen. Im Logfile wird dann sehr ausführlich geloggt, warum wie geschaltet oder nicht geschaltet wird und wie die Entscheidungen getroffen worden sind, Readings zu aktualisieren etc. Damit lässt sich prüfen, ob das gewünschte Auslöseverhalten tatsächlich richtig funktioniert.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;bettfertig machen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Möchte der Bewohner nun ins Bett gehen und sich dabei noch etwas darauf einstimmen, kann er sein &amp;quot;bettfertig machen&amp;quot;-Programm dadurch starten, dass er den Status seines ROOMMATE-Devices in FHEM auf &amp;quot;gotosleep&amp;quot; setzt.&lt;br /&gt;
In unserem Beispiel werden dann die Aktionen aus Macro_rr_Julian_gotosleep ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich wird im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;gotosleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;gotosleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_gotosleep aus. Dort werden dann Schaltungen vorgenommen, die von größerer Tragweite sind, als wenn nur ein einzelner Bewohner ins Bett geht. Beispielsweise könnte man in bestimmten Räumen das Licht oder Geräte ausschalten, die man ansonsten unberührt gelassen hätte, wenn andere noch wach blieben.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;schlafen legen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Legt sich der Bewohner ins Bett und möchte schlafen, wechselt er den Status seines ROOMMATE-Devices auf &amp;quot;asleep&amp;quot;. Ich mache das bei mir durch einen extra Wandschalter.&lt;br /&gt;
&lt;br /&gt;
In unserem Beispiel werden jetzt die Aktionen aus Macro_rr_Julian_asleep ausgeführt. In dem Macro wird besonders Wert darauf gelegt, dass ausschließlich Aktionen ausgeführt werden, die mit dem Schlafzimmer des Bewohners zu tun haben, damit andere Bewohner in anderen Räumen nicht beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich werden im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erniedrigt, das Reading &amp;quot;residentsAsleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;asleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;asleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_asleep aus. Dort werden dann auch wieder Schaltungen vorgenommen, die von größerer Tragweite sind. Beispielsweise werden alle noch übrigen Lichter im Haus ausgeschaltet und die Musikwiedergabe in Gemeinschaftsräumen (wie hier dem Badezimmer) gestoppt.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;aufgewacht sein&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Wir gehen nun davon aus, dass irgendwann morgens das Weckprogramm wie oben zuvor definiert abgespielt wird. Dabei wechselt im Device rgr_Bewohner das Reading residentsTotalWakeup auf 1 (oder höher bei mehreren gleichzeitig aktiven Weckprogrammen unterschiedlicher Bewohner).&lt;br /&gt;
&lt;br /&gt;
Während des Weckprogramms (oder natürlich auch davor) kann der Bewohner jederzeit in den Status &amp;quot;awoken&amp;quot; wechseln. Ich nutze bei mir auch hier wieder den Wandschalter.&lt;br /&gt;
Dadurch wird ein evtl. noch laufendes Weckprogramm unterbrochen (die at-Devices in FHEM werden automatisch aufgräumt) und die Aktionen in Macro_rr_Julian_awoken werden ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Neben dem expliziten Wechsel zum Status &amp;quot;awoken&amp;quot; kann aber, wie oben beschrieben, auch das Weckprogramm selbst den Bewohner auf diesen Status setzen. Dies wird dann als forciertes Wecken bezeichnet; sozusagen um seinen Hintern aus dem Bett zu bewegen :-)&lt;br /&gt;
Sinnvollerweise wechselt der Status des Bewohners nach kurzer Zeit dann automatisch von &amp;quot;awoken&amp;quot; auf &amp;quot;home&amp;quot;, also den Standard-Status wenn man zuhause ist.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich zum Wechsel des ROOMMATE-Devices auf &amp;quot;awoken&amp;quot; wird auch wieder das RESIDENTS-Device automatisch angepasst: Das Reading &amp;quot;residentsAsleep&amp;quot; wird um 1 erniedrigt, das Reading &amp;quot;residentsAwoken&amp;quot; um 1 erhöht und ein Event erzeugt. &lt;br /&gt;
Außerdem wird der Gesamtstatus auf &amp;quot;awoken&amp;quot; gesetzt. Dies löst Macro_rgr_Bewohner_awoken aus. Hier werden auch wieder Schaltungen vorgenommen, die das Haus dann für den ersten, der aufsteht, entsprechend einzustellen, also beispielsweise das Licht in der Küche einschalten.&lt;br /&gt;
Zusätzlich wird dann ein temporäres at-Devices angelegt, welches dafür sorgt, dass der Haus Modus nach 1,5h von &amp;quot;Morgen&amp;quot; auf &amp;quot;Tag&amp;quot; wechselt. Allerdings ist der Haus Modus wie schon erwähnt hier nicht das Hauptthema und wird aktuell auch noch nicht direkt vom RESIDENTS Toolkit unterstützt (Sneak-Peek auf zukünftige Erweiterungen ;-)).&lt;br /&gt;
&lt;br /&gt;
== Snooze Funktion bei SONOS ==&lt;br /&gt;
&lt;br /&gt;
Damit man an gewissen Tagen auch dem Wecker mal auf&#039;n Kopp hauen kann (bzw. auf den Start/Stop Button am SONOS Gerät), kann man ein einfaches DOIF erzeugen, welches dafür sorgt, dass man nach 5 Minuten wieder daran erinnert wird aufzustehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Sonos_Snooze DOIF (&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and (&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	) or&lt;br /&gt;
	(&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSEIF&lt;br /&gt;
(&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and&lt;br /&gt;
	([Sonos_Bedroom:transportState] eq &amp;quot;STOPPED&amp;quot; or [Sonos_Bedroom:transportState] eq &amp;quot;PAUSED_PLAYBACK&amp;quot;) and&lt;br /&gt;
	([?rr_Julian:wakeup] == 1 or [rr_Julian:wakeup:sec] &amp;lt; 600) and&lt;br /&gt;
	!$we&lt;br /&gt;
)&lt;br /&gt;
(&lt;br /&gt;
	set Sonos_Bedroom:FILTER=transportState!=PLAYING Play&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSE&lt;br /&gt;
&lt;br /&gt;
attr alias Automation: Sonos Snoozing&lt;br /&gt;
attr cmdState off|on|standby&lt;br /&gt;
attr comment snooze function for wake-up program via SONOS device button&lt;br /&gt;
attr devStateIcon off:general_aus on:general_an@green standby:general_an@orange&lt;br /&gt;
attr wait 0:300:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das DOIF hier greift nur während ein Weckprogramm läuft oder maximal noch 10 Minuten danach; zudem nur wochentags :-)&lt;br /&gt;
&lt;br /&gt;
Außerdem zeigt der DOIF Status an, ob die Snooze Funktion gerade scharf geschaltet ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass das ROOMMATE Device ein Event bei der Änderung des wakeup Readings auslöst, also z.B. das Attribut event-on-change-reading dann entsprechend auch &amp;quot;wakeup&amp;quot; enthält.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21230</id>
		<title>Weckautomation</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21230"/>
		<updated>2017-04-09T10:55:21Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Wake-up Timer 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Module ROOMMATE und GUEST können dazu genutzt werden, Bewohner und Gäste in FHEM als ein Device zu repräsentieren und durch Events deren Status zu erfassen bzw. zu ändern (beispielsweise durch das GEOFANCY Modul für [[Anwesenheitserkennung]]). Das zur Modulfamilie dazugehörige Modul RESIDENTS fasst die Status mehrerer Bewohner logisch zusammen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen unterstützen die Module auch bei der Erstellung einer Weckautomation, indem sie die Logik kapseln und häufig verwendete Standardfunktionen bereitstellen. Die Verwendung soll in diesem Artikel anhand eines Beispiels näher erläutert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Weckprogramm_Ergebnisdarstellung.png|500px|thumb|right|Darstellung der Beispiel-Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
== Was soll erreicht werden? ==&lt;br /&gt;
&lt;br /&gt;
Hier ein kurzer Überblick über die Funktionen, die wir am Ende realisiert haben werden:&lt;br /&gt;
&lt;br /&gt;
; 3 unterschiedliche Wecker&lt;br /&gt;
: 1 für Werktage Mo-Fr&lt;br /&gt;
: 1 für werktägliche Samstage&lt;br /&gt;
: 1 für Sonn- und Feiertage&lt;br /&gt;
; Automatischer Reset der Weckzeiten&lt;br /&gt;
: werktäglicher Wecker soll auf einen Standardwert zurückstellen, falls er mal verstellt wurde&lt;br /&gt;
: automatischer Reset des werktäglicher Weckers soll zeitweise abschaltbar sein&lt;br /&gt;
: nach einem Sonn- oder Feiertagen soll der automatische Reset des werktäglichen Weckers immer wieder eingeschaltet werden&lt;br /&gt;
: die Samstags- und Sonntags-Wecker sollen immer nach ihrer Ausführung resettet werden&lt;br /&gt;
; jeder Wecker startet ein Weckprogramm 30 Minuten vor der programmierten Zeit&lt;br /&gt;
: langsames hochfahren der Rollläden&lt;br /&gt;
: Wakeup Light über eine HUE Birne von Warmweiß/2000K zu Kaltweiß/5600K&lt;br /&gt;
: an Werktagen: Chillout Weckmusik wird langsam lauter gestellt&lt;br /&gt;
: Snooze Funktion über die SONOS Taste am Gerät an Werktagen (erneutes Play nach 5 Minuten)&lt;br /&gt;
: forciertes Aufstehen an Werktagen durch automatischen Wechsel des Bewohner Devices zu &amp;quot;awake&amp;quot; und dadurch starten der &amp;quot;aufgewacht sein&amp;quot; Prozesse (siehe unten)&lt;br /&gt;
; Starten des Weckprogramms nur bei tatsächlicher Anwesenheit des betroffenen Bewohners&lt;br /&gt;
; Ansage der Uhrzeit zur gewählten Weckzeit&lt;br /&gt;
; Prozess / Automation für:&lt;br /&gt;
: &amp;lt;u&amp;gt;bettfein machen&amp;lt;/u&amp;gt;: Lichtszene setzen, Chillout Musik in Schlafzimmer und Badezimmer abspielen&lt;br /&gt;
: &amp;lt;u&amp;gt;schlafen legen&amp;lt;/u&amp;gt;: Ansage der eingestellten Weckzeit &amp;amp; Ausschalten aller Verbraucher&lt;br /&gt;
: &amp;lt;u&amp;gt;aufgewacht sein&amp;lt;/u&amp;gt;: Ansage Raumluftqualität, Wettervorhersage; Lokalradio einschalten und in Räume verteilen; Küchenlicht an, HUE in Schlafzimmer mit Aufwach-Farbtemperatur&lt;br /&gt;
; Berücksichtigung / Steuerung des Haus Modus&lt;br /&gt;
: Wechsel zwischen Morgen-, Tag-, Abend- und Nacht-Modus entsprechend der Schlafgewohnheiten (zusätzlich zur Tageszeit abhängigen Steuerung/Umschaltung, die hier aber nicht Thema sein soll)&lt;br /&gt;
; Statuswerte, Events, Readings und Funktionen:&lt;br /&gt;
: Wurde ein Wecker ausgelöst?&lt;br /&gt;
: Ist gerade ein Weckprogramm aktiv?&lt;br /&gt;
: Abbrechen/sofortiges beenden des Weckprogramms&lt;br /&gt;
: Verhindern von durch Fehlkonfiguration parallel ausgeführten Weckern für die selbe Person&lt;br /&gt;
: Welcher ist der nächste Wecker, der bis Mitternacht des nächsten Tages ausgeführt wird und wann ist das?&lt;br /&gt;
: Wann wurde ein Wecker zuletzt ausgeführt und welcher Wecker wurde überhaupt zuletzt ausgeführt?&lt;br /&gt;
: Wie viele Bewohner werden gerade geweckt?&lt;br /&gt;
: Wie viele Bewohner sind gerade aufgewacht?&lt;br /&gt;
: Schaltung bei erstem Bewohner, der geweckt wird&lt;br /&gt;
: Schaltung bei erstem Bewohner, der aufgewacht ist&lt;br /&gt;
; Statistik&lt;br /&gt;
: Wie lange dauerte der Schlaf des Bewohners?&lt;br /&gt;
: Wie lange war in dem Haus niemand wach?&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei zu erwähnen ist, dass die Prozesse so umgesetzt worden sind, dass Bewohner sowohl zeitgleich, als auch zeitversetzt oder komplett getrennt ins Bett gehen und aufwachen können.&lt;br /&gt;
Dafür werden einige Schaltungen pro Bewohner und dessen Schlafzimmer vorgenommen und andere erst dann, wenn die RESIDENTS Bewohnergruppe einen bestimmten Status erreicht hat.&lt;br /&gt;
&lt;br /&gt;
== Notwendige Devices anlegen ==&lt;br /&gt;
&lt;br /&gt;
=== RESIDENTS und ROOMMATE Devices ===&lt;br /&gt;
Wir starten mit einem RESIDENTS Device, um die Bewohner Status später logisch zusammenfassen zu können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define rgr_Bewohner RESIDENTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend legen wir pro Bewohner ein ROOMMATE Device an. Dafür verwenden wir eine Funktion, die in RESIDENTS eingebaut ist und die Devices korrekt untereinander verbindet (die Reihenfolge, in der RESIDENTS und ROOMMATE/GUEST Geräte definiert werden, sind hier entscheidend). Der Einfachheit halber definieren wir in diesem Beispiel nur einen Bewohner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rgr_Bewohner addRoommate Julian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wurde nun automatisch ein Device namens &amp;quot;rr_Julian&amp;quot; angelegt (abgeleitet aus dem angegebenen Vornamen aus dem addRoommate Befehl).&lt;br /&gt;
Anschließend setzen wir einmalig den initialen Status für die Bewohner mittels set Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der automatische Wechsel des Status bei Anwesenheit/Abwesenheit wird hier nicht weiter thematisiert, hier sei auf den Artikel [[Anwesenheitserkennung]] verwiesen, insbesondere den GEOFANCY Teil.&lt;br /&gt;
&lt;br /&gt;
=== Wecker Devices anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die Devices, über die die Weckzeit und das Auslöseverhalten eingestellt werden, sind eigentlich normale Dummy Devices. Das zugewiesene ROOMMATE/GUEST/RESIDENTS Device &amp;quot;versklavt&amp;quot; diese Geräte jedoch und führt bestimmte Befehle zur Wecksteuerung und -Verwaltung aus, sobald das Dummy-Device geändert wird. Der Vorteil dabei ist, dass man sich eine Menge eigenen Code und viele unterschiedliche Notify und Dummy Devices spart, was wiederum der Übersichtlichkeit zu Gute kommt.&lt;br /&gt;
&lt;br /&gt;
Wir legen nun unsere drei Wecker für unseren Beispiel Bewohner an. Dafür führen wir einfach 3 mal den selben Befehl hintereinander aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Logdatei erscheinen verschiedene Meldungen über alle automatisch angelegte Devices inkl. Name und Typ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015.03.28 12:19:49 3: RESIDENTStk rr_Julian_wakeuptimer1: new notify macro device Macro_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new at-device at_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_awoken created&lt;br /&gt;
2015.03.28 12:19:51 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new notify macro device Macro_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new at-device at_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new notify macro device Macro_rr_Julian_wakeuptimer3 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new at-device at_rr_Julian_wakeuptimer3 created&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Rückgabe in FHEMWEB erhält man eine Meldung wie diese hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dummy rr_Julian_wakeuptimer1 and other pending devices created and pre-configured. &lt;br /&gt;
You may edit Macro_rr_Julian_wakeuptimer1 to define your wake-up actions &lt;br /&gt;
and at_rr_Julian_wakeuptimer1 for optional at-device adjustments.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht wurden anfänglich eine ganze Menge von Notify-Macros und Watchdogs sowie ein at-Device pro Wecker angelegt.&lt;br /&gt;
Dabei sind vor allem die Macro-Devices und die Wecker Dummy Devices interessant. Hier werden Weck- und Auslöseverhalten konfiguriert. die at- und Watchdog-Devices können aber für fortgeschrittene Nutzer beliebig angepasst werden. Auch die Dummy Devices können bis auf wenige Ausnahmen (Attribut &amp;quot;userattr&amp;quot;) vollständig umkonfiguriert werden. Wer Devices umbenennt, sollte unbedingt darauf achten, dass auch das entsprechende Attribut im Wecker-Dummy-Device angepasst wird.&lt;br /&gt;
&lt;br /&gt;
Allen Devices ist ein entsprechender Kommentar hinzugefügt, der dessen Funktion kurz erklärt.&lt;br /&gt;
Alle Macros enthalten bereits ein Gerüst für den Weckprozess mit einigen Beispielen. Die Beispielschaltungen sind dabei noch auskommentiert. Nicht auskommentierter Code sollte als notwendiger Teil für die Weckautomation betrachtet werden und wird dort auch durch einen entsprechenden Kommentar erklärt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir jetzt Schritt für Schritt das oben beschriebene Szenario konfigurieren.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Auslöseverhaltens ==&lt;br /&gt;
&lt;br /&gt;
In der Grundkonfiguration löst jeder Wecker sein eigenes Weckprogramm täglich zur voreingestellten Zeit aus. Dabei wird allerdings kein längeres Programm gestartet, sondern lediglich einmalig das im Attribut wakeupMacro hinterlegte Notify-Macro getriggert. Das ist in der Beispiel-Grundkonfiguration kein Problem und lässt lediglich einen Logfile Eintrag erstellen.&lt;br /&gt;
&lt;br /&gt;
Als erstes möchten wir, dass alle 3 Timer das selbe Macro zum Wecken verwenden, damit wir den Code nur einmal pflegen müssen. Die anderen beiden Macros löschen wir anschließend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer2&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun konfigurieren wir die Auslöseverhalten so, wie wir es oben vorgegeben haben:&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 1 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Mo-Fr auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Hierfür muss ein [http://fhem.de/commandref.html#holiday holiday-Device] erstellt sein und in der global Config im Attribut &#039;holidays2we‘ verlinkt sein. Ansonsten erhält man beim setzen einer Weckzeit später entsprechende Fehlermeldungen, die darauf hinweisen.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupEnforced 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDefaultTime 07:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetdays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Ein Reset findet normalerweise nach jeder Auslösung statt, sprich wenn das Weckprogramm tatsächlich gestartet wurde. Dies kann man auf bestimmte Tage einschränken.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum einfacheren Aktivieren/Deaktivieren des Resets wollen wir ein weiteres Dummy nutzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetSwitcher rr_Julian_wakeuptimer1_resetswitcher&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Der Dummy-Gerätename kann frei gewählt werden. Sofern es nicht existiert wird es automatisch angelegt und vorkonfiguriert.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 2 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Samstags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupEnforce 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDefaultTime 09:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupResetdays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 3 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Sonntags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDays 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auch an Feiertagen ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupHolidays orHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen nur forcieren, wenn eine frühere Weckzeit als die Standard Weckzeit eingestellt wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupEnforce 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDefaultTime 10:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition des Weckprogramms ==&lt;br /&gt;
&lt;br /&gt;
Die Aktionen, welche innerhalb der 30 Minuten Weckzeitraum abgearbeitet werden sollen, sind im Device Macro_rr_Julian_wakeuptimer1 hinterlegt.&lt;br /&gt;
Dieses Macro wird 2 Mal aufgerufen: Das erste Mal beim Beginn des Weckprogramms und ein zweites Mal beim Ende des Weckprogramms. Der Hintergrund ist, dass das Macro beim Beenden dann entsprechend dafür sorgen kann bisher nicht ausgeführte Befehle des Programmablaufes zu stornieren. Hierfür ist die for-Schleife am Anfang des Macros gedacht und deckt per Default 10 Arbeitsschritte ab (ansonsten einfach die Zahl entsprechend erhöhen).&lt;br /&gt;
&lt;br /&gt;
Das Macro Template hat bereits alle oben beschriebenen Funktionen als auskommentierte FHEM Befehle enthalten. Diese sollen natürlich nur dem Beispiel und der eigenen Inspiration dienen. Wir müssten diese an dieser Stelle lediglich einkommentieren...&lt;br /&gt;
Insgesamt fällt bei genauerem hinsehen folgendes auf:&lt;br /&gt;
&lt;br /&gt;
* es stehen bestimmte Umgebungsvariablen bereit, die während des Programmablaufes genutzt werden können&lt;br /&gt;
* das Macro ist in 3 Bereiche unterteilt und nutzt dafür die Umgebungsvariable $EVTPART0 bzw. ob deren Wert auf &amp;quot;start&amp;quot; oder &amp;quot;stop&amp;quot; steht&lt;br /&gt;
* der erste Bereich mit der for-Schleife wird immer ausgeführt. Sie räumt durch das Macro erzeugte temporäre at-Devices auf (entweder weil das Programm früher beendet werden soll oder von vorne beginnen soll)&lt;br /&gt;
* der zweite Bereich &amp;quot;start&amp;quot; führt erste FHEM Befehle direkt nach dem Beginn des Weckprogramms aus. Außerdem werden weitere Befehle in bestimmten Etappen zur zeitversetzten Ausführung vorgemerkt. Dafür werden temporär erzeugte at-Devices verwendet.&lt;br /&gt;
* der Name der at-Devices folgt einem bestimmten Schema, nämlich atTmp_&amp;lt;LAUFENDE-NUMMER&amp;gt;_$NAME. Die laufende Nummer muss man manuell hochzählen, der Rest kann einfach kopiert werden. Dadurch wird das aufräumen oben im Macro einfacher.&lt;br /&gt;
* bei der Definition der at-Devices müssen mehrere FHEM Befehle hintereinander mit 2 Semikolon statt einem getrennt werden (siehe auch [http://fhem.de/commandref_DE.html#command Kommando-Referenz]).&lt;br /&gt;
* bei bedingten Schaltungen empfehlt es sich für übersichtlicheren Code die :FILTER Funktion zu nutzen (siehe auch [http://fhem.de/commandref_DE.html#devspec Kommando-Referenz]).&lt;br /&gt;
* es ist unbedingt darauf zu achten, dass das letzte at-Device nicht nach der wakeupOffset Zeit definiert wird, da es ansonsten automatisch gelöscht und somit nicht mehr ausgeführt wird&lt;br /&gt;
* nach einem ordentlichen Ende des Weckprogramms wird ein at-Device erzeugt, welches das Benutzer-Device automatisch nach &amp;quot;awoken&amp;quot; oder &amp;quot;home&amp;quot; schaltet, abhängig davon ob das Wecken forciert werden soll oder nicht. Dieser Teil wird tatsächlich nur geplant, wenn das Weckprogramm ordentlich beendet wurde. Wurde das Weckprogramm durch ein &amp;quot;set rr_Julian_wakeuptimer1 stop&amp;quot; bzw. durch Klick auf das blaue Device-Icon beendet, so werden die Post-Wakeup Befehle nicht mehr ausgeführt, weil man davon ausgehen kann, dass ein Abbruch des Programms und somit aller seiner weiteren Schaltungen gewünscht ist.&lt;br /&gt;
&lt;br /&gt;
Man kann sein Weckprogramm auf zwei Arten testen:&lt;br /&gt;
&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;trigger&amp;quot;: hier werden die aktuellen Auslösedefinitionen berücksichtigt; sprich, wenn heute nicht der richtige Tag ist, wird das Programm nicht gestartet&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;start&amp;quot; kann man alle Auslösedefinitionen umgehen und das Weckprogramm direkt auslösen&lt;br /&gt;
&lt;br /&gt;
Zu Debug-Zwecken kann man auf das Wecker Dummy-Device das Attribut &amp;quot;verbose&amp;quot; auf 4 setzen. Im Logfile wird dann sehr ausführlich geloggt, warum wie geschaltet oder nicht geschaltet wird und wie die Entscheidungen getroffen worden sind, Readings zu aktualisieren etc. Damit lässt sich prüfen, ob das gewünschte Auslöseverhalten tatsächlich richtig funktioniert.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;bettfein machen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Möchte der Bewohner nun ins Bett gehen und sich dabei noch etwas darauf einstimmen, kann er sein &amp;quot;bettfein machen&amp;quot;-Programm dadurch starten, dass er den Status seines ROOMMATE-Devices in FHEM auf &amp;quot;gotosleep&amp;quot; setzt.&lt;br /&gt;
In unserem Beispiel werden dann die Aktionen aus Macro_rr_Julian_gotosleep ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich wird im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;gotosleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;gotosleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_gotosleep aus. Dort werden dann Schaltungen vorgenommen, die von größerer Tragweite sind, als wenn nur ein einzelner Bewohner ins Bett geht. Beispielsweise könnte man in bestimmten Räumen das Licht oder Geräte ausschalten, die man ansonsten unberührt gelassen hätte, wenn andere noch wach blieben.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;schlafen legen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Legt sich der Bewohner ins Bett und möchte schlafen, wechselt er den Status seines ROOMMATE-Devices auf &amp;quot;asleep&amp;quot;. Ich mache das bei mir durch einen extra Wandschalter.&lt;br /&gt;
&lt;br /&gt;
In unserem Beispiel werden jetzt die Aktionen aus Macro_rr_Julian_asleep ausgeführt. In dem Macro wird besonders Wert darauf gelegt, dass ausschließlich Aktionen ausgeführt werden, die mit dem Schlafzimmer des Bewohners zu tun haben, damit andere Bewohner in anderen Räumen nicht beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich werden im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erniedrigt, das Reading &amp;quot;residentsAsleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;asleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;asleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_asleep aus. Dort werden dann auch wieder Schaltungen vorgenommen, die von größerer Tragweite sind. Beispielsweise werden alle noch übrigen Lichter im Haus ausgeschaltet und die Musikwiedergabe in Gemeinschaftsräumen (wie hier dem Badezimmer) gestoppt.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;aufgewacht sein&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Wir gehen nun davon aus, dass irgendwann morgens das Weckprogramm wie oben zuvor definiert abgespielt wird. Dabei wechselt im Device rgr_Bewohner das Reading residentsTotalWakeup auf 1 (oder höher bei mehreren gleichzeitig aktiven Weckprogrammen unterschiedlicher Bewohner).&lt;br /&gt;
&lt;br /&gt;
Während des Weckprogramms (oder natürlich auch davor) kann der Bewohner jederzeit in den Status &amp;quot;awoken&amp;quot; wechseln. Ich nutze bei mir auch hier wieder den Wandschalter.&lt;br /&gt;
Dadurch wird ein evtl. noch laufendes Weckprogramm unterbrochen (die at-Devices in FHEM werden automatisch aufgräumt) und die Aktionen in Macro_rr_Julian_awoken werden ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Neben dem expliziten Wechsel zum Status &amp;quot;awoken&amp;quot; kann aber, wie oben beschrieben, auch das Weckprogramm selbst den Bewohner auf diesen Status setzen. Dies wird dann als forciertes Wecken bezeichnet; sozusagen um seinen Hintern aus dem Bett zu bewegen :-)&lt;br /&gt;
Sinnvollerweise wechselt der Status des Bewohners nach kurzer Zeit dann automatisch von &amp;quot;awoken&amp;quot; auf &amp;quot;home&amp;quot;, also den Standard-Status wenn man zuhause ist.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich zum Wechsel des ROOMMATE-Devices auf &amp;quot;awoken&amp;quot; wird auch wieder das RESIDENTS-Device automatisch angepasst: Das Reading &amp;quot;residentsAsleep&amp;quot; wird um 1 erniedrigt, das Reading &amp;quot;residentsAwoken&amp;quot; um 1 erhöht und ein Event erzeugt. &lt;br /&gt;
Außerdem wird der Gesamtstatus auf &amp;quot;awoken&amp;quot; gesetzt. Dies löst Macro_rgr_Bewohner_awoken aus. Hier werden auch wieder Schaltungen vorgenommen, die das Haus dann für den ersten, der aufsteht, entsprechend einzustellen, also beispielsweise das Licht in der Küche einschalten.&lt;br /&gt;
Zusätzlich wird dann ein temporäres at-Devices angelegt, welches dafür sorgt, dass der Haus Modus nach 1,5h von &amp;quot;Morgen&amp;quot; auf &amp;quot;Tag&amp;quot; wechselt. Allerdings ist der Haus Modus wie schon erwähnt hier nicht das Hauptthema und wird aktuell auch noch nicht direkt vom RESIDENTS Toolkit unterstützt (Sneak-Peek auf zukünftige Erweiterungen ;-)).&lt;br /&gt;
&lt;br /&gt;
== Snooze Funktion bei SONOS ==&lt;br /&gt;
&lt;br /&gt;
Damit man an gewissen Tagen auch dem Wecker mal auf&#039;n Kopp hauen kann (bzw. auf den Start/Stop Button am SONOS Gerät), kann man ein einfaches DOIF erzeugen, welches dafür sorgt, dass man nach 5 Minuten wieder daran erinnert wird aufzustehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Sonos_Snooze DOIF (&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and (&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	) or&lt;br /&gt;
	(&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSEIF&lt;br /&gt;
(&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and&lt;br /&gt;
	([Sonos_Bedroom:transportState] eq &amp;quot;STOPPED&amp;quot; or [Sonos_Bedroom:transportState] eq &amp;quot;PAUSED_PLAYBACK&amp;quot;) and&lt;br /&gt;
	([?rr_Julian:wakeup] == 1 or [rr_Julian:wakeup:sec] &amp;lt; 600) and&lt;br /&gt;
	!$we&lt;br /&gt;
)&lt;br /&gt;
(&lt;br /&gt;
	set Sonos_Bedroom:FILTER=transportState!=PLAYING Play&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSE&lt;br /&gt;
&lt;br /&gt;
attr alias Automation: Sonos Snoozing&lt;br /&gt;
attr cmdState off|on|standby&lt;br /&gt;
attr comment snooze function for wake-up program via SONOS device button&lt;br /&gt;
attr devStateIcon off:general_aus on:general_an@green standby:general_an@orange&lt;br /&gt;
attr wait 0:300:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das DOIF hier greift nur während ein Weckprogramm läuft oder maximal noch 10 Minuten danach; zudem nur wochentags :-)&lt;br /&gt;
&lt;br /&gt;
Außerdem zeigt der DOIF Status an, ob die Snooze Funktion gerade scharf geschaltet ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass das ROOMMATE Device ein Event bei der Änderung des wakeup Readings auslöst, also z.B. das Attribut event-on-change-reading dann entsprechend auch &amp;quot;wakeup&amp;quot; enthält.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21229</id>
		<title>Weckautomation</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Weckautomation&amp;diff=21229"/>
		<updated>2017-04-09T10:55:10Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Wake-up Timer 3 */ wakeupEnforce hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Module ROOMMATE und GUEST können dazu genutzt werden, Bewohner und Gäste in FHEM als ein Device zu repräsentieren und durch Events deren Status zu erfassen bzw. zu ändern (beispielsweise durch das GEOFANCY Modul für [[Anwesenheitserkennung]]). Das zur Modulfamilie dazugehörige Modul RESIDENTS fasst die Status mehrerer Bewohner logisch zusammen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen unterstützen die Module auch bei der Erstellung einer Weckautomation, indem sie die Logik kapseln und häufig verwendete Standardfunktionen bereitstellen. Die Verwendung soll in diesem Artikel anhand eines Beispiels näher erläutert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Weckprogramm_Ergebnisdarstellung.png|500px|thumb|right|Darstellung der Beispiel-Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
== Was soll erreicht werden? ==&lt;br /&gt;
&lt;br /&gt;
Hier ein kurzer Überblick über die Funktionen, die wir am Ende realisiert haben werden:&lt;br /&gt;
&lt;br /&gt;
; 3 unterschiedliche Wecker&lt;br /&gt;
: 1 für Werktage Mo-Fr&lt;br /&gt;
: 1 für werktägliche Samstage&lt;br /&gt;
: 1 für Sonn- und Feiertage&lt;br /&gt;
; Automatischer Reset der Weckzeiten&lt;br /&gt;
: werktäglicher Wecker soll auf einen Standardwert zurückstellen, falls er mal verstellt wurde&lt;br /&gt;
: automatischer Reset des werktäglicher Weckers soll zeitweise abschaltbar sein&lt;br /&gt;
: nach einem Sonn- oder Feiertagen soll der automatische Reset des werktäglichen Weckers immer wieder eingeschaltet werden&lt;br /&gt;
: die Samstags- und Sonntags-Wecker sollen immer nach ihrer Ausführung resettet werden&lt;br /&gt;
; jeder Wecker startet ein Weckprogramm 30 Minuten vor der programmierten Zeit&lt;br /&gt;
: langsames hochfahren der Rollläden&lt;br /&gt;
: Wakeup Light über eine HUE Birne von Warmweiß/2000K zu Kaltweiß/5600K&lt;br /&gt;
: an Werktagen: Chillout Weckmusik wird langsam lauter gestellt&lt;br /&gt;
: Snooze Funktion über die SONOS Taste am Gerät an Werktagen (erneutes Play nach 5 Minuten)&lt;br /&gt;
: forciertes Aufstehen an Werktagen durch automatischen Wechsel des Bewohner Devices zu &amp;quot;awake&amp;quot; und dadurch starten der &amp;quot;aufgewacht sein&amp;quot; Prozesse (siehe unten)&lt;br /&gt;
; Starten des Weckprogramms nur bei tatsächlicher Anwesenheit des betroffenen Bewohners&lt;br /&gt;
; Ansage der Uhrzeit zur gewählten Weckzeit&lt;br /&gt;
; Prozess / Automation für:&lt;br /&gt;
: &amp;lt;u&amp;gt;bettfein machen&amp;lt;/u&amp;gt;: Lichtszene setzen, Chillout Musik in Schlafzimmer und Badezimmer abspielen&lt;br /&gt;
: &amp;lt;u&amp;gt;schlafen legen&amp;lt;/u&amp;gt;: Ansage der eingestellten Weckzeit &amp;amp; Ausschalten aller Verbraucher&lt;br /&gt;
: &amp;lt;u&amp;gt;aufgewacht sein&amp;lt;/u&amp;gt;: Ansage Raumluftqualität, Wettervorhersage; Lokalradio einschalten und in Räume verteilen; Küchenlicht an, HUE in Schlafzimmer mit Aufwach-Farbtemperatur&lt;br /&gt;
; Berücksichtigung / Steuerung des Haus Modus&lt;br /&gt;
: Wechsel zwischen Morgen-, Tag-, Abend- und Nacht-Modus entsprechend der Schlafgewohnheiten (zusätzlich zur Tageszeit abhängigen Steuerung/Umschaltung, die hier aber nicht Thema sein soll)&lt;br /&gt;
; Statuswerte, Events, Readings und Funktionen:&lt;br /&gt;
: Wurde ein Wecker ausgelöst?&lt;br /&gt;
: Ist gerade ein Weckprogramm aktiv?&lt;br /&gt;
: Abbrechen/sofortiges beenden des Weckprogramms&lt;br /&gt;
: Verhindern von durch Fehlkonfiguration parallel ausgeführten Weckern für die selbe Person&lt;br /&gt;
: Welcher ist der nächste Wecker, der bis Mitternacht des nächsten Tages ausgeführt wird und wann ist das?&lt;br /&gt;
: Wann wurde ein Wecker zuletzt ausgeführt und welcher Wecker wurde überhaupt zuletzt ausgeführt?&lt;br /&gt;
: Wie viele Bewohner werden gerade geweckt?&lt;br /&gt;
: Wie viele Bewohner sind gerade aufgewacht?&lt;br /&gt;
: Schaltung bei erstem Bewohner, der geweckt wird&lt;br /&gt;
: Schaltung bei erstem Bewohner, der aufgewacht ist&lt;br /&gt;
; Statistik&lt;br /&gt;
: Wie lange dauerte der Schlaf des Bewohners?&lt;br /&gt;
: Wie lange war in dem Haus niemand wach?&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei zu erwähnen ist, dass die Prozesse so umgesetzt worden sind, dass Bewohner sowohl zeitgleich, als auch zeitversetzt oder komplett getrennt ins Bett gehen und aufwachen können.&lt;br /&gt;
Dafür werden einige Schaltungen pro Bewohner und dessen Schlafzimmer vorgenommen und andere erst dann, wenn die RESIDENTS Bewohnergruppe einen bestimmten Status erreicht hat.&lt;br /&gt;
&lt;br /&gt;
== Notwendige Devices anlegen ==&lt;br /&gt;
&lt;br /&gt;
=== RESIDENTS und ROOMMATE Devices ===&lt;br /&gt;
Wir starten mit einem RESIDENTS Device, um die Bewohner Status später logisch zusammenfassen zu können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define rgr_Bewohner RESIDENTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend legen wir pro Bewohner ein ROOMMATE Device an. Dafür verwenden wir eine Funktion, die in RESIDENTS eingebaut ist und die Devices korrekt untereinander verbindet (die Reihenfolge, in der RESIDENTS und ROOMMATE/GUEST Geräte definiert werden, sind hier entscheidend). Der Einfachheit halber definieren wir in diesem Beispiel nur einen Bewohner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rgr_Bewohner addRoommate Julian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wurde nun automatisch ein Device namens &amp;quot;rr_Julian&amp;quot; angelegt (abgeleitet aus dem angegebenen Vornamen aus dem addRoommate Befehl).&lt;br /&gt;
Anschließend setzen wir einmalig den initialen Status für die Bewohner mittels set Befehl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der automatische Wechsel des Status bei Anwesenheit/Abwesenheit wird hier nicht weiter thematisiert, hier sei auf den Artikel [[Anwesenheitserkennung]] verwiesen, insbesondere den GEOFANCY Teil.&lt;br /&gt;
&lt;br /&gt;
=== Wecker Devices anlegen ===&lt;br /&gt;
&lt;br /&gt;
Die Devices, über die die Weckzeit und das Auslöseverhalten eingestellt werden, sind eigentlich normale Dummy Devices. Das zugewiesene ROOMMATE/GUEST/RESIDENTS Device &amp;quot;versklavt&amp;quot; diese Geräte jedoch und führt bestimmte Befehle zur Wecksteuerung und -Verwaltung aus, sobald das Dummy-Device geändert wird. Der Vorteil dabei ist, dass man sich eine Menge eigenen Code und viele unterschiedliche Notify und Dummy Devices spart, was wiederum der Übersichtlichkeit zu Gute kommt.&lt;br /&gt;
&lt;br /&gt;
Wir legen nun unsere drei Wecker für unseren Beispiel Bewohner an. Dafür führen wir einfach 3 mal den selben Befehl hintereinander aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
set rr_Julian create wakeuptimer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Logdatei erscheinen verschiedene Meldungen über alle automatisch angelegte Devices inkl. Name und Typ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2015.03.28 12:19:49 3: RESIDENTStk rr_Julian_wakeuptimer1: new notify macro device Macro_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new at-device at_rr_Julian_wakeuptimer1 created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rgr_Bewohner_gotosleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_asleep created&lt;br /&gt;
2015.03.28 12:19:50 3: RESIDENTStk rr_Julian_wakeuptimer1: new macro device Macro_rgr_Bewohner_awoken created&lt;br /&gt;
2015.03.28 12:19:51 3: RESIDENTStk rr_Julian_wakeuptimer1: new watchdog device wd_rr_Julian_awoken created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new notify macro device Macro_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:49 3: RESIDENTStk rr_Julian_wakeuptimer2: new at-device at_rr_Julian_wakeuptimer2 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new notify macro device Macro_rr_Julian_wakeuptimer3 created&lt;br /&gt;
2015.03.28 12:21:56 3: RESIDENTStk rr_Julian_wakeuptimer3: new at-device at_rr_Julian_wakeuptimer3 created&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Rückgabe in FHEMWEB erhält man eine Meldung wie diese hier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dummy rr_Julian_wakeuptimer1 and other pending devices created and pre-configured. &lt;br /&gt;
You may edit Macro_rr_Julian_wakeuptimer1 to define your wake-up actions &lt;br /&gt;
and at_rr_Julian_wakeuptimer1 for optional at-device adjustments.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht wurden anfänglich eine ganze Menge von Notify-Macros und Watchdogs sowie ein at-Device pro Wecker angelegt.&lt;br /&gt;
Dabei sind vor allem die Macro-Devices und die Wecker Dummy Devices interessant. Hier werden Weck- und Auslöseverhalten konfiguriert. die at- und Watchdog-Devices können aber für fortgeschrittene Nutzer beliebig angepasst werden. Auch die Dummy Devices können bis auf wenige Ausnahmen (Attribut &amp;quot;userattr&amp;quot;) vollständig umkonfiguriert werden. Wer Devices umbenennt, sollte unbedingt darauf achten, dass auch das entsprechende Attribut im Wecker-Dummy-Device angepasst wird.&lt;br /&gt;
&lt;br /&gt;
Allen Devices ist ein entsprechender Kommentar hinzugefügt, der dessen Funktion kurz erklärt.&lt;br /&gt;
Alle Macros enthalten bereits ein Gerüst für den Weckprozess mit einigen Beispielen. Die Beispielschaltungen sind dabei noch auskommentiert. Nicht auskommentierter Code sollte als notwendiger Teil für die Weckautomation betrachtet werden und wird dort auch durch einen entsprechenden Kommentar erklärt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden wir jetzt Schritt für Schritt das oben beschriebene Szenario konfigurieren.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration des Auslöseverhaltens ==&lt;br /&gt;
&lt;br /&gt;
In der Grundkonfiguration löst jeder Wecker sein eigenes Weckprogramm täglich zur voreingestellten Zeit aus. Dabei wird allerdings kein längeres Programm gestartet, sondern lediglich einmalig das im Attribut wakeupMacro hinterlegte Notify-Macro getriggert. Das ist in der Beispiel-Grundkonfiguration kein Problem und lässt lediglich einen Logfile Eintrag erstellen.&lt;br /&gt;
&lt;br /&gt;
Als erstes möchten wir, dass alle 3 Timer das selbe Macro zum Wecken verwenden, damit wir den Code nur einmal pflegen müssen. Die anderen beiden Macros löschen wir anschließend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupMacro Macro_rr_Julian_wakeuptimer1&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer2&lt;br /&gt;
delete Macro_rr_Julian_wakeuptimer3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun konfigurieren wir die Auslöseverhalten so, wie wir es oben vorgegeben haben:&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 1 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Mo-Fr auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Hierfür muss ein [http://fhem.de/commandref.html#holiday holiday-Device] erstellt sein und in der global Config im Attribut &#039;holidays2we‘ verlinkt sein. Ansonsten erhält man beim setzen einer Weckzeit später entsprechende Fehlermeldungen, die darauf hinweisen.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupEnforced 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupDefaultTime 07:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetdays 1,2,3,4,5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Ein Reset findet normalerweise nach jeder Auslösung statt, sprich wenn das Weckprogramm tatsächlich gestartet wurde. Dies kann man auf bestimmte Tage einschränken.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum einfacheren Aktivieren/Deaktivieren des Resets wollen wir ein weiteres Dummy nutzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer1 wakeupResetSwitcher rr_Julian_wakeuptimer1_resetswitcher&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;Hinweis:&amp;lt;/u&amp;gt; Der Dummy-Gerätename kann frei gewählt werden. Sofern es nicht existiert wird es automatisch angelegt und vorkonfiguriert.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 2 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Samstags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auf Tage beschränken, die keine Feiertage sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupHolidays andNoHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen forcieren:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupEnforce 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupDefaultTime 09:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weckzeit nur an diesen Tagen automatisch zurückstellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupResetdays 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wake-up Timer 3 ===&lt;br /&gt;
&lt;br /&gt;
Wecker nur Sonntags auslösen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDays 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wecker zusätzlich auch an Feiertagen ausführen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupHolidays orHoliday&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufstehen nur forcieren, wenn eine frühere Weckzeit als die Standard Weckzeit eingestellt wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer2 wakeupEnforce 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Länge des Weckprogramms auf 30 Minuten festlegen (sprich 30 Minuten vor der eingestellten Weckzeit beginnen):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupOffset 30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standard Weckzeit hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr rr_Julian_wakeuptimer3 wakeupDefaultTime 10:30&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition des Weckprogramms ==&lt;br /&gt;
&lt;br /&gt;
Die Aktionen, welche innerhalb der 30 Minuten Weckzeitraum abgearbeitet werden sollen, sind im Device Macro_rr_Julian_wakeuptimer1 hinterlegt.&lt;br /&gt;
Dieses Macro wird 2 Mal aufgerufen: Das erste Mal beim Beginn des Weckprogramms und ein zweites Mal beim Ende des Weckprogramms. Der Hintergrund ist, dass das Macro beim Beenden dann entsprechend dafür sorgen kann bisher nicht ausgeführte Befehle des Programmablaufes zu stornieren. Hierfür ist die for-Schleife am Anfang des Macros gedacht und deckt per Default 10 Arbeitsschritte ab (ansonsten einfach die Zahl entsprechend erhöhen).&lt;br /&gt;
&lt;br /&gt;
Das Macro Template hat bereits alle oben beschriebenen Funktionen als auskommentierte FHEM Befehle enthalten. Diese sollen natürlich nur dem Beispiel und der eigenen Inspiration dienen. Wir müssten diese an dieser Stelle lediglich einkommentieren...&lt;br /&gt;
Insgesamt fällt bei genauerem hinsehen folgendes auf:&lt;br /&gt;
&lt;br /&gt;
* es stehen bestimmte Umgebungsvariablen bereit, die während des Programmablaufes genutzt werden können&lt;br /&gt;
* das Macro ist in 3 Bereiche unterteilt und nutzt dafür die Umgebungsvariable $EVTPART0 bzw. ob deren Wert auf &amp;quot;start&amp;quot; oder &amp;quot;stop&amp;quot; steht&lt;br /&gt;
* der erste Bereich mit der for-Schleife wird immer ausgeführt. Sie räumt durch das Macro erzeugte temporäre at-Devices auf (entweder weil das Programm früher beendet werden soll oder von vorne beginnen soll)&lt;br /&gt;
* der zweite Bereich &amp;quot;start&amp;quot; führt erste FHEM Befehle direkt nach dem Beginn des Weckprogramms aus. Außerdem werden weitere Befehle in bestimmten Etappen zur zeitversetzten Ausführung vorgemerkt. Dafür werden temporär erzeugte at-Devices verwendet.&lt;br /&gt;
* der Name der at-Devices folgt einem bestimmten Schema, nämlich atTmp_&amp;lt;LAUFENDE-NUMMER&amp;gt;_$NAME. Die laufende Nummer muss man manuell hochzählen, der Rest kann einfach kopiert werden. Dadurch wird das aufräumen oben im Macro einfacher.&lt;br /&gt;
* bei der Definition der at-Devices müssen mehrere FHEM Befehle hintereinander mit 2 Semikolon statt einem getrennt werden (siehe auch [http://fhem.de/commandref_DE.html#command Kommando-Referenz]).&lt;br /&gt;
* bei bedingten Schaltungen empfehlt es sich für übersichtlicheren Code die :FILTER Funktion zu nutzen (siehe auch [http://fhem.de/commandref_DE.html#devspec Kommando-Referenz]).&lt;br /&gt;
* es ist unbedingt darauf zu achten, dass das letzte at-Device nicht nach der wakeupOffset Zeit definiert wird, da es ansonsten automatisch gelöscht und somit nicht mehr ausgeführt wird&lt;br /&gt;
* nach einem ordentlichen Ende des Weckprogramms wird ein at-Device erzeugt, welches das Benutzer-Device automatisch nach &amp;quot;awoken&amp;quot; oder &amp;quot;home&amp;quot; schaltet, abhängig davon ob das Wecken forciert werden soll oder nicht. Dieser Teil wird tatsächlich nur geplant, wenn das Weckprogramm ordentlich beendet wurde. Wurde das Weckprogramm durch ein &amp;quot;set rr_Julian_wakeuptimer1 stop&amp;quot; bzw. durch Klick auf das blaue Device-Icon beendet, so werden die Post-Wakeup Befehle nicht mehr ausgeführt, weil man davon ausgehen kann, dass ein Abbruch des Programms und somit aller seiner weiteren Schaltungen gewünscht ist.&lt;br /&gt;
&lt;br /&gt;
Man kann sein Weckprogramm auf zwei Arten testen:&lt;br /&gt;
&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;trigger&amp;quot;: hier werden die aktuellen Auslösedefinitionen berücksichtigt; sprich, wenn heute nicht der richtige Tag ist, wird das Programm nicht gestartet&lt;br /&gt;
* durch senden des set-Befehls &amp;quot;start&amp;quot; kann man alle Auslösedefinitionen umgehen und das Weckprogramm direkt auslösen&lt;br /&gt;
&lt;br /&gt;
Zu Debug-Zwecken kann man auf das Wecker Dummy-Device das Attribut &amp;quot;verbose&amp;quot; auf 4 setzen. Im Logfile wird dann sehr ausführlich geloggt, warum wie geschaltet oder nicht geschaltet wird und wie die Entscheidungen getroffen worden sind, Readings zu aktualisieren etc. Damit lässt sich prüfen, ob das gewünschte Auslöseverhalten tatsächlich richtig funktioniert.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;bettfein machen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Möchte der Bewohner nun ins Bett gehen und sich dabei noch etwas darauf einstimmen, kann er sein &amp;quot;bettfein machen&amp;quot;-Programm dadurch starten, dass er den Status seines ROOMMATE-Devices in FHEM auf &amp;quot;gotosleep&amp;quot; setzt.&lt;br /&gt;
In unserem Beispiel werden dann die Aktionen aus Macro_rr_Julian_gotosleep ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich wird im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;gotosleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;gotosleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_gotosleep aus. Dort werden dann Schaltungen vorgenommen, die von größerer Tragweite sind, als wenn nur ein einzelner Bewohner ins Bett geht. Beispielsweise könnte man in bestimmten Räumen das Licht oder Geräte ausschalten, die man ansonsten unberührt gelassen hätte, wenn andere noch wach blieben.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;schlafen legen&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Legt sich der Bewohner ins Bett und möchte schlafen, wechselt er den Status seines ROOMMATE-Devices auf &amp;quot;asleep&amp;quot;. Ich mache das bei mir durch einen extra Wandschalter.&lt;br /&gt;
&lt;br /&gt;
In unserem Beispiel werden jetzt die Aktionen aus Macro_rr_Julian_asleep ausgeführt. In dem Macro wird besonders Wert darauf gelegt, dass ausschließlich Aktionen ausgeführt werden, die mit dem Schlafzimmer des Bewohners zu tun haben, damit andere Bewohner in anderen Räumen nicht beeinträchtigt werden.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich werden im RESIDENTS-Device rgr_Bewohner das Reading &amp;quot;residentsGotosleep&amp;quot; um 1 erniedrigt, das Reading &amp;quot;residentsAsleep&amp;quot; um 1 erhöht und ein Event erzeugt. Befinden sich gar alle anwesenden Bewohner im Status &amp;quot;asleep&amp;quot; wechselt der Gesamtstatus von rgr_Bewohner auch auf &amp;quot;asleep&amp;quot;. Dies löst dann Macro_rgr_Bewohner_asleep aus. Dort werden dann auch wieder Schaltungen vorgenommen, die von größerer Tragweite sind. Beispielsweise werden alle noch übrigen Lichter im Haus ausgeschaltet und die Musikwiedergabe in Gemeinschaftsräumen (wie hier dem Badezimmer) gestoppt.&lt;br /&gt;
&lt;br /&gt;
== Definition der Aktionen für den Prozess &amp;quot;aufgewacht sein&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Wir gehen nun davon aus, dass irgendwann morgens das Weckprogramm wie oben zuvor definiert abgespielt wird. Dabei wechselt im Device rgr_Bewohner das Reading residentsTotalWakeup auf 1 (oder höher bei mehreren gleichzeitig aktiven Weckprogrammen unterschiedlicher Bewohner).&lt;br /&gt;
&lt;br /&gt;
Während des Weckprogramms (oder natürlich auch davor) kann der Bewohner jederzeit in den Status &amp;quot;awoken&amp;quot; wechseln. Ich nutze bei mir auch hier wieder den Wandschalter.&lt;br /&gt;
Dadurch wird ein evtl. noch laufendes Weckprogramm unterbrochen (die at-Devices in FHEM werden automatisch aufgräumt) und die Aktionen in Macro_rr_Julian_awoken werden ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Neben dem expliziten Wechsel zum Status &amp;quot;awoken&amp;quot; kann aber, wie oben beschrieben, auch das Weckprogramm selbst den Bewohner auf diesen Status setzen. Dies wird dann als forciertes Wecken bezeichnet; sozusagen um seinen Hintern aus dem Bett zu bewegen :-)&lt;br /&gt;
Sinnvollerweise wechselt der Status des Bewohners nach kurzer Zeit dann automatisch von &amp;quot;awoken&amp;quot; auf &amp;quot;home&amp;quot;, also den Standard-Status wenn man zuhause ist.&lt;br /&gt;
&lt;br /&gt;
Zeitgleich zum Wechsel des ROOMMATE-Devices auf &amp;quot;awoken&amp;quot; wird auch wieder das RESIDENTS-Device automatisch angepasst: Das Reading &amp;quot;residentsAsleep&amp;quot; wird um 1 erniedrigt, das Reading &amp;quot;residentsAwoken&amp;quot; um 1 erhöht und ein Event erzeugt. &lt;br /&gt;
Außerdem wird der Gesamtstatus auf &amp;quot;awoken&amp;quot; gesetzt. Dies löst Macro_rgr_Bewohner_awoken aus. Hier werden auch wieder Schaltungen vorgenommen, die das Haus dann für den ersten, der aufsteht, entsprechend einzustellen, also beispielsweise das Licht in der Küche einschalten.&lt;br /&gt;
Zusätzlich wird dann ein temporäres at-Devices angelegt, welches dafür sorgt, dass der Haus Modus nach 1,5h von &amp;quot;Morgen&amp;quot; auf &amp;quot;Tag&amp;quot; wechselt. Allerdings ist der Haus Modus wie schon erwähnt hier nicht das Hauptthema und wird aktuell auch noch nicht direkt vom RESIDENTS Toolkit unterstützt (Sneak-Peek auf zukünftige Erweiterungen ;-)).&lt;br /&gt;
&lt;br /&gt;
== Snooze Funktion bei SONOS ==&lt;br /&gt;
&lt;br /&gt;
Damit man an gewissen Tagen auch dem Wecker mal auf&#039;n Kopp hauen kann (bzw. auf den Start/Stop Button am SONOS Gerät), kann man ein einfaches DOIF erzeugen, welches dafür sorgt, dass man nach 5 Minuten wieder daran erinnert wird aufzustehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define di_Sonos_Snooze DOIF (&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and (&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	) or&lt;br /&gt;
	(&lt;br /&gt;
		([rr_Julian:wakeup] == 0 and [rr_Julian:wakeup:sec] &amp;gt;= 600) or&lt;br /&gt;
		$we&lt;br /&gt;
	)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSEIF&lt;br /&gt;
(&lt;br /&gt;
	[Sonos_Bedroom:?transportState] and&lt;br /&gt;
	([Sonos_Bedroom:transportState] eq &amp;quot;STOPPED&amp;quot; or [Sonos_Bedroom:transportState] eq &amp;quot;PAUSED_PLAYBACK&amp;quot;) and&lt;br /&gt;
	([?rr_Julian:wakeup] == 1 or [rr_Julian:wakeup:sec] &amp;lt; 600) and&lt;br /&gt;
	!$we&lt;br /&gt;
)&lt;br /&gt;
(&lt;br /&gt;
	set Sonos_Bedroom:FILTER=transportState!=PLAYING Play&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
DOELSE&lt;br /&gt;
&lt;br /&gt;
attr alias Automation: Sonos Snoozing&lt;br /&gt;
attr cmdState off|on|standby&lt;br /&gt;
attr comment snooze function for wake-up program via SONOS device button&lt;br /&gt;
attr devStateIcon off:general_aus on:general_an@green standby:general_an@orange&lt;br /&gt;
attr wait 0:300:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das DOIF hier greift nur während ein Weckprogramm läuft oder maximal noch 10 Minuten danach; zudem nur wochentags :-)&lt;br /&gt;
&lt;br /&gt;
Außerdem zeigt der DOIF Status an, ob die Snooze Funktion gerade scharf geschaltet ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass das ROOMMATE Device ein Event bei der Änderung des wakeup Readings auslöst, also z.B. das Attribut event-on-change-reading dann entsprechend auch &amp;quot;wakeup&amp;quot; enthält.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Examples]]&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HttpUtils&amp;diff=20131</id>
		<title>HttpUtils</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HttpUtils&amp;diff=20131"/>
		<updated>2017-02-20T19:23:40Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* HttpUtils_BlockingGet */ $param-&amp;gt;{digest}&amp;lt;/code&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Hilfsfunktionen für HTTP-Zugriffe&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=HttpUtils.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ({{Link2FU|8|Forum}} / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[HttpUtils]](.pm) ist sowohl für Modulentwickler als auch für Endanwender gedacht, um Daten via HTTP auszutauschen. Es stellt dabei eine Reihe von Funktionen zur Verfügung und wird beispielsweise vom Modul [[HTTPMOD]] intensiv genutzt.&lt;br /&gt;
&lt;br /&gt;
== Funktionen ==&lt;br /&gt;
Es ist zu beachten, dass bei den Funktionen&lt;br /&gt;
* &amp;lt;code&amp;gt;GetHttpFile()&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;GetFileFromURL&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;GetFileFromURLQuiet&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HttpUtils_BlockingGet&amp;lt;/code&amp;gt;&lt;br /&gt;
ein sogenannter &amp;quot;blockierender&amp;quot; Aufruf durchgeführt wird. Das bedeutet, dass FHEM bei einem Aufruf einer dieser Funktionen solange wartet und dabei absolut nichts macht, bis die Antwort vom HTTP-Server eintrifft und die Funktion damit beendet ist. Das kann bei Verbindungsproblemen evtl. dazu führen, dass FHEM für die gesamte Wartezeit (Timeout) steht und nichts verarbeitet. Problematisch ist das gerade bei Anwendungen oder Hardware, die eine zeitnahe Reaktion von FHEM erwarten (z.B. HomeMatic-Geräte). In der Zeit, in der auf eine HTTP Antwort gewartet wird, steht FHEM dabei komplett. &lt;br /&gt;
&lt;br /&gt;
Es wird daher empfohlen, die Funktionen so sparsam wie möglich zu verwenden und die Timeouts so niedrig wie möglich zu halten, um ein längeres Einfrieren von FHEM möglichst zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
Um eine Blockierung zu vermeiden wird generell die Verwendung von&lt;br /&gt;
:&amp;lt;code&amp;gt;HttpUtils_NonblockingGet&amp;lt;/code&amp;gt;&lt;br /&gt;
empfohlen. Diese führt den HTTP-Request asynchron durch, wodurch ein Blockieren von FHEM verhindert wird. Wie das genau funktioniert, wird in dem entsprechenden Kapitel beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== GetHttpFile ===&lt;br /&gt;
Die Funktion GetHttpFile ist die denkbar einfachste Variante um eine URL aufzurufen. &lt;br /&gt;
:&amp;lt;code&amp;gt;GetHttpFile($server, $file)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$server&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der DNS-Name oder die IP-Adresse des HTTP-Servers&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;www.myhost.com&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;192.168.0.10&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$file&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Datei, welche auf dem HTTP-Server aufgerufen werden soll.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &#039;&#039;/&#039;&#039;&lt;br /&gt;
* &#039;&#039;/index.html&#039;&#039;&lt;br /&gt;
* &#039;&#039;/directory/image.jpg&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Funktionsergebnis ist der Inhalt der aufgerufenen Seite in Form einer Zeichenkette.&lt;br /&gt;
&lt;br /&gt;
=== GetFileFromURL ===&lt;br /&gt;
Die Funktion GetFileFromURL ruft die HTTP-URL auf und gibt als Funktionsergebnis den Seiteninhalt zurück. Im Gegensatz zu GetHttpFile beinhaltet GetFileFromURL einige Zusatzoptionen in Form von Funktionsparametern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufruf: &amp;lt;code&amp;gt;GetFileFromURL($url, &#039;&#039;[$timeout], [$data], [$noshutdown], [$loglevel]&#039;&#039;)&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://www.myhost.com/directory/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;https://www.myhost.com/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://www.myhost.com:8080/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://foo:bar@www.myhost.com/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timeout&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Die maximale Dauer in Sekunden für die HTTP-Anfrage&lt;br /&gt;
&lt;br /&gt;
Beispiel: 5 &#039;&#039;(Sekunden)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Standardwert: 4 Sekunden&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$data&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über $data übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.&lt;br /&gt;
&lt;br /&gt;
Standardwert: &#039;&#039;[leer]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$noshutdown&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung, bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$loglevel&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Das [[verbose|Loglevel]], in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Funktionsergebnis ist der Inhalt der aufgerufenen Seite in Form eines Strings.&lt;br /&gt;
&lt;br /&gt;
=== GetFileFromURLQuiet ===&lt;br /&gt;
Diese Funktion funktioniert ähnlich wie GetFileFromURL. Allerdings wird die tatsächliche URL in allen erzeugten Log-Meldungen unkenntlich gemacht um z.B. Zugangsdaten nicht preiszugeben. Die aufgerufene Seite wird ebenfalls als Funktionsergebnis zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufruf: &amp;lt;code&amp;gt;GetFileFromURLQuiet($url, &#039;&#039;[$timeout], [$data], [$noshutdown], [$loglevel]&#039;&#039;)&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$url&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://www.myhost.com/directory/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;https://www.myhost.com/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://www.myhost.com:8080/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://foo:bar@www.myhost.com/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timeout&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Die maximale Dauer in Sekunden für die HTTP-Anfrage&lt;br /&gt;
&lt;br /&gt;
Beispiel: 5 &#039;&#039;(Sekunden)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Standardwert: 4 Sekunden&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$data&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über &amp;lt;code&amp;gt;$data&amp;lt;/code&amp;gt; übergeben. Die Daten werden dabei als Formulardaten übertragen. Wenn man den Content-Type beeinflussen möchte, oder mehrere Formular-Felder senden möchte, sollte man zur Funktion HttpUtils_BlockingGet oder HttpUtils_NonblockingGet greifen.&lt;br /&gt;
&lt;br /&gt;
Standardwert: &#039;&#039;[leer]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$noshutdown&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Wenn $noshutdown auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung bevor, sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$loglevel&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Das Loglevel, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Funktionsergebnis ist der Inhalt der aufgerufenen Seite in Form eines Strings.&lt;br /&gt;
&lt;br /&gt;
=== HttpUtils_BlockingGet ===&lt;br /&gt;
Wenn die bisher genannten Funktionen nicht ausreichen um die gewünschte Abfrage durchzuführen, so kann man diese Funktion verwenden. Aufgrund zahlreicher Parameter ermöglicht sie viele Anpassungsmöglichkeiten. Diese Funktion hat dabei nicht wie üblich eine Liste an Funktionsparametern, sondern lediglich einen Parameter, welcher eine Hashreferenz mit allen Funktionsparametern darstellt. Dieser Hash enthält sämtliche Parameter inkl. Werten. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufruf: &amp;lt;code&amp;gt;HttpUtils_BlockingGet($param)&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Parameter $param ist eine Referenz auf eine Hash-Struktur, welche die einzelnen Parameter enthält. Der Hash $param kann folgende Optionen beinhalten:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:175px&amp;quot; | Parameter !! style=&amp;quot;width:auto&amp;quot; | Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{url}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
 || Die HTTP-URL, welche aufgerufen werden soll. Diese kann optional Usernamen, Passwort und einen Port enthalten. Sowohl HTTP als auch HTTPS wird hierbei unterstützt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://www.myhost.com/directory/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;https://www.myhost.com/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://www.myhost.com:8080/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&amp;lt;nowiki&amp;gt;http://foo:bar@www.myhost.com/&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; |&#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{timeout}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Die maximale Dauer in Sekunden für die HTTP-Anfrage&lt;br /&gt;
&lt;br /&gt;
Beispiel: 5 &#039;&#039;(Sekunden)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Standardwert: 4 Sekunden&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; |&#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{data}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Wenn man Daten via HTTP-POST übertragen möchte, so kann man die Nutzdaten über &amp;lt;code&amp;gt;$param-&amp;gt;{data}&amp;lt;/code&amp;gt; übergeben. Die Daten werden dabei als Formulardaten übertragen. Die Daten können dabei auf zwei Arten übergeben werden:&lt;br /&gt;
&lt;br /&gt;
1. Daten als String:&lt;br /&gt;
:* Die Daten werden komplett als gesamter String in &amp;lt;code&amp;gt;$param-&amp;gt;{data}&amp;lt;/code&amp;gt; abgelegt (z.B.: $param-&amp;gt;{data} = &amp;quot;Jede Menge tolle Daten&amp;quot;).&lt;br /&gt;
2. Daten als Hash:&lt;br /&gt;
:* Die Daten werden als Hash mit Key-Value-Pairs übergeben (z.B.: &amp;lt;code&amp;gt;$param-&amp;gt;{data}{field1} = &amp;quot;value1&amp;quot;, $param{data}{field2} = &amp;quot;value2&amp;quot;, ...&amp;lt;/code&amp;gt; ). Die Daten werden dann als Formulardaten mit mehrfachen Datenfeldern übertragen.&lt;br /&gt;
&lt;br /&gt;
Standardwert: &#039;&#039;[leer]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{noshutdown}&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
||Wenn &amp;lt;code&amp;gt;$param-&amp;gt;{noshutdown}&amp;lt;/code&amp;gt; auf 1 gesetzt ist, wird dem HTTP-Server nicht implizit mitgeteilt, dass die Verbindung nach dem Request geschlossen werden soll. Viele Webserver schließen in solch einem Fall die Verbindung, bevor sie die Antwort senden. Bei 0 wird dem Webserver mitgeteilt, dass der Sendevorgang beendet ist und nun die Antwort abgewartet wird.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 1&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{loglevel}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Das Loglevel, in dem sämtliche Logmeldungen zu dieser HTTP-Abfrage erzeugt werden sollen.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 4&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{hideurl}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Wenn dieser Parameter den Wert 1 trägt, wird die URL in sämtlichen Log-Ausgaben unkenntlich gemacht. Dies ist nützlich um z.B. Zugangsdaten geheim zu halten.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{ignoreredirects}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Wenn dieser Parameter den Wert 1 trägt, werden Umleitungen durch den Server ignoriert und der Request beendet. Dies kann erforderlich sein um evtl. Cookies aus der Antwort, welche eine Umleitung enthält aus dem HTTP Header zu extrahieren um diese im nächsten Request weiterzuverwenden.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{method}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
||Die HTTP-Methode, welche zur Abfrage verwendet werden soll. Sofern keine Daten übertragen werden ist dies standardmäßig &amp;quot;GET&amp;quot;, ansonsten &amp;quot;POST&amp;quot;. Es können aber auch andere Methoden verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert: &amp;quot;GET&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{keepalive}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
||Wenn dieser Parameter auf 1 gesetzt ist, wird dem Server der Wunsch mitgeteilt, die Verbindung offen zu lassen für weitere Anfragen. Sobald die Antwort auf den jeweiligen Request eintrifft, bleibt die TCP-Verbindung bestehen (sofern der Server dies unterstützt). Anschließend kann man den Parameter-Hash mit einer neuen URL und Optionen füllen. Der Parameter &amp;quot;keepalive&amp;quot; sollte dabei weiterhin gesetzt bleiben, sofern die Verbindung auch weiterhin möglichst erhalten bleiben soll. &lt;br /&gt;
&lt;br /&gt;
Um eine offene Verbindung endgültig zu schließen, muss die Funktion [[HttpUtils#HttpUtils_Close|HttpUtils_Close]] aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{header}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Eigene HTTP-Header-Zeilen können über diesen Parameter eingebracht werden. Er kann dazu genutzt werden um z.B. den Content-Type festzulegen, oder einfach nur zusätzliche Header-Felder zu setzen. Es gibt zwei Möglichkeiten, diesen Parameter zu befüllen.&lt;br /&gt;
&lt;br /&gt;
# Als &#039;&#039;&#039;Zeichenkette&#039;&#039;&#039;. Mehrere Header-Zeilen müssen dabei mit &amp;quot;\r\n&amp;quot; getrennt werden.&lt;br /&gt;
# Als &#039;&#039;&#039;Hash-Struktur&#039;&#039;&#039;. Hierbei findet eine Zuordnung von Header-Bezeichnung zum Wert als Key-Value-Pair statt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;User-Agent: Mozilla/1.22&#039;&#039;&#039;&amp;lt;u&amp;gt;\r\n&amp;lt;/u&amp;gt;&#039;&#039;&#039;Content-Type: application/xml&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;Content-Type: application/xml&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;{ &amp;quot;User-Agent&amp;quot; =&amp;gt;  &amp;quot;Mozilla/1.22&amp;quot;, &amp;quot;Content-Type&amp;quot; =&amp;gt; &amp;quot;application/xml&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;{ &amp;quot;Content-Type&amp;quot; =&amp;gt; &amp;quot;application/xml&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardwert: &#039;&#039;[leer]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{sslargs}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Eigene SSL-Optionen können über diesen Parameter eingebracht werden. Er kann dazu genutzt werden um z.B. die SSL-Zertifikats Verifikation abzuschalten. Die SSL-Optionen müssen als eigene Hash-Referenz übergeben werden. Eine Liste aller möglichen Optionen findet man in der Perl-Dokumentation zu [http://search.cpan.org/~sullr/IO-Socket-SSL-2.016/lib/IO/Socket/SSL.pod#Description_Of_Methods IO::Socket::SSL].&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;$param-&amp;gt;{sslargs} = { SSL_verify_mode =&amp;gt; 0, sslOpt2 =&amp;gt; &#039;sslVal2&#039; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardwert: &#039;&#039;{ }&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{httpversion}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Die HTTP-Version, welche zur Abfrage verwendet werden soll. Standardmäßig werden alle Abfragen mit HTTP/1.0 durchgeführt. Falls es jedoch notwendig ist HTTP/1.1 zu verwenden, so sollte &amp;lt;code&amp;gt;$param-&amp;gt;{httpversion}&amp;lt;/code&amp;gt; auf &amp;quot;1.1&amp;quot; gesetzt werden. Bei Version 1.1 wird automatisch der Header &amp;quot;&amp;lt;code&amp;gt;Connection: close&amp;lt;/code&amp;gt;&amp;quot; implizit mitgesendet.&lt;br /&gt;
&lt;br /&gt;
Standardwert: &amp;quot;1.0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{digest}&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Verhindert, dass Benutzerdaten zunächst als Basic-Auth gesendet werden. Anmeldedaten werden dann nur an den Server geschickt, wenn dieser explizit nach HTTP Digest gefragt hat.&lt;br /&gt;
&lt;br /&gt;
Standardwert: &amp;quot;0&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Als Rückgabewert von HttpUtils_BlockingGet wird ein Array mit zwei Rückgabewerten zurückgegeben:&lt;br /&gt;
:&amp;lt;code&amp;gt;($err, $data) = HttpUtils_BlockingGet( … )&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese zwei Rückgabewerte haben folgende Bedeutung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$err&amp;lt;/code&amp;gt;&#039;&#039;&#039;|| Falls beim Aufruf der URL ein Fehler aufgetreten ist (z.B. Server nicht erreichbar oder Verbindungstimeout), dann ist dieser Wert mit einer Fehlermeldung gefüllt. &lt;br /&gt;
&lt;br /&gt;
Wenn kein Fehler aufgetreten ist, ist dieser Wert mit einem Leerstring gefüllt (&amp;lt;code&amp;gt;$err = &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$data&amp;lt;/code&amp;gt;&#039;&#039;&#039;|| Die Ergebnisdaten, welche der HTTP-Server zurückgeliefert hat. Die Daten werden als Klartext in Form eines gesamten Strings zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Falls ein Fehler aufgetreten ist, ist dieser Wert mit einem Leersting gefüllt (&amp;lt;code&amp;gt;$data = &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== HttpUtils_NonblockingGet ===&lt;br /&gt;
{{Randnotiz|RNText=Die Funktion HttpUtils_NonblockingGet ist nicht komplett durchgehend &amp;quot;non-blocking&amp;quot;. DNS-Abfragen sind weiterhin blockierend. Insbesondere wenn der DNS-Name nicht aufgelöst werden kann.}}&lt;br /&gt;
Diese Funktion arbeitet ähnlich wie HttpUtils_BlockingGet. Allerdings wird das Ergebnis nicht als Funktionsergebnis zurückgegeben. Die Funktion HttpUtils_NonblockingGet initiiert den Verbindungsaufbau und übergibt alles weitere an FHEM interne Routinen. Sobald eine Antwort vom HTTP-Server eintrifft, wird eine Callback-Funktion mit verschiedenen Parametern (unter anderem auch das Ergebnis) aufgerufen, um die Antwort entgegenzunehmen und weiter zu verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Aufruf ist daher ähnlich zu HttpUtils_BlockingGet mit nur einem Parameter-Hash:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufruf: &amp;lt;code&amp;gt;HttpUtils_NonblockingGet($param)&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:175px&amp;quot; | Parameter !! style=&amp;quot;width:auto&amp;quot; | Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center&amp;quot; | &#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;Alle Hash-Parameter, welche für HttpUtils_BlockingGet gelten, sind auch für HttpUtils_NonblockingGet gültig&#039;&#039;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{callback}&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Eine Funktion (oder eine Referenz auf eine Funktion), welche die Ergebnisdaten entgegennimmt und die Antwort entsprechend weiterverarbeitet. Die Callback-Funktion muss dabei 3 Parameter erwarten. Die Funktionsparameter der Callback-Funktion werden im nachfolgenden Abschnitt näher erläutert.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
* &amp;lt;code&amp;gt;$param-&amp;gt;{callback} = \&amp;amp;MyCallbackFn&amp;lt;/code&amp;gt; — &#039;&#039;(Referenzzeiger auf Funktionsname)&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;$param-&amp;gt;{callback} = sub($$$){ … }&amp;lt;/code&amp;gt; —  &#039;&#039;(direkte Funktionsdefinition)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;Benutzerdefinierte Parameter&#039;&#039; &lt;br /&gt;
|| Es können im Hash weitere benutzerdefinierte Parameter gesetzt werden, welche evtl. in der Callback-Funktion benötigt werden, um die Antwort korrekt zu verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel bei der Modul-Programmierung währe das $hash des aktuellen Devices. Alle gesetzten Parameter sind in der Callback-Funktion direkt abrufbar und können ausgewertet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
* &amp;lt;code&amp;gt;$param-&amp;gt;{hash} = $hash&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;$param-&amp;gt;{command} = &amp;quot;on&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Ein Funktionsrückgabewert von HttpUtils_NonblockingGet existiert nicht, da die eigentliche Rückgabe der Daten über die Callback-Funktion erfolgt. Die Callback-Funktion wird aufgerufen, sobdald der HTTP-Request abgeschlossen ist, oder ein Fehler aufgetreten ist. Der Funktionsaufruf erfolgt mit den folgenden Parametern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &#039;&#039;MyCallbackFn&#039;&#039; ( $param, $err, $data )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese 3 Parameter haben dabei folgende Bedeutung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Parameter-Hash, mit allen Argumenten die beim Aufruf der Funktion übergeben worden sind.&lt;br /&gt;
&lt;br /&gt;
Es ist möglich, dass der Parameter-Hash nach erfolgter Abfrage zusätzliche oder veränderte Elemente enthält:&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{redirects}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Die Anzahl an Umleitungen die erfolgte, bis die Anfrage beantwortet wurde.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{url}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Die URL, die nach erfolgter Umleitung die Anfrage beantwortet hat.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{protocol}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Das verwendete Protokoll, welches zur Abfrage verwendet wurde (&amp;quot;http&amp;quot; oder &amp;quot;https&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{path}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Der Pfad, welcher auf dem HTTP-Server angefragt wurde.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{host}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Der Name oder die IP-Adresse des HTTP-Servers.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{httpheader}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Der gesamte HTTP Header, welcher der Server bei der letzten Antwort zurücklieferte.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{code}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Der HTTP-Statuscode, mit dem die Anfrage vom Server beantwortet wurde.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{addr}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Die HTTP-URL ohne Pfad und evtl. Authentifizerungsinformationen des HTTP-Servers (z.B. &amp;quot;&amp;lt;nowiki&amp;gt;http://myserver.com:8080&amp;lt;/nowiki&amp;gt;&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;$param-&amp;gt;{auth}&amp;lt;/code&amp;gt;&#039;&#039;&#039; - Die Zugangsdaten als &amp;lt;code&amp;gt;Username:Passwort&amp;lt;/code&amp;gt;, welcher verwendet wurde um sich gegenüber dem HTTP-Server zu authentifizieren (nur wenn Authentifizierung benutzt wurde).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$err&amp;lt;/code&amp;gt;&#039;&#039;&#039;|| Falls beim Aufruf der URL ein Fehler aufgetreten ist (z.B. Server nicht erreichbar oder Verbindungstimeout), dann ist dieser Wert mit einer Fehlermeldung gefüllt. &lt;br /&gt;
&lt;br /&gt;
Wenn kein Fehler aufgetreten ist, ist dieser Wert mit einem Leerstring gefüllt (&amp;lt;code&amp;gt;$err = &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$data&amp;lt;/code&amp;gt;&#039;&#039;&#039;|| Die Ergebnisdaten, welche der HTTP-Server zurückgeliefert hat. Die Daten werden als Klartext in Form eines gesamten Strings zurückgegeben. Es handelt sich hierbei ausschließlich um den HTTP-Body. &lt;br /&gt;
&lt;br /&gt;
Falls ein Fehler aufgetreten ist, ist dieser Wert mit einem Leersting gefüllt (&amp;lt;code&amp;gt;$data = &amp;quot;&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Callback-Funktion kann nun die Daten aus der HTTP-Antwort verarbeiten oder bei Fehlern entsprechende Log-Meldungen ausgeben.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel für HttpUtils_NonblockingGet() für Modulprogrammierer ====&lt;br /&gt;
Das folgende Beispiel soll eine Hilfestellung für eigene Anwendungen geben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;use HttpUtils;&lt;br /&gt;
sub X_GetHttpResponse($)&lt;br /&gt;
{&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
    my $param = {&lt;br /&gt;
                    url        =&amp;gt; &amp;quot;http://www.foo.de&amp;quot;,&lt;br /&gt;
                    timeout    =&amp;gt; 5,&lt;br /&gt;
                    hash       =&amp;gt; $hash,                                                                                  # Muss gesetzt werden, damit die Callback funktion wieder $hash hat&lt;br /&gt;
                    method     =&amp;gt; &amp;quot;GET&amp;quot;,                                                                                  # Lesen von Inhalten&lt;br /&gt;
                    header     =&amp;gt; &amp;quot;agent: TeleHeater/2.2.3\r\nUser-Agent: TeleHeater/2.2.3\r\nAccept: application/json&amp;quot;,  # Den Header gemäss abzufragender Daten ändern&lt;br /&gt;
                    callback   =&amp;gt;  \&amp;amp;X_ParseHttpResponse                                                                  # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten&lt;br /&gt;
                };&lt;br /&gt;
&lt;br /&gt;
    HttpUtils_NonblockingGet($param);                                                                                     # Starten der HTTP Abfrage. Es gibt keinen Return-Code. &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub X_ParseHttpResponse($)&lt;br /&gt;
{&lt;br /&gt;
    my ($param, $err, $data) = @_;&lt;br /&gt;
    my $hash = $param-&amp;gt;{hash};&lt;br /&gt;
    my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&lt;br /&gt;
    if($err ne &amp;quot;&amp;quot;)                                                                                                         # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist&lt;br /&gt;
    {&lt;br /&gt;
        Log3 $name, 3, &amp;quot;error while requesting &amp;quot;.$param-&amp;gt;{url}.&amp;quot; - $err&amp;quot;;                                                  # Eintrag fürs Log&lt;br /&gt;
        readingsSingleUpdate($hash, &amp;quot;fullResponse&amp;quot;, &amp;quot;ERROR&amp;quot;);                                                              # Readings erzeugen&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    elsif($data ne &amp;quot;&amp;quot;)                                                                                                     # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)&lt;br /&gt;
    {&lt;br /&gt;
        Log3 $name, 3, &amp;quot;url &amp;quot;.$param-&amp;gt;{url}.&amp;quot; returned: $data&amp;quot;;                                                            # Eintrag fürs Log&lt;br /&gt;
&lt;br /&gt;
        # An dieser Stelle die Antwort parsen / verarbeiten mit $data&lt;br /&gt;
&lt;br /&gt;
        readingsSingleUpdate($hash, &amp;quot;fullResponse&amp;quot;, $data);                                                                # Readings erzeugen&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    # Damit ist die Abfrage zuende.&lt;br /&gt;
    # Evtl. einen InternalTimer neu schedulen&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HttpUtils_Close ===&lt;br /&gt;
&lt;br /&gt;
Für den Abbruch von offenen Verbindungen und noch laufenden NonBockingGet-Aufrufen gibt es die Funktion HttpUtils_Close. Diese kann z.B. beim Löschen eines Devices oder Herunterfahren des Servers aufgerufen werden, um bestehende Verbindungen zu schliessen.&lt;br /&gt;
&lt;br /&gt;
Wenn man den Parameter &amp;quot;keepalive&amp;quot; beim Aufruf von HttpUtils_NonBlockingGet/HttpUtils_BlockingGet gesetzt hat, muss man HttpUtils_Close aufrufen um die Verbindung tatsächlich zu schließen, da diese noch durch den Server offen gehalten werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aufruf: &amp;lt;code&amp;gt;HttpUtils_Close($param)&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:175px&amp;quot; | Parameter !! style=&amp;quot;width:auto&amp;quot; | Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Hash, der beim vorherigen Aufruf an HTTPUtils Funktionen (HttpUtils_NonblockingGet oder HttpUtils_BlockingGet) übergeben wurde&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17654</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17654"/>
		<updated>2016-12-04T15:18:15Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Roomba über THINKINGCLEANER Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off,nocache=1 ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17653</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17653"/>
		<updated>2016-12-04T15:17:10Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|standby|dock)/,cmdOn=on,cmdOff=off,nocache=1 ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17652</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17652"/>
		<updated>2016-12-04T15:12:01Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;;/^.*/:NOT_CHARGING&lt;br /&gt;
 attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17651</id>
		<title>Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=17651"/>
		<updated>2016-12-04T15:11:34Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Add Roomba/THINKINGCLEANER&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Eintrag dient zur Sammlung funktionsfähiger Homebridge Configs.&lt;br /&gt;
&lt;br /&gt;
Bitte immer die FHEM Version und Homebridge Version angegeben.&lt;br /&gt;
&lt;br /&gt;
Sehr gute Hinweise gibt es hier: http://www.meintechblog.de/2015/10/mit-siri-und-fhem-das-gesamte-smart-home-per-stimme-steuern/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== EnOcean STM 250 Tür-/Fensterkontakt ==&lt;br /&gt;
Der STM 250 liefert als Status in FHEM &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, wenn das Fenster offen und damit der Kontakt &amp;quot;offen&amp;quot; ist. Analog liefert er &amp;lt;code&amp;gt;closed&amp;lt;/code&amp;gt; wenn das Fenster geschlossen und damit auch der Kontakt geschlossen ist. Diese Statusangaben sind sehr intuitiv zu verstehen und zu interpretieren. &lt;br /&gt;
&lt;br /&gt;
Die characteristic &amp;lt;code&amp;gt;ContactSensorState&amp;lt;/code&amp;gt; von HomeKit liefert entweder den Wert &amp;lt;code&amp;gt;CONTACT_DETECTED=0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1&amp;lt;/code&amp;gt; zurück. Wobei &amp;lt;code&amp;gt;CONTACT_DETECTED&amp;lt;/code&amp;gt; bedeutet, dass der Kontakt geschlossen ist. Je nach Darstellung in der HomeKit-fähigen App muss dieses Verhalten bei der Interpretation berücksichtigt werden. Die App Eve von Elgato zum Beispiel liefert für Kontaktsensoren &amp;quot;JA&amp;quot; oder &amp;quot;NEIN&amp;quot; mit der Bedeutung &amp;lt;code&amp;gt;CONTACT_DETECTED=0=JA&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;CONTACT_NOT_DETECTED=1=NEIN&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Noch ein wichtiger Punkt: Um einen Sensorkontakt sinnvoll einzurichten sollte als zusätzlicher Wert für das Attribut &amp;lt;code&amp;gt;genericdeviceType&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;ContactSensor&amp;lt;/code&amp;gt; hinzugefügt werden. Wie das geht ist im Eintrag [[Homebridge_einrichten#FHEM_konfigurieren | Homebridge einrichten]] ausführlicher beschrieben.&lt;br /&gt;
&lt;br /&gt;
Folgende Attribute dann hinzufügen:&lt;br /&gt;
 attr STM250 genericDeviceType ContactSensor&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== Modul RESIDENTS für Anwesenheitserkennung und Steuerung der Anwesenheit benutzen ==&lt;br /&gt;
[[Datei:Homebridge_bewohner_zu_szene.jpeg|mini|Schaltzustand eines Bewohners zu einer Szene hinzufügen]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie der characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; und der Szenensteuerung lässt sich eine gleichzeitige Steuerung der Anwesenheit und Anwesenheitserkennung basteln.&lt;br /&gt;
&lt;br /&gt;
Dazu müssen folgende Schritte unternommen werden:&lt;br /&gt;
* einem Bewohner aus dem Modul ROOMMATE die Steuerung über homebridgeMapping hinzufügen&lt;br /&gt;
* Szene für &amp;quot;Ich bin zu Hause&amp;quot; und &amp;quot;Ich gehe jetzt&amp;quot; in einer HomeKit-fähigen App wie z.B. Eve einrichten&lt;br /&gt;
&lt;br /&gt;
Man kann einen beliebigen Bewohner aus dem Modul ROOMMATE nehmen und ihn über die characteristic &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt; in Form eines Schalters sozusagen schaltbar machen. Nur wird das Ein- und Ausschalten des Bewohners über HomeKit in FHEM auf den Status home bzw. absent gemappt. Seit dem 06.02.2016 werden RESIDENTS automatisch als Occupancy Sensor für HomeKit annonciert. Nun noch die Attribute des ROOMMATE wie folgt setzen:&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; genericDeviceType switch&lt;br /&gt;
 attr &amp;lt;ROOMMATE&amp;gt; homebridgeMapping On=state,valueOn=/home|awoken|asleep|gotosleep/,valueOff=/gone|absent/,cmdOn=home,cmdOff=absent&lt;br /&gt;
&lt;br /&gt;
Natürlich muss der Bewohner noch dem Filter von homebridge hinzugefügt und homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Anschließend geht es in der HomeKit-fähigen App Deiner Wahl weiter. In Eve von Elgato ist von vornherein zum Beispiel vorgesehen, dass man zwei Szenen &amp;quot;Ich bin zuhause&amp;quot; und &amp;quot;Ich verlasse das Haus&amp;quot; hat. Zu diesen Szenen wird eine Aktion hinzugefügt indem der Bewohner, den das ROOMMATE-Modul meldet zur Szene hinzugefügt wird und beim Nachhausekommen &amp;quot;eingeschaltet&amp;quot; wird. Genauso wird mit der Szene &amp;quot;Ich verlasse das Haus&amp;quot; verfahren: Bewohner zur Szene hinzufügen und den Schaltvorgang auf &amp;quot;ausschalten&amp;quot; setzen.&lt;br /&gt;
&lt;br /&gt;
Mit den Sprachbefehlen &amp;quot;Ich bin zuhause&amp;quot; oder &amp;quot;Ich verlasse das Haus&amp;quot; wird die entsprechende Szene eingeschaltet, homebridge schaltet über das &amp;lt;code&amp;gt;homebridgeMapping&amp;lt;/code&amp;gt; Attribut dann den Bewohner auf &amp;quot;home&amp;quot; oder &amp;quot;absent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 9893&lt;br /&gt;
 Homebridge 0.2.16&lt;br /&gt;
 homebridge-fhem Vorschauversion aus [http://forum.fhem.de/index.php/topic,48558.msg402024.html#msg402024 homebridge/homekit]&lt;br /&gt;
&lt;br /&gt;
== ZWave Türschloss Vision ZM1701 einbinden ==&lt;br /&gt;
Das ZWave Türschloss ZM1701 von der Firma Vision sendet seinen aktuellen Schließstatus in ein einzelnes Reading wie &amp;quot;lock&amp;quot;, sondern schickt eine ganze Reihe von Informationen über den Zustand in das Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das Schließen und Öffnen der Türschlosses wird auch nicht mit einem Setzen des &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; erreicht, sondern mit dem Setzen von &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt;. Das macht das Einbinden in homebridge nicht trivial, funktioniert aber über folgendes Homebridge-Mapping:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&lt;br /&gt;
&lt;br /&gt;
Kurz zur Erklärung: Um ein Schloss über HomeKit steuern zu können braucht es zwei characteristics. LockCurrentState zeigt an, ob das Schloss geöffnet oder geschlossen ist. Und mit LockTargetState wird das Schloss geöffnet oder geschlossen. Damit der aktuelle Status des Schlosses ausgelesen werden kann, muss aus dem FHEM-Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; die Zeichenfolge &amp;lt;code&amp;gt; secured&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;unsecured&amp;lt;/code&amp;gt; extrahiert werden, daher die beiden regulären Ausdrücke &amp;lt;code&amp;gt;/\ssecured/&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/unsecured/&amp;lt;/code&amp;gt;. In der characteristic &amp;lt;code&amp;gt;LockTargetState&amp;lt;/code&amp;gt; muss sowohl der aktuelle Status des Schlosses als auch das Kommando angegeben werden, schließlich möchte man ein geschlossenes Schloss nicht nochmal schließen. Daher wird erst aus dem Reading &amp;lt;code&amp;gt;doorLockOperation&amp;lt;/code&amp;gt; der aktuelle Status des Schlosses ausgelesen und die damit korrespondierenden Befehle über &amp;lt;code&amp;gt;cmds=SECURED:doorLockOperation+close;UNSECURED:doorLockOperation+open&amp;lt;/code&amp;gt; generiert.&lt;br /&gt;
&lt;br /&gt;
Wer es in FHEM über ein webCmd einfacher zu bedienen haben möchte, fügt bitte noch die dafür notwendigen Attribute und die leicht geänderten homebridgeMappings wie folgt ein:&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; genericDeviceType lock&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; homebridgeMapping LockCurrentState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED LockTargetState=doorLockOperation,values=/\ssecured/:SECURED;/unsecured/:UNSECURED,cmds=SECURED:close;UNSECURED:open&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; /doorLockOperation open:open/doorLockOperation close:close&lt;br /&gt;
 attr &amp;lt;ZM1701&amp;gt; webCmd open:close&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12191&lt;br /&gt;
 homebridge 0.4.6&lt;br /&gt;
 homebridge-fhem 0.2.48&lt;br /&gt;
&lt;br /&gt;
== Roomba über THINKINGCLEANER Modul ==&lt;br /&gt;
attr &amp;lt;THINKINGCLEANER&amp;gt; genericDeviceType switch&lt;br /&gt;
attr &amp;lt;THINKINGCLEANER&amp;gt; homebridgeMapping clear On=state,valueOn=/^(on|dock)/,cmdOn=on,cmdOff=off ChargingState=deviceStatus,values=/(_recon|_full|_trickle)$/:CHARGING;;/^.*/:NOT_CHARGING&lt;br /&gt;
attr &amp;lt;THINKINGCLEANER&amp;gt; siriName Robby&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Getestet mit&lt;br /&gt;
 FHEM 5.7 Rev. 12680&lt;br /&gt;
 homebridge 0.4.11&lt;br /&gt;
 homebridge-fhem 0.2.66&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16737</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16737"/>
		<updated>2016-10-23T09:45:27Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Ergänzung zur automatischen Anlage einer FHEMWEB Instanz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Wettermodule&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in zwei Schritten:&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Zunächst wird das Modul in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
Es wird dabei automatisch eine neue FHEMWEB Instanz namens &amp;quot;WEBweatherstation&amp;quot; und dem webname Attribut &amp;quot;weatherstation&amp;quot; angelegt, sofern nicht bereits eine passende Instanz gefunden werden konnte. Diese kann anschließend weiter konfiguriert (z.B. anderer Port, anderer Device Name etc.), entscheidend ist das Attribut webname exakt so beizubehalten.&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in der Station ===&lt;br /&gt;
Dann muss der Station eingestellt werden, dass die Wetterinformationen an Fhem geschickt werden sollen. Bei einer WH2600 (Station ohne LCD Display) geschieht das im Webinterface, bei einer HP1000 direkt in den Einstellungen des LCD Displays.&lt;br /&gt;
Dazu unter &amp;quot;Weather Network&amp;quot; folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customized&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (siehe unten)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbst gewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbst gewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Auch hat die Firmware oft einen Bug der verhindert, dass IP Adressen direkt verwendet werden können. Hier muss dann zwingend auf einen Domainnamen zurückgegriffen werden!&lt;br /&gt;
Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_WeatherStation FileLog ./log/WeatherStation-%Y.log WeatherStation:T:.*&lt;br /&gt;
&lt;br /&gt;
Alternativ sei auch auf die Verwendung von DbLog verwiesen. Dort kann man mit Hilfe des DbLogInclude Attributs granularer einstellen wie oft ein Wert geloggt werden soll:&lt;br /&gt;
  attr WeatherStation DbLogInclude windSpeed:300 windGust:300 windChill:300 temperature.*:300 humidity.*:300 luminosity:300 uv:300&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass für das Logging die richtigen Events ausgelöst werden. Wer die event-on-* Attribute benutzt kann diese in Kombination mit DbLogInclude z.B. so setzen:&lt;br /&gt;
  attr event-on-update-reading temperature.*,humidity.*,windSpeed,windGust,windChill,luminosity,uv.*,dewpoint.*,rain.*,solarradiation&lt;br /&gt;
  attr event-on-change-reading wu_state,extsrv_state,Activity&lt;br /&gt;
&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UConv&amp;diff=16733</id>
		<title>UConv</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UConv&amp;diff=16733"/>
		<updated>2016-10-22T13:48:34Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Hilfsfunktionen zur modulübergreifenden Benutzung bei der Umrechnung von Einheiten.&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=intro &amp;lt;!-- no help section available --&amp;gt;&lt;br /&gt;
|ModForumArea=FHEM Development&lt;br /&gt;
|ModTechName=UConv.pm&lt;br /&gt;
|ModOwner=Loredo ([http://forum.fhem.de/index.php?action=profile;u=1363 Forum] / [[Benutzer Diskussion:loredo|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
[[UConv]] soll modulübergreifend Funktionen bereitstellen, um verschiedene Einheiten umzurechnen. Es wird zur Zeit von dem [[HP1000|HP1000]] Modul verwendet.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
Um die im Folgenden beschriebenen Funktionen zu nutzen, muss die Datei UConv.pm eingebunden werden. Ein Modulautor kann das durch eine &lt;br /&gt;
:&amp;lt;code&amp;gt;use UConv;&amp;lt;/code&amp;gt; &lt;br /&gt;
Anweisung in seinem Modul tun. Ein Endanwender mit einem notify:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;define uconvInit notify global:INITIALIZED {use UConv}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen verschiedene Funktionen zur Verfügung, die alle über &amp;lt;code&amp;gt;UConv::&amp;lt;nowiki&amp;gt;&amp;lt;Funktionsname&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; aufgerufen werden können.&lt;br /&gt;
Die Datei UConv beinhaltet entsprechende Kommentare dafür, welche Einheiten eine Funktion genau umrechnet.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UConv&amp;diff=16732</id>
		<title>UConv</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UConv&amp;diff=16732"/>
		<updated>2016-10-22T13:47:10Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Hinweis auf UConv.pm hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Hilfsfunktionen zur modulübergreifenden Benutzung bei der Umrechnung von Einheiten.&lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=intro &amp;lt;!-- no help section available --&amp;gt;&lt;br /&gt;
|ModForumArea=FHEM Development&lt;br /&gt;
|ModTechName=UConv.pm&lt;br /&gt;
|ModOwner=Loredo ([http://forum.fhem.de/index.php?action=profile;u=430 Forum] / [[Benutzer Diskussion:loredo|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
[[UConv]] soll modulübergreifend Funktionen bereitstellen, um verschiedene Einheiten umzurechnen. Es wird zur Zeit von dem [[HP1000|HP1000]] Modul verwendet.&lt;br /&gt;
&lt;br /&gt;
== Benutzung ==&lt;br /&gt;
Um die im Folgenden beschriebenen Funktionen zu nutzen, muss die Datei UConv.pm eingebunden werden. Ein Modulautor kann das durch eine &lt;br /&gt;
:&amp;lt;code&amp;gt;use UConv;&amp;lt;/code&amp;gt; &lt;br /&gt;
Anweisung in seinem Modul tun. Ein Endanwender mit einem notify:&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;define uconvInit notify global:INITIALIZED {use UConv}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen verschiedene Funktionen zur Verfügung, die alle über &amp;lt;code&amp;gt;UConv::&amp;lt;nowiki&amp;gt;&amp;lt;Funktionsname&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; aufgerufen werden können.&lt;br /&gt;
Die Datei UConv beinhaltet entsprechende Kommentare dafür, welche Einheiten eine Funktion genau umrechnet.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16593</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16593"/>
		<updated>2016-10-11T12:22:59Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Tipps, Tricks, Problemlösungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Wettermodule&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in drei Schritten:&lt;br /&gt;
=== Definition einer Webinstanz für die Wetterstation ===&lt;br /&gt;
Zunächst muss auf einem eigenen Port eine neue FHEMWEB-Instanz angelegt werden, z.B. mit dem Namen WEBweather. Dieser muss zwingend der Name weatherstation zugewiesen werden. Dieser ist in der Firmware der Stationen fest codiert.&lt;br /&gt;
  define WEBweather FHEMWEB 8089 global&lt;br /&gt;
  attr WEBweather webname weatherstation&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Dann wird das Modul noch in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in der Station ===&lt;br /&gt;
Dann muss der Station eingestellt werden, dass die Wetterinformationen an Fhem geschickt werden sollen. Bei einer WH2600 (Station ohne LCD Display) geschieht das im Webinterface, bei einer HP1000 direkt in den Einstellungen des LCD Displays.&lt;br /&gt;
Dazu unter &amp;quot;Weather Network&amp;quot; folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customized&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (siehe unten)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbst gewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbst gewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Auch hat die Firmware oft einen Bug der verhindert, dass IP Adressen direkt verwendet werden können. Hier muss dann zwingend auf einen Domainnamen zurückgegriffen werden!&lt;br /&gt;
Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_WeatherStation FileLog ./log/WeatherStation-%Y.log WeatherStation:T:.*&lt;br /&gt;
&lt;br /&gt;
Alternativ sei auch auf die Verwendung von DbLog verwiesen. Dort kann man mit Hilfe des DbLogInclude Attributs granularer einstellen wie oft ein Wert geloggt werden soll:&lt;br /&gt;
  attr WeatherStation DbLogInclude windSpeed:300 windGust:300 windChill:300 temperature.*:300 humidity.*:300 luminosity:300 uv:300&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass für das Logging die richtigen Events ausgelöst werden. Wer die event-on-* Attribute benutzt kann diese in Kombination mit DbLogInclude z.B. so setzen:&lt;br /&gt;
  attr event-on-update-reading temperature.*,humidity.*,windSpeed,windGust,windChill,luminosity,uv.*,dewpoint.*,rain.*,solarradiation&lt;br /&gt;
  attr event-on-change-reading wu_state,extsrv_state,Activity&lt;br /&gt;
&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16493</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16493"/>
		<updated>2016-10-04T11:25:57Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Wettermodule&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in drei Schritten:&lt;br /&gt;
=== Definition einer Webinstanz für die Wetterstation ===&lt;br /&gt;
Zunächst muss auf einem eigenen Port eine neue FHEMWEB-Instanz angelegt werden, z.B. mit dem Namen WEBweather. Dieser muss zwingend der Name weatherstation zugewiesen werden. Dieser ist in der Firmware der Stationen fest codiert.&lt;br /&gt;
  define WEBweather FHEMWEB 8089 global&lt;br /&gt;
  attr WEBweather webname weatherstation&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Dann wird das Modul noch in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in der Station ===&lt;br /&gt;
Dann muss der Station eingestellt werden, dass die Wetterinformationen an Fhem geschickt werden sollen. Bei einer WH2600 (Station ohne LCD Display) geschieht das im Webinterface, bei einer HP1000 direkt in den Einstellungen des LCD Displays.&lt;br /&gt;
Dazu unter &amp;quot;Weather Network&amp;quot; folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customized&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (siehe unten)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbst gewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbst gewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Auch hat die Firmware oft einen Bug der verhindert, dass IP Adressen direkt verwendet werden können. Hier muss dann zwingend auf einen Domainnamen zurückgegriffen werden!&lt;br /&gt;
Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_WeatherStation FileLog ./log/WeatherStation-%Y.log WeatherStation:T:.*&lt;br /&gt;
&lt;br /&gt;
Alternativ sei auch auf die Verwendung von DbLog verwiesen. Dort kann man mit Hilfe des DbLogInclude Attributs granularer einstellen wie oft ein Wert geloggt werden soll:&lt;br /&gt;
  attr WeatherStation DbLogInclude windSpeed:300 windGust:300 windChill:300 temperature.*:300 humidity.*:300 luminosity:300 uv:300&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass für das Logging die richtigen Events ausgelöst werden. Wer die event-on-* Attribute benutzt kann diese in Kombination mit DbLogInclude z.B. so setzen:&lt;br /&gt;
  attr event-on-update-reading temperature.*,humidity.*,windSpeed,windGust,windChill,luminosity,uv,dewpoint.*,rain.*&lt;br /&gt;
&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16492</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16492"/>
		<updated>2016-10-04T11:24:10Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Eingaben im Webinterface der Station */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Heizungssteuerung/Raumklima&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in drei Schritten:&lt;br /&gt;
=== Definition einer Webinstanz für die Wetterstation ===&lt;br /&gt;
Zunächst muss auf einem eigenen Port eine neue FHEMWEB-Instanz angelegt werden, z.B. mit dem Namen WEBweather. Dieser muss zwingend der Name weatherstation zugewiesen werden. Dieser ist in der Firmware der Stationen fest codiert.&lt;br /&gt;
  define WEBweather FHEMWEB 8089 global&lt;br /&gt;
  attr WEBweather webname weatherstation&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Dann wird das Modul noch in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen in der Station ===&lt;br /&gt;
Dann muss der Station eingestellt werden, dass die Wetterinformationen an Fhem geschickt werden sollen. Bei einer WH2600 (Station ohne LCD Display) geschieht das im Webinterface, bei einer HP1000 direkt in den Einstellungen des LCD Displays.&lt;br /&gt;
Dazu unter &amp;quot;Weather Network&amp;quot; folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customized&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (siehe unten)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbst gewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbst gewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Auch hat die Firmware oft einen Bug der verhindert, dass IP Adressen direkt verwendet werden können. Hier muss dann zwingend auf einen Domainnamen zurückgegriffen werden!&lt;br /&gt;
Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_WeatherStation FileLog ./log/WeatherStation-%Y.log WeatherStation:T:.*&lt;br /&gt;
&lt;br /&gt;
Alternativ sei auch auf die Verwendung von DbLog verwiesen. Dort kann man mit Hilfe des DbLogInclude Attributs granularer einstellen wie oft ein Wert geloggt werden soll:&lt;br /&gt;
  attr WeatherStation DbLogInclude windSpeed:300 windGust:300 windChill:300 temperature.*:300 humidity.*:300 luminosity:300 uv:300&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass für das Logging die richtigen Events ausgelöst werden. Wer die event-on-* Attribute benutzt kann diese in Kombination mit DbLogInclude z.B. so setzen:&lt;br /&gt;
  attr event-on-update-reading temperature.*,humidity.*,windSpeed,windGust,windChill,luminosity,uv,dewpoint.*,rain.*&lt;br /&gt;
&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Msg&amp;diff=16491</id>
		<title>Msg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Msg&amp;diff=16491"/>
		<updated>2016-10-04T11:21:58Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:msg}}{{Infobox Modul&lt;br /&gt;
|ModPurpose=Versenden von Nachrichten der Typen Audio, Text, Mail, Push, Light, Screen&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModFTopic=39983&lt;br /&gt;
|ModCmdRef=MSG&lt;br /&gt;
|ModTechName=75_MSG.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- Stub/Basisinfo angelegt zur Vermeidung von &amp;quot;rotem Link&amp;quot; --&amp;gt;&lt;br /&gt;
Bisher keine über das in der Infobox verlinkte Forenthema hinausgehenden Informationen verfügbar, auch der commandref-Eintrag ist bisher (warum eigentlich?) leer. Darüber hinaus ist die Schreibweise inkonsistent und/oder irreführend: der Befehl ist in Kleinbuchstaben einzugeben, obwohl der Modulname mit Großbuchstaben geschrieben wird. (--&amp;gt; Antwort dazu: [http://www.fhemwiki.de/wiki/Benutzer_Diskussion:Ph1959de#Wiki_Beitrag_zu_msg])&lt;br /&gt;
&lt;br /&gt;
Der Befehl [[msg]] ersetzt ausserdem das vormals verfügbare Modul &#039;&#039;&#039;MSG&#039;&#039;&#039;. Benutzer des alten Moduls müssen ihre Devices auf MSGFile und/oder MSGMail umstellen; bitte dafür das Forenthema {{Link2Forum|Topic=43447|LinkText=&amp;quot;Benutzer von 75_MSG.pm: Aktion notwendig vor Update ab dem 04.11.2015&amp;quot;}} beachten!&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer_Diskussion:Ph1959de&amp;diff=16490</id>
		<title>Benutzer Diskussion:Ph1959de</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer_Diskussion:Ph1959de&amp;diff=16490"/>
		<updated>2016-10-04T11:19:52Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Neuer Abschnitt /* Wiki Beitrag zu msg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Kategoriestruktur ==&lt;br /&gt;
&lt;br /&gt;
Ich habe eine Bestandsaufnahme der Kategoriestruktur mittels Freeplane Mindmap Programm erstellt. Die Quelldatei kann ich derzeit hier nicht ablegen, da nur Bilddateien erlaubt sind. Bei Bedarf bitte nach der .mm Datei fragen, ich sende sie gern an Interessenten (die willens sind, an der Umstrukturierung mitzuarbeiten). --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:13, 8. Jul. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
::Darfst du die Datei im Forum hochladen? Dann könntest einfach von hier dorthin verlinken? Grüße, [[Benutzer:Rince|Rince]] ([[Benutzer Diskussion:Rince|Diskussion]]) 08:43, 10. Jul. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Löschkandidaten ==&lt;br /&gt;
&lt;br /&gt;
Die ganzen unverlinkten Bilde in Löschkandidaten packen hättest du nicht machen brauchen. Ich lösch unverlinkte Bilder die aus dem Import kommen auch so... wenn ich zwischendurch immer mal Zeit [[Benutzer:Soulman|Soulman]] ([[Benutzer Diskussion:Soulman|Diskussion]]) 17:00, 9. Jul. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
: :-) ... War ich ja gar nicht - das war Markusbloch ... von mir war der Hinweis auf die unverlinkten Dateien. --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 23:03, 9. Jul. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
::: Manchmal hab ich eben so ne Phase irgendwie. Ist genauso wie bei der manuellen Korrektur aller Artikel direkt nach dem Import ;-) --[[Benutzer:Markusbloch|Markusbloch]] ([[Benutzer Diskussion:Markusbloch|Diskussion]]) 18:33, 10. Jul. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
::::Oh ja, hab irgendwie nicht aufgepasst. Also gegen die Phasen hab ich nix :-)    [[Benutzer:Soulman|Soulman]] ([[Benutzer Diskussion:Soulman|Diskussion]]) 20:24, 10. Jul. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Abbildung von Bauteilen als Foto  ==&lt;br /&gt;
&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
&lt;br /&gt;
ich habe eine grundsätzliche Frage zur Darstellung von eigenen Fotos unter FHEMWiki. Ist es urheberrechtilich zulässig, eigene Fotos von Bauteilen darzustellen ?&lt;br /&gt;
&lt;br /&gt;
Gruß&lt;br /&gt;
Lothar&lt;br /&gt;
&lt;br /&gt;
:Hallo Lothar, ich bin da zwar kein Experte, denke aber, dass genau diese Art von Bildern erlaubt ist. Was nicht geht, ist das Übernehmen von Bildern von z.B. einer Herstellerseite, oder das direkte einbinden von Bildern aus fremdem Webspace. Ich denke, diese Aussage ist auch durch die Beschreibung bei Wikipedia abgedeckt: http://de.wikipedia.org/wiki/Hilfe:Bildertutorial/2_Bildrechte.&lt;br /&gt;
:&amp;lt;hr&amp;gt;&lt;br /&gt;
:--[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:30, 27. Aug. 2013 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Urheberschaft der alten Einträge ==&lt;br /&gt;
&lt;br /&gt;
Hallo,&lt;br /&gt;
&lt;br /&gt;
ich habe festgestellt, dass ihr beim Neuaufsetzen des Wiki alle Urheberinformationen gelöscht habt. War das Absicht, oder ein Unfall ?&lt;br /&gt;
&lt;br /&gt;
KG&lt;br /&gt;
&lt;br /&gt;
pah&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo pah, muss man wohl eher als Unfall bezeichnen. Das Wiki war komplett weg (und das Backup war nicht wirklich als solches zu bezeichnen, sondern komplett unbrauchbar) und wurde aus dem Google-Cache wieder hergestellt. Dabei ist natürlich die ganze Änderungshistorie (und damit auch das was Du vermutlich als Urheberinformation bezeichnest?) verloren gegangen. &lt;br /&gt;
:Aber das erinnert mich daran, dass ich bei einem der Administratoren dringend mal nachfragen wollte, wie es jetzt um die Sicherstellung der Backups steht.&lt;br /&gt;
:Und noch ein Nachsatz: &#039;&#039;...dass ihr beim Neuaufsetzen des Wiki...&#039;&#039;: daran war ich nicht wirklich aktiv beteiligt. Bin auch nur &amp;quot;ganz normaler&amp;quot; Wiki Benutzer ohne besondere Rechte.  --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:43, 10. Nov. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links auf der Willkommensseite == &lt;br /&gt;
Hallo Peter, &lt;br /&gt;
&lt;br /&gt;
ich bin - als Neuling - nicht ganz sicher, ob die Kommunikation mit Dir so gedacht ist, aber zumindest stand das so auf der Begrüßungsseite ;-)&lt;br /&gt;
&lt;br /&gt;
Ich habe festgestellt, dass in der Begrüßungsseite die Links auf die englische Version von wikipedia verweisen. Ich denke gerade für Neulinge wäre da die deutsche Version besser. (Z.B. http://de.wikipedia.org/wiki/Wikipedia:Tutorial)&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Funfactor|Funfactor]] ([[Benutzer Diskussion:Funfactor|Diskussion]]) 12:31, 28. Nov. 2013 (CET)&lt;br /&gt;
: ... ja, ist mir bekannt (trotzdem danke für die Rückmeldung). Kann ich aber leider nicht ändern, aber wenn ich mich recht erinnere, habe ich da beim &amp;quot;Betreiber&amp;quot; unseres Wiki schon mal nachgefragt aber bisher keine Antwort bekommen. Ich werde noch mal nachhaken. --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:40, 28. Nov. 2013 (CET)&lt;br /&gt;
:: Ok, ich habe mir das noch mal angeschaut. Ist für neue Benutzer wirklich ziemlich verwirrend, deshalb habe ich vorerst mal &amp;quot;hartcodiert&amp;quot; auf die Links auf die deutschen Wikipedia:-Hilfeseiten umgestellt. --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:42, 28. Nov. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== Verwendung der Sandbox == &lt;br /&gt;
Hallo Peter,&lt;br /&gt;
&lt;br /&gt;
den Wiki &amp;quot;sauber&amp;quot; zu halten ist ja eine wichtige Sache und ich denke dafür ist die [[FhemWiki:Sandbox]] gedacht. &lt;br /&gt;
Leider ist mir völlig unklar, wie ich diese in diesem Sinne verwenden soll. Gibt es hierzu eine Anleitung oder ein paar Hinweise?&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Funfactor|Funfactor]] ([[Benutzer Diskussion:Funfactor|Diskussion]]) 17:01, 29. Nov. 2013 (CET)&lt;br /&gt;
:Die Geschichte mit der Sandbox sollte man vielleicht nicht überbewerten. Was vermieden werden sollte ist &lt;br /&gt;
:* das wilde Anlegen von neuen Artikeln mit zusätzlichem experimentieren mit den Seitennamen (das gibt dann immer gleich eine Weiterleitung und zusätzlichen Aufräumaufwand)&lt;br /&gt;
:* jede noch so kleine Änderung separat abzuspeichern (Vorschau, Vorschau, Vorschau!); es gibt einige Leute, die neue Änderungen querlesen - denen macht man die Arbeit sonst unnötig schwer&lt;br /&gt;
:* was mir sonst noch so eingefallen ist, habe ich schon auf die [[FHEMWiki:Über FHEMWiki]]-Seite geschrieben (darf natürlich ergänzt werden)&lt;br /&gt;
:Experimentieren kann man zur Not auch im eigenen Namensraum (also in Deinem Fall &amp;lt;nowiki&amp;gt;[[Funfactor/Experiment...]]&amp;lt;/nowiki&amp;gt;. Aber weitere Ideen sind jederzeit willkommen (bitte beachten: ich bin auch nur &amp;quot;ganz normaler User&amp;quot; hier). --[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:35, 29. Nov. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== On-for-timer zurücksetzen ==&lt;br /&gt;
Hi, es gibt da einen Artikel, den ich erstmals gerne mit einem Template Löschkandidat oder Qualtitästsicherung versehen würde: &#039;&#039;&#039;On-for-timer zurücksetzen&#039;&#039;&#039;&lt;br /&gt;
Erbitte Zweitmeinung. Und ich weiss  nicht, ob wir ggf passende Templates haben muss ich zugeben.&lt;br /&gt;
&lt;br /&gt;
[[Benutzer:Soulman|Soulman]] ([[Benutzer Diskussion:Soulman|Diskussion]]) 16:38, 27. Dez. 2013 (CET)&lt;br /&gt;
:&amp;lt;hr&amp;gt;&lt;br /&gt;
:--[[Benutzer:Stephan|Stephan]] ([[Benutzer Diskussion:Stephan|Diskussion]]) 16:45, 27. Dez. 2013 (CET) &#039;&#039;(Stefans Beitrag auf die Diskussionsseite des Artikels ([[Diskussion:On-for-timer_zurücksetzen]]) verschoben [ph1959de])&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;hr&amp;gt;&lt;br /&gt;
:Ich (traue mich fast nicht :-), aber ich ...) verweise einfach mal auf die [[:Kategorie:Löschkandidaten]] und dortselbst auf den einleitenden Text.&lt;br /&gt;
:--[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 17:54, 27. Dez. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
== autocreate ==&lt;br /&gt;
du hast recht. in der default konfiguration von autocreate ist autosave an. aber es gibt devices wie z.b. OWServer/HUE und ich glaube sogar HM die gehen nicht über autocreate und da ist es auf jeden fall nötig von hand save zu sagen. [[Benutzer:Justme|Justme]] 19:56, 8. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
== 1-Wire - Kategorie vs. Artikel ==&lt;br /&gt;
Ich finde es nicht richtig, die Übersichtsbeschreibung - z.B. was das 1-Wire System ist - aus der Kategorieseite herauszunehmen. Diese Trennung schafft Redundanz und verhindert sie nicht.&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung ist eine unmittelbare semantische Eigenschaft der Kategorie, und kein untergeordneter Begriff.&lt;br /&gt;
--[[Benutzer:Pahenning|Pahenning]] ([[Benutzer Diskussion:Pahenning|Diskussion]]) 19:05, 22. Feb. 2014 (UTC)&lt;br /&gt;
:&#039;&#039;Ich habe mir mal erlaubt, die Diskussion zu einem eigenen Abschnitt zu machen.&#039;&#039;&lt;br /&gt;
:Nachdem Du meine Änderung mittlerweile rückgängig gemacht hast, erübrigt sich ja eine weitere Diskussion. Konsequenterweise müsstest Du aber dann auch den Artikel [[1-Wire]] mitpflegen - Artikel und Kategorietext sind derzeit nur deshalb gleich, weil ich die Inhalte mit meiner Änderung auch konsolidiert hatte.&lt;br /&gt;
:Damit die Diskussion über dieses Thema leichter auffindbar ist, kopiere ich sie noch in die [[Kategorie_Diskussion:1-Wire]], wo sie dann ggf. auch weitergeführt werden kann/sollte.&lt;br /&gt;
&lt;br /&gt;
::Werde ich machen&lt;br /&gt;
::--[[Benutzer:Pahenning|Pahenning]] ([[Benutzer Diskussion:Pahenning|Diskussion]]) 15:38, 24. Mär. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Disclaimer ==&lt;br /&gt;
&lt;br /&gt;
Es erscheinen immer mehr Schaltpläne hier im Wiki. Vorschlag: Einen allgemeinen Disclaimer des Inhaltes:&lt;br /&gt;
&lt;br /&gt;
- Nachbau aller Schaltpläne auf eigene Gefahr&lt;br /&gt;
- Weder Betreiber noch Autoren übernehmen irgendeine Haftung für Inhalte und unmittelbare oder mittelbare Folgen&lt;br /&gt;
- Hinweis auf die gesetzlichen Regelungen beim Anschluss an 230 V-Netze&lt;br /&gt;
&lt;br /&gt;
und diesen dann ausdrücklich unten neben &amp;quot;Datenschutz etc.&amp;quot; referenzieren.&lt;br /&gt;
&lt;br /&gt;
LG&lt;br /&gt;
&lt;br /&gt;
pah&lt;br /&gt;
--[[Benutzer:Pahenning|Pahenning]] ([[Benutzer Diskussion:Pahenning|Diskussion]]) 15:42, 24. Mär. 2014 (UTC)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Wenn Du damit ein Template/eine Vorlage meinst, die auf relevanten Seiten gezielt eingebunden werden kann/muss, kann ich das gern mal in Angriff nehmen. Ich würde mich dann an dem Text orientieren, den Du auf [[1W-WPump]] eingefügt hast. Im Augenblick ließe sich dafür auch die Vorlage &amp;lt;nowiki&amp;gt;{{Randnotiz|...}}&amp;lt;/nowiki&amp;gt; (siehe [[FHEMWiki:Über_FHEMWiki#Vorlagen]]) verwenden.&lt;br /&gt;
:Für einen generellen Wiki-weiten Disclaimer würde ich Dich eher bitten, das selbst zu machen oder den Wiki-Admin [[Benutzer Diskussion:akw|Arno]] anzusprechen.&lt;br /&gt;
:--[[Benutzer:Ph1959de|Greetz, Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 10:45, 25. Mär. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Erweiterung der Vorlage &amp;quot;Infobox Hardware&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
hallo peter, &lt;br /&gt;
ich habe deine nachricht eben erst gesehen. &lt;br /&gt;
&lt;br /&gt;
die idee war die infoboxen für modul und hardware ähnlicher zu machen. es ging mir nicht um den link zum modul sondern tatsächlich zum maintainer und da die möglichkeit aufs forums profil zu verlinken. so wie du es bei der neuen FLOORPLAN seite gemacht hast. zumindest bei &#039;meinen&#039; modulen ist es zur zeit so das die info für die hardware und das fhem modul auf einer seite stehen. siehe: pca301 oder panstamp/swap. da gibt es entweder nur eine der beiden boxen oder die gleiche info taucht in beiden boxen auf. beides gefällt mir nicht wirklich.&lt;br /&gt;
&lt;br /&gt;
eigentlich wollte ich die komplette ersteller zeile optional haben. das habe ich aber mit der tabellen formatierung noch nicht hin bekommen. jetzt ist erst mal nur der inhalt optional.&lt;br /&gt;
&lt;br /&gt;
inzwischen habe ich noch &amp;quot;FHEMDevice&amp;quot; in &amp;quot;Modulname&amp;quot; geändert so wie es in der modul infobox auch ist. und die reihenfolge unter sonstiges geändert.&lt;br /&gt;
&lt;br /&gt;
ich kann das aber auch wieder zurück bauen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Justme|Justme]] ([[Benutzer Diskussion:Justme|Diskussion]]) 13:51, 16. Mai 2014 (UTC)&lt;br /&gt;
:Auf der [[Vorlage_Diskussion:Infobox_Hardware]]-Seite geht&#039;s weiter.&lt;br /&gt;
&lt;br /&gt;
== neue seiten ==&lt;br /&gt;
wo wir gerade dabei sind :). ich glaube es wäre schon den auskommentierten abschnitt &#039;neue seiten&#039; auf der einstiegsseite zu aktivieren. --[[Benutzer:Justme|Justme]] ([[Benutzer Diskussion:Justme|Diskussion]]) 14:01, 16. Mai 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== neue Seiten ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
&lt;br /&gt;
Ich bin auch ein Neuling, und will meine Erfahrungen gerne anbieten an andere Benutzer. Zum Beispiel habe ich gerade der Modul Openweathermap in Betrieb genommen, und habe dabei einige Probleme gelöst. Ich hätte gern mehr Beispiele gehabt, und will die darum in eine Seite verwenden. Ist das erwünscht? Wenn ja, wie sollen neue Seiten über Devices eingeordnet werden, z.B. Openweathermap? (Deutsch ist nicht meine Muttersprache, so hoffentlich mache ich nicht zuviel Fehler).&lt;br /&gt;
&lt;br /&gt;
[[Benutzer:TrudiB|TrudiB]] ([[Benutzer Diskussion:TrudiB|Diskussion]]) 11:37, 23. Mai 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Trudi, es ist auf jeden Fall erwünscht, dass (funktionierende) Beispiele (möglichst komplett) vorgestellt werden.&lt;br /&gt;
:Um eine neue Modulbeschreibung anzulegen, würde ich empfehlen, mal [[Vorlage:Infobox_Modul]] anzuschauen. Auf der [[FHEMWiki:Über_FHEMWiki]]-Seite findest Du auch in der Spalte &amp;quot;Ref&amp;quot; eine Liste der Seiten, die nach dem Schema angelegt oder überarbeitet wurden.&lt;br /&gt;
:Im Zweifel einfach noch mal nachfragen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:11, 23. Mai 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Admin ==&lt;br /&gt;
&lt;br /&gt;
Ph1959de erhält mit sofortiger Wirkung Administrator-Status im FHEMWiki. --[[Benutzer:Akw|Akw]] ([[Benutzer Diskussion:Akw|Diskussion]]) 10:56, 31. Mai 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
==ZHK Seiten Einzelmodule ==&lt;br /&gt;
&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
Ich würde den Meinungsaustausch zum Thema wiki Pages valves/stellmotor gerne zu einem gemeinsamen Abschluss bringen. Ein (Erneutes) Feedback von dir wäre dabei hilfreich. Ich möchte dich daher herzlich einladen meine&lt;br /&gt;
Disk.Seite erneut zu besuchen und um Dein Feedback zu bereichern.&lt;br /&gt;
LG florian&lt;br /&gt;
&lt;br /&gt;
==Kategorien für EnOcean ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
für EnOcean gibt es 2 Kategorien: EnOcean und EnOcean_Components (anlog Homematic u.a.). In EnOcean ist der &amp;quot;EnOcean starter guide&amp;quot; und die Kategorie ist sinnvoll ins Wiki eingebunden. In der nichteingebundenen Kategorie &amp;quot;EnOcean_Components&amp;quot; befindet sich nur ein Sensor. Ist das so beabsichtigt? oder sollte das nicht angepasste werden.&lt;br /&gt;
Danke, Christian&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Hallo Christian, nachdem die &amp;quot;EnOcean Components&amp;quot; Kategorie gerade erst &amp;quot;angelegt&amp;quot; wurde, würde ich erst mal abwarten. Eigentlich passt die Kategorie eher ins Konzept als das reine &amp;quot;EnOcean&amp;quot;. Ich tendiere also eher dazu, alles auf &amp;quot;EnOcean Components&amp;quot; zu konsolidieren. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 17:45, 13. Jul. 2014 (UTC)&lt;br /&gt;
::Hallo Peter, bin dabei, den EnOcean starter guide schrittweise zu überarbeiten. Ich würde dabei einige Aktoren- und Sensorenerläuterungen aus dem Starter guide entnehmen und als separate Artikel in &amp;quot;EnOcean components&amp;quot; aufnehmen; jedoch hätte ich gerne auch eine vernünftige Erreichbarkeit. Am einfachsten wäre es doch auch den starter guide zu verschieben. Dazu habe ich aber zuwenig Ahnung und würde das lieber einem Admin überlassen. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 18:09, 13. Jul. 2014 (UTC)&lt;br /&gt;
::&amp;lt;hr&amp;gt;&lt;br /&gt;
:::Christian, wenn Du mit &amp;quot;Starter Guide verschieben&amp;quot; das Umhängen in Kategorie &amp;quot;EnOcean Components&amp;quot; meinst: das habe ich gerade gemacht (die Änderung besteht einfach nur aus dem Einsetzen des neuen Kategorienames im Artikel).  Außerdem habe ich Kategorie &amp;quot;EnOcean&amp;quot; nach [[:Kategorie:EnOcean Components]] verschoben. Jetzt ist es einheitlich zu FS20, HomeMatic, etc.&lt;br /&gt;
:::... und jetzt kannst Du loslegen mit den weiteren Änderungen - nur eine Bitte noch: Namensschema gut überlegen und neue Artikel möglichst erst speichern, wenn Du wirklich komplett damit zufrieden bist (Vorschaufunktion &amp;quot;großzügig verwenden&amp;quot;). Das macht es den (wenigen) Leuten, die alle Änderungen hier im Wiki &amp;quot;sichten&amp;quot; einfacher. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 05:15, 14. Jul. 2014 (UTC)&lt;br /&gt;
:::: Vielen Dank für Deine schnelle Reaktion; werde versuchen Deine Bitten umzusetzen. Einen Wunsch habe ich natürlich noch ;-). Könnten wir EnOcean nicht auch auf der Hauptseite verlinken? Gruß, Christian--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 09:27, 14. Jul. 2014 (UTC)&lt;br /&gt;
::::&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::Ich habe ohnehin noch einige Änderungen für die Hauptseite auf meiner Liste. Da werde ich dann EnOcean auch mit aufnehmen ... bis dahin gibts ja dann vielleicht auch noch mehr Artikel in der Kategorie. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 09:44, 14. Jul. 2014 (UTC)&lt;br /&gt;
::::::zum Namensschema: Habe in der Kategorie den Hinweis zum Namensschema analog der anderen Hardwaresystme eingefügt. Mich stört eigentlich das Vorsetzen von EnOcean- ,würde es gerne weglassen, aber es scheint übliche Konvention hier zu sein. In der der Übersicht erscheint so aber alles unter &amp;quot;E&amp;quot;. Hast Du dazu eine Meinung? Sorry, wenn ich so viel frage, aber bevor ich alles durcheinanderbringe...&lt;br /&gt;
::::::&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::::Kein Problem (zu fragen) - ist wirklich einfacher, als nachher alles wieder &amp;quot;geradebiegen&amp;quot; zu müssen.&lt;br /&gt;
:::::::Nun, das Namensschema kannst ja Du im Augenblick noch festlegen. Bei den (z.B.) [[:Kategorie:FS20 Components|FS20 Komponenten]] ist es, wie Du schon bemerkt hast, so, dass alles unter einem Buchstaben im Index erscheint. Wie man das ändern kann, habe ich exemplarisch mal im [[FS20 WS1 Wechselschalter]] gezeigt.&lt;br /&gt;
:::::::Hat alles so seine Vor- und Nachteile. Auch wenn Du nicht immer &amp;quot;EnOcean&amp;quot; davor schreibst, werden doch trotzdem viele Geräte mit den gleichen Buchstaben beginnen. Dann kann es ja auch gleich das EnOcean sein. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:27, 14. Jul. 2014 (UTC)&lt;br /&gt;
:::: Hallo Peter! Danke für das kurzfristige Aufnehmen von EnOcean auf der Hauptseite. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:14, 17. Jul. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Subtype Tabelle für EnOcean ... Wiki-Tipps? ==&lt;br /&gt;
Hallo Peter, bräuchte noch einmal Wiki-Nachhilfe, da ich keine einfache Lösung gefunden habe. Vielleicht hast Du eine Idee:&lt;br /&gt;
Ich würde gerne auf der Kategorie-Seite EnOcean Components die vorhandenen EnOcean-Wiki-Artikel noch einmal separat anhand des EnOcean-Attributs &amp;quot;subType&amp;quot; zuordnen und sichtbar machen.&lt;br /&gt;
Quasi eine (lange) Tabelle der Art &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! subType                                       !! Wiki-Seite Geräte                    &lt;br /&gt;
|-&lt;br /&gt;
| switch                      || [[EnOcean-PTM-210-Taster]]          &lt;br /&gt;
|-&lt;br /&gt;
| lightSensor.01              || [[EnOcean-FAH60-Au%C3%9Fen-Helligkeitssensor]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Manuell könnte ich das auf die Kategorienseite einpflegen -&amp;gt; fehleranfällig&lt;br /&gt;
&lt;br /&gt;
Unterkategorien -&amp;gt; nicht erwünscht und klickintensiv, aber weniger wartungsintensiv&lt;br /&gt;
&lt;br /&gt;
Unterseite zu EnOcean Components -&amp;gt; fehleranfällig und nicht auffällig&lt;br /&gt;
&lt;br /&gt;
Hast Du dazu eine Idee/Meinung? Danke --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 22:41, 5. Aug. 2014 (UTC)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Ich würde (zumindest für&#039;s Erste) mal was Ähnliches machen wie die &amp;quot;News&amp;quot; Sektion auf der Hauptseite. Da wird Vorlage [[Vorlage:FHEMWiki_News]] eingebunden. In dieser Vorlage wird (manuell, aber wie ich finde recht übersichtlich) eine Tabelle unter zuhilfenahme der Vorlage [[Vorlage:News]] aufgebaut.&lt;br /&gt;
:Wenn ich das richtig sehe, könntest Du sogar in (D)einer neuen Vorlage (nennen wir sie mal &amp;lt;nowiki&amp;gt;{{EnOceanSubTypeTable}}&amp;lt;/nowiki&amp;gt;) einfach die News Vorlage so &amp;lt;nowiki&amp;gt;{{News|subType|Wiki-Seite}}&amp;lt;/nowiki&amp;gt; &amp;quot;missbrauchen&amp;quot;. Und die EnOceanSubTypeTable ließe sich dann nicht nur auf der Kategorie-Seite, sondern auch auf anderen Seiten bei Bedarf einfach so einbinden. Ansonsten halte ich mal die Augen offen und schaue, ob ich noch eine andere Lösung / einen besseren Ansatz finde.&lt;br /&gt;
:P.S.: Ich finde, Du machst einen Superjob in der &amp;quot;EnOcean-Abteilung&amp;quot; hier im Wiki. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:16, 6. Aug. 2014 (UTC)&lt;br /&gt;
:&amp;lt;hr /&amp;gt;&lt;br /&gt;
:: Ich probiere einmal Deinen Vorschlag umzusetzen. Hoffe es gelingt; löschen kann man immer noch....&lt;br /&gt;
:: Nach Lösungen hatte ich auch gesucht, aber mit meinem Wiki-Halbwissen nichts einfaches entdecken können.&lt;br /&gt;
::P.S.: Danke, zurück an Dich (auch wegen Nachhilfe). Bei EnOcean hilft 50watt auch mit. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 12:04, 6. Aug. 2014 (UTC)&lt;br /&gt;
:: Hm, hatte es befürchtet, Vorlage und Text waren schnell erstellt, aber dann: &amp;lt;s&amp;gt;Deine &amp;quot;nowiki&amp;quot; Geschichte habe ich anscheinend falsch verstanden.&amp;lt;/s&amp;gt; (Man/Ich sollte erst denken und dann schreiben) Als Box -wie die News auf der Hauptseite- einbinden habe ich auf die Schnelle nicht hinbekommen. Da sind soviele Codetags mit denen ich mich noch beschäftigen muss. Hoffe ich habe hier kein Chaos verursacht; ansonsten bitte löschen. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 13:31, 6. Aug. 2014 (UTC)&lt;br /&gt;
::&amp;lt;hr /&amp;gt;&lt;br /&gt;
:::Sieht doch schon ganz gut aus. Für eine direkte Einbindung auf der Kategorieseite ist die Tabelle meiner Ansicht nach eh zu groß, daher finde ich den von Dir gewählen Ansatz mit der eigenen Seite ganz gut.&lt;br /&gt;
:::In der Vorlage müsstest Du noch die Erläuterung zum &amp;quot;xx&amp;quot; überarbeiten (die führende Leerstelle macht das automatisch zu einem &amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/nowiki&amp;gt;. Wenn Du die Hervorhebung willst, müsstest Du den Satz in &amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/nowiki&amp;gt; setzen.&lt;br /&gt;
:::Das Layout der Tabelle kann man ja auch jederzeit noch ändern.&lt;br /&gt;
:::Wenn Du noch Hilfe / Unterstützung brauchst, lass es mich wissen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:36, 6. Aug. 2014 (UTC)&lt;br /&gt;
:::&amp;lt;hr /&amp;gt;&lt;br /&gt;
::::Mit dem Ergebnis bin ich nicht wirklich zufrieden. Aber bevor ich daran weiterarbeite, muss ich mehr zur Wiki-Bearbeitung lernen. &lt;br /&gt;
::::Danke für Deine bisherige Unterstützung und auch das Hilfsangebot. Werde sicherlich darauf zurückkommen. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 14:53, 6. Aug. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Vorlage Link2Forum ==&lt;br /&gt;
Hallo Peter, soll ich die Vorlage Link2Forum schon nutzen? Wenn ich es zeitlich morgen schaffe, wollte ich sowieso noch einige EnOcean Wiki-Seiten anfassen. Würde es dann schon mitändern. Oder kannst Du das automatisiert? Gruß, Christian --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 19:32, 11. Aug. 2014 (UTC)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Christian, ich würde die Vorlage bisher nur für den sparsamen Einsatz (kannst sie gern in ein oder zwei Artikeln ausprobieren) empfehlen. Insbesondere innerhalb der &amp;quot;Infobox Modul&amp;quot; bin ich noch nicht ganz soweit - da tendiere ich eher noch dazu, das Link2Forum direkt aus der Infobox heraus einzusetzen. Das wäre dann nur eine Änderung, die hoffentlich alle bisherigen Einsatzstellen der Infobox erwischen würde (wobei, der Forenlink ist meines Wissens noch lange nicht überall drin; das habe ich ja erst kürzlich in die Infobox aufgenommen).&lt;br /&gt;
:Automatisieren kann ich leider nichts; mir ist (zumindest noch) nicht bewusst, dass wir hier die Möglichkeit haben, irgendwelche Bots einzusetzen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 21:32, 11. Aug. 2014 (UTC)&lt;br /&gt;
:&amp;lt;hr /&amp;gt;&lt;br /&gt;
::Nutze bei EnOcean nur &amp;quot;Infobox Hardware&amp;quot; intensiv, dort brauche ich die Links nicht. Innerhalb der Wiki-Seiten verlinke ich häufiger auf einen bestimmeten Beitrag im Forum. Dort könnte ich schon umstellen auf &amp;lt;nowiki&amp;gt;{{Link2Forum|Topic=12345|Message=54321}}&amp;lt;/nowiki&amp;gt;. Über die Vorlage &amp;quot;Infobox Modul&amp;quot; habe ich mir bei EnOcean noch keine Gedanken gemacht (Momentan grübel ich eher noch Einsatzbeispiele analog zur Vorlage EnOceanSubTypetable zusammenzufassen).  --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 22:04, 11. Aug. 2014 (UTC)&lt;br /&gt;
::&amp;lt;hr /&amp;gt;&lt;br /&gt;
:::Wie gesagt, bitte noch &amp;quot;defensiv&amp;quot; benutzen, da ich noch keine umfangreicheren Tests gemacht habe. Daher bin ich aber natürlich auch an Rückmeldungen (die bitte dann auf der entsprechenden Diskussionsseite) zu der Vorlage interessiert (gibts Probleme, Änderungs-, Erweiterungswünsche und/oder -bedarf...?). &lt;br /&gt;
:::Ansonsten: Infobox Modul - dafür gäbe es bei EnOcean wohl nur genau eine Einsatzmöglichkeit, wenn ich das richtig sehe. Das könntest Du anlegen, wenn Du die Vorlage mal einsetzen möchtests. Oder gibt es weitere Module, die EnOcean implementieren? --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 05:06, 12. Aug. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Inhalt Hauptseite ==&lt;br /&gt;
Hallo Peter, folgende Idee/Vorschläge zur Wiki-Hauptseite:&lt;br /&gt;
Developers Corner: die dort direkt verlinkten Seiten sind -vorsichtig formuliert- nicht gerade die Aktuellsten; könnte man dort nicht besser gut gepflegte Seiten wie [[DevelopmentModuleIntro]] oder [[DevelopmentGuidelinesAV]] direkt verlinken? Außerdem ist das &amp;quot;Guter Startpunkt, sehr empfohlen!&amp;quot; unter &amp;quot;Wie fange ich an&amp;quot; meiner Meinung nach zu schwach. Ich denke das ist DIE Grundvoraussetzung für den ersten Überblick; hast Du auch unter [[Planung]] geschrieben. &amp;quot;Tipp der Woche&amp;quot; unter Ideen und Lösungen ist (war?) &amp;quot;nur&amp;quot; der &amp;quot;Tipp des Monats&amp;quot; und sollte dann auch so genannt werden. Wird anscheinend nur von soulman gepflegt. Wenn da nichts Aktuelles drin steht, wirkt das Wiki ziemlich tot. Andererseits habe ich persönlich auch keinen großen Antrieb dort etwas zu verfassen. Wer sucht dort wirklich?&lt;br /&gt;
Ich weis, kaum aktiv und schon Rumnörgeln... (Nicht wundern: Ich habe mich heute aber schon wieder darüber geärgert, dass immer mehr Blogs Fhem-Artikel mit typischen Wiki-Inhalt veröffentlichen statt dies hier zu tuen, wo ein zentraler Anlaufpunkt sein sollte. Wenn diese Blog-Artikel auch noch umständlich oder fehlerbehaftet sind, hat man keine Einfluß auf Korrekturen und der Kram ist im Umlauf. Dagegen sollten wir arbeiten.)--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:22, 14. Aug. 2014 (UTC)&lt;br /&gt;
Auch &amp;lt;nowiki&amp;gt;[[Links|wichtige Fhem Links]]&amp;lt;/nowiki&amp;gt; sind nicht gerade top-aktuell. Für wichtig halte ich die schon gar nicht. So, Frust weg ;-). Aber dennoch halte ich meine Anmerkungen für diskussionswürdig. Ich möchte auf der Hauptseite nicht eigenständig ändern, da mir nicht bekannt ist, ob das für Normal-Anwender erlaubt ist. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 18:31, 14. Aug. 2014 (UTC)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Christian, auch die Hauptseite kann von jedem bearbeitet werden - aber vorherige Diskussion ist da vielleicht nicht falsch. Ich habe daher Deine Anregungen mal auf die [[Diskussion:Hauptseite#Vorschläge zur Überarbeitung der Hauptseite|Diskussionsseite]] übertragen. Lass uns die Sache da weiterführen ... vielleicht beteiligt sich ja noch jemand... --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 05:41, 15. Aug. 2014 (UTC)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
::Ok, werde auch versuchen meine Anmerkungen passender zu platzieren. Hoffe nur, dass das dann nicht komplett untergeht. Habe aber teilweise keine Ahnung, wo das hin soll - bin noch zu Wiki-unerfahren. Aktuell bspw. [[Spezial:Gewünschte_Seiten]] enthält nach meiner Meinung eine Vielzahl von &amp;quot;Leichen&amp;quot;, die weg können (FR und alles was damit zusammenhängt; Links durch STELLMOTOR). Ich habe da keine Ahnung, wo ich anfangen soll/darf. Ich würde beispielsweise bei [[STELLMOTOR]] die  &amp;quot;toten&amp;quot; Lemmas/Seiten herausnehmen. Der Ersteller von STELLMOTOR könnte sie wieder reinnehmen, wenn er tatsächlich daran arbeiten will; traue mich aber nicht.&lt;br /&gt;
::&#039;&#039; ... vielleicht beteiligt sich ja noch jemand...&#039;&#039; Hoffnung stirbt zuletzt.... ;-) --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:15, 15. Aug. 2014 (UTC)&lt;br /&gt;
::&amp;lt;hr /&amp;gt;&lt;br /&gt;
:::* Ist schon ok, das hier zu plazieren ... aber außer mir findet das hier keiner, daher der &amp;quot;Umzug&amp;quot;&lt;br /&gt;
:::* &amp;quot;Gewünschte Seiten&amp;quot; ... enthält alle &amp;lt;nowiki&amp;gt;[[Lemma...]]&amp;lt;/nowiki&amp;gt; Stellen, die auf nicht existierende Seiten verweisen. Wenn&#039;s so extrem vorkommt wie in Deinem genannten Beispiel, einfach den entsprechenden Benutzer anschreiben. Wirklich stören tut&#039;s aber auch nicht - du glaubst gar nicht, wie &#039;&#039;&#039;wenige&#039;&#039;&#039; Benutzer die &amp;quot;Gewünschte Seiten&amp;quot; Seite jemals gesehen haben, geschweige denn regelmäßig benutzen.&lt;br /&gt;
:::* Anfangen darfst Du sicherlich da, wo ein Eintrag in die &amp;quot;Gewünschten Seiten&amp;quot; offensichtlich versehentlich entstanden ist, z.B. weil jemand sich schlicht vertippt hat; wenn jemand schon mal eine Liste erstellt hat, welche Seiten noch gemacht werden müssen (wie ich z.B. auf meiner Benutzerseite :-) ), würde ich das erst mal ganz gelassen so stehen lassen.&lt;br /&gt;
:::* Und immer im Hinterkopf behalten, dass viele Benutzer hier im Wiki nur ganz gelegentlich unterwegs sind um vielleicht den einen oder anderen Tippfehler zu korrigieren - und das war&#039;s dann auch schon. Die meisten Benutzer bekommen nicht mal die Begrüßungshinweise mit ... und/oder lesen sie nicht, halten sich nicht dran, verstehen sie nicht... &lt;br /&gt;
:::Bottom line: nicht zu viel erwarten, Dich selbst nicht &amp;quot;aufreiben&amp;quot;, aber fleißig weitermachen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:35, 15. Aug. 2014 (UTC)&lt;br /&gt;
:::&amp;lt;hr /&amp;gt;&lt;br /&gt;
::::Bottom line: keine Sorge, reibe mich schon nicht auf. &#039;&#039;weiter&#039;&#039;&#039;machen&#039;&#039;&#039;&#039;&#039;: ich würde es grds. einfach machen, will aber niemanden vergraulen und den Admins unnötig Arbeit machen; hätte in STELLMOTOR die &amp;quot;toten&amp;quot; Lemmas in normale Aufzählung verwandelt, FR gelöscht (Leiche des Absturzes), kleinere Änderungen an Hauptseite vorgenommen oder... Rückgängig kann man (Admin/Ersteller) es immer noch machen; eigentlich ist es mir zu viel Diskussion, die mMn keinen weiterbringt, (wie lange soll man auf Entgegnungen warten?).....  &lt;br /&gt;
::::Meine Bottom line: Keine Sorge Umstrukturierungen (Kategorien) o.ä. würde ich nicht undiskutiert vornehmen&lt;br /&gt;
:::::Nur teilweise Offtoic: Peter, wenn Du meine Verlinkung in der Homematic-Kategorie nicht OK findest, mach es einfach rückgängig: Für mich ist das in Ordnung, habe damit grds. kein Problem; gilt immer. Gruß, Christian (Habe da eh noch einen Tippfehler eingebaut!)&lt;br /&gt;
&lt;br /&gt;
== WikiArtikel Pflege ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
die &amp;quot;Verschieben&amp;quot; Option von Artikeln kannte ich in der Tat noch nicht. Danke für den Hinweis..&lt;br /&gt;
:Kein Problem &amp;amp; gern geschehen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:45, 29. Aug. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
Du kannst meine Wiki-Artikel gerne korrigieren und vereinheitlichen. Wenn du mir zusätzlich noch verrätst worauf du achtest, kann ich versuchen diese Dinge gleich selbst zu beachten.&lt;br /&gt;
:&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Lässt sich so generell nicht beantworten; manchmal nur Kleinigkeiten. Beispiele:&lt;br /&gt;
:* Artikel in Ich-Form schreibe ich normalerweise auf neutrale Ausdrucksweise um (später weiß ohnehin niemand mehr, wer der &amp;quot;Ich&amp;quot; war); das ist verbindlicher und mMn für technische Beschreibungen angemessener.&lt;br /&gt;
:* Querverweise (Links auf andere Artikel) einfügen - auch IN anderen Artikeln wo sinnvoll Verweise auf Deinen neuen Artikel setzen (sonst entstehen &amp;quot;Waisen&amp;quot; und &amp;quot;Sackgassen&amp;quot;); ob es schon Links auf Deine Seite gibt, kannst Du über das &amp;quot;Links auf diese Seite&amp;quot; (links in der Navigationsleiste) herausfinden.&lt;br /&gt;
:* Rechtschreibung / Grammatik / Formulierung... ist eigentlich immer dabei&lt;br /&gt;
:* usw.&lt;br /&gt;
:-- [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:45, 29. Aug. 2014 (UTC) &amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nochetwas: ich vermisse eine Kategorie für selbst gebaute Schaltungen. Ich bin mir immer unsicher wo ich meine Artikel einstellen soll. ZurZeit sind 1wire-Schaltungen bei 1wire. Aber für Panstamps und Arduino basierte Schaltungen habe ich nichts gefunden. Kannst du helfen?&lt;br /&gt;
:&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Es bei Hardware die Unterkategorie &amp;quot;Other Components&amp;quot;, da passt sowas derzeit immer rein. Sofern mal eine &amp;quot;kritische Masse&amp;quot; erreicht ist (also mehr als nur ein oder zwei Artikel), kann man ja überlegen, mal eine Unterkategorie &amp;quot;Eigenentwicklungen&amp;quot; (oder ähnlich) bei Hardware einzufügen.&lt;br /&gt;
:Für Arduino gibt es schon eine Kategorie (Unterkategorie von Hardware), für Panstamp könnte man sowas auch einrichten - wenn es vom Konzept her passt (dazu verstehe ich von der Arduino/Panstamp...-Welt zu wenig). Es sollten halt immer ähnliche Dinge in einer Kategorie/Unterkategorie... zusammengefasst sein.&lt;br /&gt;
:-- [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:45, 29. Aug. 2014 (UTC) &amp;lt;hr /&amp;gt;&lt;br /&gt;
::Misch mich mal ein: Fände Kategorie Eigenentwicklungen o.ä. nicht schlecht, da bestimmte Zielgruppe angesprochen wird. Ich lasse bspw. meine Finger davon. Würde den Artikel trotzdem zusätzlich noch in Other Components aufnehmen oder wenn es 1-wire ist auf jeden Fall in 1-Wire. Bei Homematic haben wir doch Unterkategorie HomeBrew, analog auch bei anderen anlegen!? Wir sollten etwas angehen....--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:18, 29. Aug. 2014 (UTC) &amp;lt;hr /&amp;gt;&lt;br /&gt;
:::Ok, dann machen wir doch einfach einen Auftrag an Tobias daraus: mal sammeln, welche Artikel schon vorliegen (oder er in Planung hat) für eine solche Kategorie, dann schauen wir kurz drüber und beschließen, welche neuen Unterkategorien und wie einsortiert...&lt;br /&gt;
:::@Tobias: ich stell das mal so auf Deine Diskussionsseite --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:48, 29. Aug. 2014 (UTC) &amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GRuss&lt;br /&gt;
Tobias&lt;br /&gt;
&lt;br /&gt;
== Verschieben von Wiki-Seiten ohne Weiterleitung ==&lt;br /&gt;
&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
könntest Du bitte &lt;br /&gt;
* [[Z-Wave-EVR_ST814-Temperatur-_und_Feuchtesensor]] auf Z-Wave-EVR_ST81&#039;&#039;&#039;4&#039;&#039;&#039;-Temperatur-_und_Feuchtesensor ohne Weiterleitung verschieben. Der Ersteller [[Benutzer_Diskussion:Morgennebel]] ist anscheinend nicht mehr aktiv; reagiert auch nicht auf PM.&lt;br /&gt;
: -&amp;gt; Erledigt --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:31, 27. Dez. 2014 (UTC)&lt;br /&gt;
* hier [[Diskussion:WS3600]] mal reinschauen. Dort hätte ich auch gerne eine Wiki Seite verschoben. Keine Ahnung, ob Dir das aufgefallen ist.&lt;br /&gt;
: -&amp;gt; Ja, hatte ich gesehen ... und jetzt auch erledigt --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:31, 27. Dez. 2014 (UTC)&lt;br /&gt;
* WebIO_Digital auf WEBIO_12DIGITAL verschieben --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 17:36, 7. Dez. 2015 (CET)&lt;br /&gt;
: -&amp;gt; Erledigt --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 17:52, 7. Dez. 2015 (CET)&lt;br /&gt;
&lt;br /&gt;
== Nutzung von &amp;lt;nowiki&amp;gt;&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt; statt  &amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/nowiki&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Hallo Peter,&amp;lt;BR&amp;gt;&lt;br /&gt;
Du ersetzt teilweise in den Wikiseiten die Formatierung &amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/nowiki&amp;gt; durch &amp;lt;nowiki&amp;gt;&amp;lt;pre style=&amp;quot;width:500px;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;. Hat das einen bestimmten Grund? Das führt nämlich dazu, dass der Text in einigen Fällen über den Boxrand geht. Mir ist nicht klar, wie ich das umsetzen/anwenden soll. Danke. --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 07:28, 5. Feb. 2015 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Hallo Christian, das mache ich (dachte ich) eigentlich nur, wenn die Zeilen in dem pre-Bereich durchweg relativ kurz sind. Was ich eigentlich häufiger mache, ist, pre durch code Tags zu ersetzen, gerade weil bei code ein automatischer Zeilenumbruch stattfindet. Insbesondere Einzeiler, die per nowiki, pre oder Leerzeichen in Spalte1 dann als Box formatiert werden ersetze ich gern duch &amp;lt;nowiki&amp;gt;:&amp;lt;code&amp;gt;define, attr, ...&amp;lt;/code&amp;gt;&amp;lt;/nowiki&amp;gt;, weil&#039;s meiner Ansicht nach einfach flüssiger lesbar ist Gesamtkontext.&lt;br /&gt;
:Verhalte ich mich am Ende anders, als ich es in [[FHEMWiki:Über_FHEMWiki#Gewünschtes Verhalten / &amp;quot;Do and Don&#039;t&amp;quot;|diesem Abschnitt]] beschrieben habe? --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 07:45, 5. Feb. 2015 (UTC)&lt;br /&gt;
::Werde es beobachten. Vielleicht bin ich auch nur übermüdet/unkonzentriert: Habe nämlich gerade gesehen, dass ich [[HM-OU-CFM-Pl_MP3_Funk-Gong_mit_Signalleuchte|hier]] -was letztliche Anstoß zum Schreiben war- falsch geschaut habe. Die anderen Beispiele, die ich in Erinnerung habe, müsste ich mir noch einmal raussuchen. Vielleicht habe ich da auch schief geschaut. Also bitte erst einmal vergessen. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:18, 5. Feb. 2015 (UTC) PS: Schaust Du bitte mit auf die diversen Unterkategorien zu &amp;quot;Hardware Typen&amp;quot; die ich angelegt habe und greifst bitte ggfs. korrigiernd ein.&lt;br /&gt;
:::Die neuen Unterkategorien habe ich schon zur Kenntnis genommen. Nachdem Du die letzten Änderungen an der Kategoriestruktur gemacht hast, kennst Du Dich da mittlerweile ja mindestens so gut aus wie ich. Das Einzige, was mir aufgefallen ist: auf den Kategorieseiten könnten noch ein paar kurze Worte zur Beschreibung der Kategorie eingefügt werden... aber das eilt nicht. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:26, 5. Feb. 2015 (UTC)&lt;br /&gt;
&lt;br /&gt;
== PGM3 - Entwicklungsstand ==&lt;br /&gt;
Hallo Peter!&lt;br /&gt;
Habe heute bei PGM3 und PGM5 recht selbstsicher einen Hinweis &amp;quot;seit längerem nicht aktiv weiterentwickelt&amp;quot; hinzugefügt. Im Forum habe ich nichts gefunden und auch zu Google-Groups-Zeiten kann ich mich nicht wirklich erinnern. Bei der Nachkontrolle habe ich dann mit Erschrecken festgestellt, dass Du PGM3 auf der ToDo-Liste stehen hast und das plötzlich Martin Hass&#039; PGM3 Screenshot-Seiten nach einer gefühlten Ewigkeit wieder erreichbar sind. Irre ich mich und PGM3 ist doch noch ein (aktuelles) Thema? Gruß, [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 21:09, 18. Feb. 2015 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Christian, PGM3 auf meiner Todo-Liste ... eine Jugendsünde :-) ... fliegt gleich runter, weil bestimmt zwei Jahre alt und nie was gemacht. Die Updates auf Martin&#039;s Seiten solltest Du natürlich beobachten, aber auf mich musst Du keine Rücksicht nehmen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:55, 19. Feb. 2015 (CET)&lt;br /&gt;
&lt;br /&gt;
== Begrüßungsseite Link: Was Wikipedia nicht ist ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
ich hoffe, dass ich das hier jetzt richtig mache :-). Beim aufmerksamen Lesen der Begrüßungseite bin ich gleich auf einen Link: Was_Wikipedia_nicht_ist getappst. &lt;br /&gt;
&lt;br /&gt;
Den kennt Wikipedia nicht...&lt;br /&gt;
Gruß Otto&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Otto, danke für&#039;s aufmerksame Lesen :-)&lt;br /&gt;
:habe den (und einen weiteren) fehlerhaften Link korrigiert. Da die Vorlage mit &amp;quot;subst:&amp;quot; eingebunden wird, profitieren leider nur die Neuankömmlinge ab jetzt davon.&lt;br /&gt;
:Grund für das Problem ist wohl die Art, wie das Fhem-Wiki aufgesetzt wurde (bin mir aber jetzt nicht sicher, ob sich da in dieser Hinsicht nochmal was geändert hat, oder ob ich die beiden Links schlicht vergessen habe ... andere Links, wie z.B. den auf das Tutorial, habe ich vor längerer Zeit schon mal umgestellt). --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:57, 2. Apr. 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Pflege von [[Spezial:Gewünschte_Seiten]] ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
bin gerade im Aufräumfieber und über die gewünschten Seiten gestolpert. Einige Dinge habe ich eigenständig geklärt, aber nun benötige ich Deine Hilfe. Insbesondere das zum Aussterben verurteilte FS20 taucht dort sehr umfangreich auf. Die abnehmende Bedeutung spricht aus meiner Sicht dafür, diese &amp;quot;gewünschten Seiten&amp;quot; dort herauszunehmen. Denke es gibt wichtigere Baustellen und dringendere notwendige Seiten. Zudem sind das teilweise Karteileichen, die seit Urzeiten dort geführt werden. Aus meiner Sicht schreckt das, neben den Wiki-Softwareproblemen, Interessenten von der Mitarbeit ab. Darum bitte ich Dich um Deine Meinung als FS20-User, bevor ich das weiter anleiere. Andere Punkte, die ich nicht &#039;&#039;&#039;&#039;&#039;&amp;lt;- meinst Du wirklich *nicht*?&#039;&#039;&#039;&#039;&#039; &#039;&#039;&amp;lt;-ergänze: allein/eigenständig!&#039;&#039; klären wollte, betreffen bspw. die gewünschte Seite &amp;quot;Hilfe:Seite bearbeiten&amp;quot;, &amp;quot;FHEMWiki:Stubs entfernen&amp;quot;. Schöne Feiertage, [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]])&lt;br /&gt;
:Hallo Christian, nur als schnelle Antwort (zu viele Baustellen gerade):&lt;br /&gt;
:* Gewünschte Seiten, speziell FS20: das was Mediawiki in die &amp;quot;gewünschten Seiten&amp;quot; einsortiert, sind die intra-Wiki Links, die nicht existieren also &amp;lt;nowiki&amp;gt;[[Existiert nicht]]&amp;lt;/nowiki&amp;gt; würde da z.B. auftauchen - gewünschte Seiten im eigentlichen Sinn sind das nur dann, wenn der Verlinkung absichtlich gemacht wurde ... wie z.B. bei den vielen FS20 Seiten. Die sind nämlich häufig bei mir (hast Du doch bestimmt gesehen ;-) ), weil ich noch zu diversen FS20 Geräten was schreiben möchte und sollte. Leider (die vielen Baustellen, siehe oben) komme ich derzeit und schon lange nicht dazu. Ansonsten habe ich da immer mal wieder reingeschaut, um falsch geschriebene Links aufzuspüren und zu bereinigen. Aber vielleicht sollten wir den Link darauf einfach von der Hauptseite entfernen und z.B. auf die/eine Interna Seite holen. Vielleicht als Ersatz / Nachfolger der Randnotiz von der Über FHEMWiki Seite, auf der ich die offenen Baustellen mal aufgelistet hatte (und schon länger nicht mehr gepflegt).&lt;br /&gt;
::* Natürlich habe ich gesehen, dass FS20 (auch) von Dir kommt; darum habe ich mich auch mit Wiki-Eingriffen zurückgehalten, sonst.. ;-). Dein Alternativvorschlag ist gut. Die offenen Baustellen auf der Über FHEMWiki Seite: Zu den Kategorien wollte ich -auch seit langem- eine bessere &amp;quot;Anweisung&amp;quot; an die anderen  Wikibearbeiter schreiben und dann abschließen. Und mich dann wieder verstärkt &amp;quot;meinen&amp;quot; eigentlichen Themen ZWave/EnO widmen.&lt;br /&gt;
:* Die Stubs-Seite / Kategorie / Vorlage kommt von Arno (akw), ist aber schon lange nicht mehr gepflegt worden und wird wohl auch nicht mehr aktiv genutzt&lt;br /&gt;
:* &#039;&#039;&#039;Hilfe:Seite bearbeiten&#039;&#039;&#039; fällt wohl in die Kategorie &amp;quot;Wiki-Softwareprobleme&amp;quot; (Du meinst den Link &amp;quot;Bearbeitungshilfe&amp;quot; neben den {{Taste|Speichern}} {{Taste|Vorschau zeigen}} Buttons?) und würde ich erst wieder aktiv in Angriff nehmen, wenn Arno die offenen Probleme komplett abgearbeitet hat :-(&lt;br /&gt;
::* Ja, werde mal Arno bitten.... [[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]])&lt;br /&gt;
:Ebenfalls schöne Feiertage, --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 15:21, 3. Apr. 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Vorlagen: Link2Forum,.. ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
ist die Notwendigkeit der Vorlagen &amp;quot;Link2Forum&amp;quot;,.. nur darin begründet, dass man dann einfacher Anpassungen bei Änderungen der zugrundeliegenden Links vornehmen kann? Ich stelle nämlich immer wieder fest, dass außer uns beiden, die sowieso von (fast) keinem Wiki-Bearbeiter genutzt werden. Der Umstellungsaufwand im Änderungsfalle wird so vermutlich nicht sehr reduziert. Kann man dieses Problem der Linkänderungen nicht einfacher mit einem Bot lösen, der das Wiki mit Suchen/Ersetzen durchgeht? Dann hättest Du auch nicht den Pflegeaufwand für die Vorlagen. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 11:16, 13. Aug. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Hallo Christian, leider habe ich keine große Hoffnung, dass wir hier einmal die Chance haben werden, &#039;&#039;&#039;bot&#039;&#039;&#039;s einzusetzen und kenne mich damit auch (zumindest noch) nicht aus (Ausreden? Vielleicht). &lt;br /&gt;
:Interessant: ich habe gerade die DocLink Vorlage mal soweit fertig, dass man zumindest die ELV Links überarbeiten / generalisieren kann. &lt;br /&gt;
:Unterm Strich: ich werde die Vorlagen weiter pflegen und benutzen, wer sie benutzen mag soll&#039;s tun, zwingen werd ich niemanden. Wir haben halt immer noch sehr wenige Wiki-erfahrene Benutzer hier, was man auch an anderen Stellen merkt. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:50, 13. Aug. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:: Hallo Peter, will Dich auch nicht abhalten ;-) , sondern entlasten. Weil ich die DocLink-Vorlage gesehen habe, kam ich auf das Thema. Ich werde das bot-Thema mal auf meinen &amp;quot;Wunschzettel&amp;quot; aufnehmen und aktiv verfolgen. Schauen wir einmal, was sich ergibt. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 12:04, 13. Aug. 2015 (CEST)&lt;br /&gt;
::&amp;lt;hr&amp;gt;&lt;br /&gt;
:::Kein Problem - ich denke es gibt bei beiden Vorgehensweisen Vor- und Nachteile. Meine Skepsis beruht darauf, dass die Bots ja wohl auf dem Wiki-Server laufen und ich kaum Hoffnung habe, da mehr Zugriff zu bekommen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:16, 13. Aug. 2015 (CEST)&lt;br /&gt;
== Codierung  ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
&lt;br /&gt;
Du schreibst auf meiner Benutzerseite&lt;br /&gt;
 HTML-Tags bitte nur verwenden, wenn es nicht anders geht&lt;br /&gt;
im Artikel &lt;br /&gt;
[[EnOcean-D-452-FU-EP-JR-Aktor-Beschattungselemente-Rollladen]]&lt;br /&gt;
hast Du die Codierung mittels Leerzeichen durch &amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/Code&amp;gt;&amp;lt;/nowiki&amp;gt; ersetzt. Die Leerzeichen waren aber in [[http://www.fhemwiki.de/wiki/FHEMWiki:%C3%9Cber_FHEMWiki#Gewünschtes Verhalten / &amp;quot;Do and Don&#039;t&amp;quot;]] explizit erlaubt.&lt;br /&gt;
Einen anderen Artikel von mir hast Du nicht korrigert.&lt;br /&gt;
Wo liegt mein Fehler? Ich wollte der Gemeinschaft gerne etwas zurück geben - vor allem für die Arbeit die Christian mit mir gehabt hat.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:BenMarloe|BenMarloe]] ([[Benutzer Diskussion:BenMarloe|Diskussion]]) 00:25, 21. Aug. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Ben(Marloe), das ist schnell erklärt:&lt;br /&gt;
:HTML-Tags nur verwenden - bezieht sich, wenn ich das jemandem schreibe, meist auf exzessive &amp;lt;nowiki&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/nowiki&amp;gt;-Tags. Da kann (sollte) im Wiki meistens einfach eine Leerzeile oder ein Zeilenumbruch verwendet werden (einfach die &amp;quot;Vorschau-funktion&amp;quot; verwenden, um zu kontrollieren, ob&#039;s &amp;quot;richtig&amp;quot; aussieht). Außerdem sieht der Wiki-Quelltext damit schon dem formatierten Ergebnis ähnlicher und ist einfacher lesbar. Nur bei manchen Vorlagen oder z.B. in Aufzählungen ist ein Zeilenumbruch &amp;quot;kontraproduktiv&amp;quot; und dann ist ein br nötig.&lt;br /&gt;
:Leerzeichen vs. code ... am besten veranschaulicht:&lt;br /&gt;
 Leerzeichen in Position 1&lt;br /&gt;
:... und der weitere Text. Im Vergleich dazu:&lt;br /&gt;
::&amp;lt;code&amp;gt;ein (eingerückter) Einzeiler, der als Code formatiert werden soll&amp;lt;/code&amp;gt;&lt;br /&gt;
:oder noch mal anders:&lt;br /&gt;
 Leerzeichen und ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel Text&lt;br /&gt;
::&amp;lt;code&amp;gt;ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel, ganz viel Text, der als Code formatiert werden soll&amp;lt;/code&amp;gt;&lt;br /&gt;
:Ich hoffe, der Unterschied wird damit klar: der Text wird meiner Ansicht nach kompakter, die Hervorhebung ist aber trotzdem da. Und: bei Mehrzeilern sieht das schon wieder ganz anders aus. Da ist aber meistens dann die Verwendung von &amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/nowiki&amp;gt; die bessere Wahl, weil damit (im Wiki Source Text) besser verdeutlicht wird, dass die Formatierung absichtlich so gewählt ist.&lt;br /&gt;
:Zum Thema &#039;&#039;Einen anderen Artikel von mir hast Du nicht korrigert&#039;&#039; ... ich kann nicht überall sein :-) ... nein, ohne Scherz, ich mache das hier auch &amp;quot;nur nebenbei&amp;quot;, manches ist Geschmackssache, manches übersehe ich, manches ist &amp;quot;zu unwichtig&amp;quot;, etc.&lt;br /&gt;
:Und &#039;&#039;Wo liegt mein Fehler?&#039;&#039; - nirgends; einfach fleissig weiter mitmachen.&lt;br /&gt;
:--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 07:14, 21. Aug. 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Neue Seite oder Ergänzung [erledigt]==&lt;br /&gt;
Mit Eurer Hilfe geht jetzt der EnOcean-FUD61NPN-Funk-Universal-Dimmaktor unidirektional bei mir.&lt;br /&gt;
Ich würde eine Anleitung erstellen, bin mir aber nicht sicher, ob ich das lieber als &lt;br /&gt;
# Ergänzung auf die existente Seite oder &lt;br /&gt;
# Kommentare auf die existente Seite mache oder&lt;br /&gt;
# eine neue Seite aufmache und wie die dann heißen soll.&lt;br /&gt;
Ich bitte um Vorschläge/Richtlinien&amp;lt;br&amp;gt;&lt;br /&gt;
--[[Benutzer:BenMarloe|BenMarloe]] ([[Benutzer Diskussion:BenMarloe|Diskussion]]) 16:48, 11. Sep. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Ich denke, das kommt auf Art und Umfang der Änderungen/Ergänzungen an. Wenn das ein einzelner Abschnitt mit den Unterschieden ist, passt das sicherlich gut in [[EnOcean-FUD61NPN-Funk-Universal-Dimmaktor]], wären es Kommentare, überall auf der Seite verstreut, würde ich eine eigene Seite bevorzugen (dann bitte an den Seitennamen &amp;quot; (unidirektional)&amp;quot; anhängen). Die Kommentarseite ist für sowas eher nicht geeignet. &lt;br /&gt;
:Wenn&#039;s eine neue Seite wird, dann bitte auf der Seite des bidirektionalen Aktors verlinken. In jedem Fall die Bemerkung über *direktional... anpassen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 16:10, 12. Sep. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::so wird&#039;s gemacht. --[[Benutzer:BenMarloe|BenMarloe]] ([[Benutzer Diskussion:BenMarloe|Diskussion]]) 22:02, 18. Sep. 2015 (CEST)&lt;br /&gt;
==Extension SyntaxHighlight_GeSHi==&lt;br /&gt;
Ich hätte die [https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi Extension] gerne, um Code besser lesbar darzustellen. Sollte eigentlich ab MediaWiki Version 1.21 dabei sein, aber eventuell ist sie nicht aktiviert? Wen muss ich dazu anbetteln? ;)&lt;br /&gt;
--[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 15:58, 1. Okt. 2015 (CEST)&lt;br /&gt;
:[[Benutzer Diskussion:Akw#Wiki-Erweiterung Syntaxhighlight|Hier]] mal nachhaken? --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:57, 1. Okt. 2015 (CEST)&lt;br /&gt;
::Hat, wie ich gerade sehe, schon jemand anderer übernommen :) --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 10:26, 5. Okt. 2015 (CEST)&lt;br /&gt;
::&amp;lt;hr /&amp;gt;&lt;br /&gt;
:::Nicht verzagen ... jede Stimme zählt :-) --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 16:36, 5. Okt. 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Vorlage &amp;quot;Hinweis&amp;quot; ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
hast Du Dir die neue Vorlage &amp;quot;Hinweis&amp;quot; einmal angeschaut? Gibt es Vorbehalte von Deiner Seite oder kann ich die problemlos nutzen. Habe die Vorlage testweise mal in 2 Seiten eingebaut und finde sie in gewissen Situationen grds. nicht schlecht.&lt;br /&gt;
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 22:45, 6. Okt. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Christian, ja, die Vorlage habe ich gesehen und mal kurz reingeschaut. Gibts von meiner Seite keine Einwände (den Kommentar &amp;quot;Randnotiz ... leider nur Teil der Bildschirmbreite...&amp;quot; finde ich etwas befremdlich, da der Name der Vorlage ja genau das verspricht, aber das tut ja der eigentlichen Sache keinen Abbruch) - ich denke, es gibt für die Vorlage sinnvolle Einsatzgebiete, ganz nach gewünschtem Effekt / Erscheinungsbild. Es unterbricht halt den Lesefluss deutlich stärker als die Randnotiz, aber wenn das gewünscht ist, dann passts ja. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 10:14, 7. Okt. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
::Sollten wir die Vorlage dann nicht auch [[FHEMWiki:%C3%9Cber_FHEMWiki#Vorlagen|hier]] aufnehmen? Falls ja, Du oder ich? Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:30, 7. Okt. 2015 (CEST)&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
::Naja, &amp;quot;befremdlich&amp;quot; ;). Ich wollte nur erklären, warum ich extra eine neue Vorlage gemacht habe. Ich hätte natürlich auch die Vorlage &amp;quot;Randnotiz&amp;quot; um eine Option für die Breitenauswahl erweitern können. Grundsätzlich hätte die Randnotiz nämlich eh getan, was ich wollte. Aber das wäre etwas viel Arbeit geworden. --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 11:25, 23. Okt. 2015 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Änderung von Gliederungspunkten in Artikeln und wiki-interne Links ==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
hier [[Konfiguration]] wurde gestern ein Gliederungspunkt umbenannt. Gibt es/ Kennst Du eine einfache Möglichkeit herauszufinden, welche wiki-internen Link jetzt nicht mehr funktionieren? Bei den Spezial-Seiten finde ich dazu nichts und Google hilft mir auch nicht. Die Wiki-interne Suche ist dabei auch nicht optimal. Bisher vermeide ich aus diesem Grund auch eine Umbenennung von Gliederungspunkt. Danke und Gruß --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 09:48, 26. Okt. 2015 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Christian,&lt;br /&gt;
:ich hatte die Änderung zwar kurz angeschaut, aber gar nicht an diese (möglichen) Auswirkungen gedacht. Habe (auf die Schnelle) auch nur wenig zu diesem Thema gefunden (ausser vielleicht diese Seite in [https://en.wikipedia.org/wiki/Wikipedia:Database_reports/Broken_section_anchors/Configuration Wikipedia]).&lt;br /&gt;
:Vermutlich (hoffentlich?) werden wir aber nicht allzu häufig von dieser Problematik betroffen sein, für diesen aktuellen Fall sehe ich folgende mögliche Vorgehensweisen:&lt;br /&gt;
:* Änderung der Überschrift zurücknehmen, dafür diesen Abschnitt eine Gliederungsebene tiefer (passt dann ohnehin besser in die Seitenstruktur)&lt;br /&gt;
:* Verwendung von &amp;lt;nowiki&amp;gt;{{Anker|Ankertext}}&amp;lt;/nowiki&amp;gt; mit der alten Überschrift, um das als zusätzlichen Anker einzufügen&lt;br /&gt;
:--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:25, 26. Okt. 2015 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
::Hallo Peter, &lt;br /&gt;
::habe es mit 1. Ansatz umgesetzt, da mir der 2. Weg zu umständlich und (später) fehleranfällig erscheint. Obwohl ich irgendwann mal gelernt habe, dass es niemals nur einen Gliederungs-Unterpunkt gibt (halte ich hier aber auch nicht immer ein ;-) )&lt;br /&gt;
::Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 13:33, 26. Okt. 2015 (CET)&lt;br /&gt;
&lt;br /&gt;
== Neuen Artikel verschieben/umbenenen ==&lt;br /&gt;
Hallo Peter, &lt;br /&gt;
&lt;br /&gt;
ich habe meinen ersten Artikel erstellt und würde gerne den nächsten Schritt machen. Wohin muß ich verschieben und wie gehts dann weiter. (Wiki Anfänger)&lt;br /&gt;
&lt;br /&gt;
Gruß [[Benutzer:Eisix|Eisix]] ([[Benutzer Diskussion:Eisix|Diskussion]]) 16:14, 25. Jan. 2016 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Eisix,&lt;br /&gt;
:# es wäre nicht nötig gewesen, den Artikel erst auf Deiner Benutzerseite zu erstellen; so viel ist hier nicht los, dass bei einem neuen Artikel gleich Konflikte entstehen; ich glaube, nur &amp;quot;verschieben&amp;quot; geht in diesem Fall nicht so gut, daher würde ich vorschlagen:&lt;br /&gt;
:# Du gehst auf deiner Benutzerseite auf &amp;quot;Bearbeiten&amp;quot; und&lt;br /&gt;
:# fügst &amp;lt;nowiki&amp;gt;[[EnOcean MwC-32...]]&amp;lt;/nowiki&amp;gt; (die Details für die Namensfindung stehen auf der Kategorieseite [[:Kategorie:EnOcean Components]] oben rechts (ich glaube, &amp;quot;Deinen&amp;quot; Namen musst Du da noch etwas nachbearbeiten; im Zweifel [[Benutzer Diskussion:Krikan|Krikan]] fragen)) ein&lt;br /&gt;
:# Klickst auf {{Taste|Vorschau zeigen}}; daraufhin bekommst Du Deinen gewählten Seitentitel in rot in der Vorschau angezeigt; jetzt&lt;br /&gt;
:# öffnest Du diese &amp;quot;rote Seite&amp;quot; in einem neuen Browser-Tab&lt;br /&gt;
:# kopierst bzw. verschiebst den Quelltext Deiner Seite (ohne die gerade eingefügte Zeile) in das leere Editierfenster des zweiten Browser-Tabs&lt;br /&gt;
:# Dann noch ein paar Korrekturen (z.B. die korrekte Kategorie &amp;quot;EnOcean Components&amp;quot; verwenden); und schau Dir existierende (EnOcean-)Seiten (Gliederung!) an und übernimm das bitte entsprechend &lt;br /&gt;
:# Vorschau der neuen Seite anzeigen und überprüfen&lt;br /&gt;
:# wenn alles soweit stimmt, &amp;quot;Seite speichern&amp;quot;&lt;br /&gt;
:# Auf Deiner Benutzerseite kannst Du jetzt (z.B.) die Seite in (D)eine Liste der von Dir erstellten Seiten aufnehmen ... und evtl. noch ein paar Worte über Dich schreiben&lt;br /&gt;
:--[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 18:18, 25. Jan. 2016 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
: Hallo Eisix, Hallo Peter!&lt;br /&gt;
: Mische mich hier mal ein: Sind die Bildrechte für BSC-MwC-32.jpeg geklärt? Falls nein, bitte Bild nicht einbinden/löschen und gegebenenfalls eigenes Foto hochladen.&lt;br /&gt;
: Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 19:06, 25. Jan. 2016 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
: Hallo,&lt;br /&gt;
: @Peter ich wollte nicht wie ein Elefant im Porzellanladen durch die Wiki stapfen, dafür kenne ich mich damit zu wenig aus ;-)&lt;br /&gt;
: @Krikan guter Einwand das Bild ist von www.enocean-alliance.org wo auch die verlinkte Anleitung her ist. Eigenes Bild ist leider nicht mehr möglich da das ganze hinter einem Aquarium verbaut ist und nur mit größerem Aufwand wieder rauszuholen ist. Also nehme ich das Bild am besten wieder raus !?&lt;br /&gt;
:Gruß  --[[Benutzer:Eisix|Eisix]] ([[Benutzer Diskussion:Eisix|Diskussion]]) 10:19, 26. Jan. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Unterscheidung Code für DEF und .cfg ==&lt;br /&gt;
&lt;br /&gt;
Hallo Peter!&amp;lt;BR&amp;gt;&lt;br /&gt;
habe gelesen, dass Du auf [[Ölverbrauchsanzeige_/_Betriebsstundenzähler]] den Code als .cfg-Code per Hinweis markiert hast. Bisher haben wir bei der Unterscheidung DEF,Einzeiler, aus optischen Gründen umgebrochenen Einzeiler  und .cfg Code im Wiki kein wirkliches System. Es bedarf jeweils der Interpretation. Vieles ist derzeit cfg.-Code. Eigentlich wünsche ich mir, dass wir überall einen Hinweis in den Codeboxen DEF bzw. cfg einpflegen. Das dürfte aber praktisch nicht umsetzbar sein und auch hohes Fehlerpotenzial haben. Hatte auch schon einmal einen Versuch in die Richtung unternommen, aber aufgegeben.&amp;lt;BR&amp;gt;&lt;br /&gt;
Momentan tendiere ich dazu, auf  [[Konfiguration]] einen Erläuterung einzufügen, woran man die verschiedenen Code-Varianten erkennt und die Seite -wie Du es mal geplant hattest, von allen anderen Seiten zu verlinken. Das ist mMn einfacher. Hast Du dazu eine Meinung/Idee?&amp;lt;BR&amp;gt;&lt;br /&gt;
Würde das auf ggfs. auf meine Todo-Liste setzen.&amp;lt;BR&amp;gt;&lt;br /&gt;
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:10, 16. Feb. 2016 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Christian, ja, so eine grundlegende Vorgehensweise fehlt uns da noch. War mir auch bewusst, ich wollte aber in diesem konkreten Fall gleich was eintragen, weil das fehlende Wissen zu diesem Thema der Auslöser für den Forenthread war. Ich behalte das Thema auch im Hinterkopf - die zündende Idee, wie man das am besten umsetzen kann fehlt mir aber leider noch. Wer immer von uns früher dazu kommt, hat gewonnen :-) --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:28, 16. Feb. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
==Nochmal Begrüßungsseite==&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
&lt;br /&gt;
Mein Benutzerkonto wurde gerade freigeschaltet und ich habe mich gewundert, warum die Begrüßungsseite so &amp;quot;wikipedistisch&amp;quot; ist. Sollten wir da nicht mal rangehen und eine Benutzerbegrüßung schreiben, die an das fhemwiki angepasst ist?&lt;br /&gt;
&lt;br /&gt;
Ein paar Grundlagen wie Bearbeitungshilfe würde ich auch aus Wikipedia einbinden, aber die Infoseite &amp;quot;was Wikipedia nicht ist&amp;quot; scheint mir irgendwie hier deplatziert...&lt;br /&gt;
&lt;br /&gt;
Ich würde mich dransetzen, aber brauche dann wahrscheinlich Hinweise, wo hier im fhemwiki die &amp;quot;Richtlinien&amp;quot; und andere Infos stecken, die man in der Willkommensnachricht verlinken könnte/sollte.&lt;br /&gt;
&lt;br /&gt;
Gruß, Markus --[[Benutzer:Krokofant|Krokofant]] ([[Benutzer Diskussion:Krokofant|Diskussion]]) 11:31, 5. Mär. 2016 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Markus, die Begrüßungs-Vorlage ist einfach aus der Situation heraus mal entstanden. Es gab viele Neuanmeldungen von Leuten, die noch keinerlei Berührung mit Wiki(media) hatten und entsprechend gedankenlos ans Werk gegangen sind. War dann nachher mehr Aufräumarbeit nötig als dass die Mitarbeit Hilfe gewesen wäre. Dazu sind ein paar Hinweise auf Fhem-Wiki-Spezifika eingeflossen ... aber &#039;&#039;gelesen&#039;&#039; wird das Ganze leider ohnehin höchst selten, wenn man manche Beiräge hier so sieht.&lt;br /&gt;
:Aber lass Dich nicht entmutigen, Vorschläge und aktive Mitarbeit sind natürlich herzlich willkommen. &lt;br /&gt;
:Fhem-spezifische Informationen sind eigentlich komplett in Über FHEMWiki gesammelt bzw. über diese Seite zu erreichen. Wenn Du Dir die Änderungshistorie der Seite anschaust, wirst Du auch feststellen, dass das eine One-(oder Two, Krikan hilft auch mit)-Man-Show ist - von einigen &amp;quot;kurzen Strohfeuern&amp;quot; mal abgesehen. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 12:02, 5. Mär. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Vorlage:News und Interwiki-Links ==&lt;br /&gt;
&lt;br /&gt;
Hallo Peter,&lt;br /&gt;
&lt;br /&gt;
danke für die Einrichtung meines Logons.&lt;br /&gt;
# ich habe mir mal erlaubt die [[Vorlage:News]] zu Dokumentieren und dabei die Orientierung der ersten Spalte zu ändern. Ich finde es etwas irritierend beim Lesen wenn das Datum nicht auf der ersten Zeile des folgenden Eintrags steht. Ich hoffe das ist so für euch in Ordnung, ansonsten lässt sich das jederzeit wieder ändern.&amp;lt;br /&amp;gt; &amp;gt;&amp;gt; &#039;&#039;Klar; sieht jetzt besser aus und Dokumentation ist immer gut; ich sehe auch sonst keine Nachteile&#039;&#039; --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:45, 21. Apr. 2016 (CEST)&lt;br /&gt;
# Die Seite [[Spezial:Meiste_Interwikilinks]] ist hier leer und die [https://www.mediawiki.org/wiki/Extension:Interwiki Extension:Interwiki] scheint auch nicht installiert bzw. aktiviert zu sein. Sie gehört seit V1.21 zum Installationsbündel und müsste bei der hiesigen V1.24 also schon dabei sein. Man bräuchte sie also nur in Betrieb nehmen. Links auf die Wikipedia werden im FHEMWiki offenbar explizit als ausgeschriebene URL ausgeführt. Das ist meiner Erfahrung nach ungünstig. Auch Beiträge aus dem FHEM-Forum könnte man mit Interwikilinks konsistenter handhaben. Auch die [[Vorlage:DocLink]] lässt sich vermutlich damit einfacher gestalten.&amp;lt;br /&amp;gt; &amp;gt;&amp;gt; &#039;&#039;Wiki-seitig dürften sich da in nächster Zeit einige Änderungen ergeben, die das mit adressieren lassen. Als ich begonnen habe, die derzeitigen Links zu setzten, ging es leider nicht anders (wurde Server-seitig nicht angeboten). Da würde ich Dich einfach noch um etwas Geduld bitten - und später gern bei Dir nachhaken, nachdem Du Dich allein mit der Frage schon als Experte geoutet/qualifiziert hast :-) &#039;&#039; --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 14:45, 21. Apr. 2016 (CEST)&lt;br /&gt;
&lt;br /&gt;
Viele Grüße --[[Benutzer:MGu|MGu]] ([[Benutzer Diskussion:MGu|Diskussion]]) 13:06, 16. Apr. 2016 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Infobox Modul: Neue untergeordnete Boards Wettermodule und Kalendermodule ==&lt;br /&gt;
Hallo Peter!&lt;br /&gt;
&lt;br /&gt;
Könntest Du bei Gelegenheit bitte die Verbindung für die Infobox zu den neuen Unterboards einpflegen. Das scheint derzeit noch nicht zu funktionieren bzw. ich habe keine Ahnung wie...&amp;lt;BR&amp;gt;&lt;br /&gt;
Danke und Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 21:56, 27. Mai 2016 (CEST)&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
:Hallo Christian...&lt;br /&gt;
:gut versteckt (hab selbst erst wieder &amp;quot;suchen&amp;quot; müssen) befindet sich die Liste der Forenboards in der Vorlage [[:Vorlage:Link2Forum|Link2Forum]]. Muss ich gelegentlich mal in der Doku zur Vorlage [[:Vorlage:Infobox Modul|Infobox Modul]] erwähnen. &lt;br /&gt;
:Habe gerade die neuen Unterboards eingefügt. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 09:38, 28. Mai 2016 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Bitte um Kontrolle/Meinung ==&lt;br /&gt;
&lt;br /&gt;
Hallo Peter!&amp;lt;BR&amp;gt;&lt;br /&gt;
Könntest Du bitte einmal hier [[Benutzer_Diskussion:Krueuw]] hineinschauen -falls noch nicht gesehen- und ggf. eingreifen, falls ich falsch liege und/oder etwas vergessen habe.&amp;lt;BR&amp;gt;&lt;br /&gt;
Danke und Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:24, 7. Aug. 2016 (CEST)&lt;br /&gt;
:Vermutlich ist unsere Diskussion dort überholt. [[Benutzer:ThomasRamm]] hat die Artikel eben verschoben/geaendert/zusammengefasst und mir fehlt momentan darüber der Überblick. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 16:50, 7. Aug. 2016 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Wiki Beitrag zu msg ==&lt;br /&gt;
&lt;br /&gt;
Darin werden direkte Fragen gestellt, soll man auf die antworten?!?&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Bisher keine über das in der Infobox verlinkte Forenthema hinausgehenden Informationen verfügbar, auch der commandref-Eintrag ist bisher (warum eigentlich?) leer.&amp;quot;&lt;br /&gt;
Ergibt sich aus dem verlinkten Forenbeitrag. Kurzfassung: https://forum.fhem.de/index.php/topic,39983.msg477338.html#msg477338&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Darüber hinaus ist die Schreibweise inkonsistent und/oder irreführend: der Befehl ist in Kleinbuchstaben einzugeben, obwohl der Modulname mit Großbuchstaben geschrieben wird.&amp;quot;&lt;br /&gt;
Ergibt sich aus der Historie &amp;quot;Der Befehl msg ersetzt ausserdem das vormals verfügbare Modul MSG&amp;quot; und der aktuellen Beschränkung in FHEM, dass die Umbenennung der Datei in Kleinbuchstaben bei Bestandsinstallationen dazu führt, dass es dann sowohl 75_MSG.pm und 75_msg.pm geben würde und diese Dateien sich dann gegenseitig stören würden. Auch kann man aktuell in FHEM einen Befehl nicht genauso nennen wie ein Modul und umgekehrt, weshalb das ohnehin vorher als deprecated geführte Modul 75_MSG.pm einfach durch die Datei für den msg-Befehl ersetzt wurde. Diskussionen dazu gab es, eine Lösung diesen Konflikt zu beseitigen wurde nicht angeboten:&lt;br /&gt;
https://forum.fhem.de/index.php/topic,47155.msg393903.html#msg393903&lt;br /&gt;
https://forum.fhem.de/index.php/topic,49079.msg410453.html#msg410453&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16468</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16468"/>
		<updated>2016-10-02T18:39:15Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Heizungssteuerung/Raumklima&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in drei Schritten:&lt;br /&gt;
=== Definition einer Webinstanz für die Wetterstation ===&lt;br /&gt;
Zunächst muss auf einem eigenen Port eine neue FHEMWEB-Instanz angelegt werden, z.B. mit dem Namen WEBweather. Dieser muss zwingend der Name weatherstation zugewiesen werden. Dieser ist in der Firmware der Stationen fest codiert.&lt;br /&gt;
  define WEBweather FHEMWEB 8089 global&lt;br /&gt;
  attr WEBweather webname weatherstation&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Dann wird das Modul noch in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
&lt;br /&gt;
=== Eingaben im Webinterface der Station ===&lt;br /&gt;
Dann muss der Station eingestellt werden, dass die Wetterinformationen an Fhem geschickt werden sollen. Bei einer WH2600 (Station ohne LCD Display) geschieht das im Webinterface, bei einer HP1000 direkt in den Einstellungen des LCD Displays.&lt;br /&gt;
Dazu unter &amp;quot;Weather Network&amp;quot; folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customized&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (siehe unten)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbst gewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbst gewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Auch hat die Firmware oft einen Bug der verhindert, dass IP Adressen direkt verwendet werden können. Hier muss dann zwingend auf einen Domainnamen zurückgegriffen werden!&lt;br /&gt;
Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_WeatherStation FileLog ./log/WeatherStation-%Y.log WeatherStation:T:.*&lt;br /&gt;
&lt;br /&gt;
Alternativ sei auch auf die Verwendung von DbLog verwiesen. Dort kann man mit Hilfe des DbLogInclude Attributs granularer einstellen wie oft ein Wert geloggt werden soll:&lt;br /&gt;
  attr WeatherStation DbLogInclude windSpeed:300 windGust:300 windChill:300 temperature.*:300 humidity.*:300 luminosity:300 uv:300&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass für das Logging die richtigen Events ausgelöst werden. Wer die event-on-* Attribute benutzt kann diese in Kombination mit DbLogInclude z.B. so setzen:&lt;br /&gt;
  attr event-on-update-reading temperature.*,humidity.*,windSpeed,windGust,windChill,luminosity,uv,dewpoint.*,rain.*&lt;br /&gt;
&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16464</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16464"/>
		<updated>2016-10-02T15:46:11Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Tipps, Tricks, Problemlösungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Heizungssteuerung/Raumklima&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in drei Schritten:&lt;br /&gt;
=== Definition einer Webinstanz für die Wetterstation ===&lt;br /&gt;
Zunächst muss auf einem eigenen Port eine neue FHEMWEB-Instanz angelegt werden, z.B. mit dem Namen WEBweather. Dieser muss zwingend der Name weatherstation zugewiesen werden. Dieser ist in der Firmware der Stationen fest codiert.&lt;br /&gt;
  define WEBweather FHEMWEB 8089 global&lt;br /&gt;
  attr WEBweather webname weatherstation&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Dann wird das Modul noch in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
&lt;br /&gt;
=== Eingaben im Webinterface der Station ===&lt;br /&gt;
Dann muss der Station eingestellt werden, dass die Wetterinformationen an Fhem geschickt werden sollen. Bei einer WH2600 (Station ohne LCD Display) geschieht das im Webinterface, bei einer HP1000 direkt in den Einstellungen des LCD Displays.&lt;br /&gt;
Dazu unter &amp;quot;Weather Network&amp;quot; folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customized&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (siehe unten)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbst gewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbst gewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Auch hat die Firmware oft einen Bug der verhindert, dass IP Adressen direkt verwendet werden können. Hier muss dann zwingend auf einen Domainnamen zurückgegriffen werden!&lt;br /&gt;
Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_WeatherStation FileLog ./log/WeatherStation-%Y.log WeatherStation:T:.*&lt;br /&gt;
&lt;br /&gt;
Alternativ sei auch auf die Verwendung von DbLog verwiesen. Dort kann man mit Hilfe des DbLogInclude Attributs granularer einstellen wie oft ein Wert geloggt werden soll:&lt;br /&gt;
  attr WeatherStation DbLogInclude windSpeed:300 windGust:300 windChill:300 temperature.*:300 humidity.*:300 luminosity:300 uv:300&lt;br /&gt;
&lt;br /&gt;
Wichtig ist auch, dass für das Logging die richtigen Events ausgelöst werden. Wer die event-on-* Attribute benutzt kann diese in Kombination mit DbLogInclude z.B. so setzen:&lt;br /&gt;
  attr event-on-update-reading temperature.*,humidity.*,windSpeed,windGust,windChill,luminosity,uv,dewpoint.*,rain.*&lt;br /&gt;
&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16463</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16463"/>
		<updated>2016-10-02T15:07:44Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Eingaben im Webinterface der Station */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Heizungssteuerung/Raumklima&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in drei Schritten:&lt;br /&gt;
=== Definition einer Webinstanz für die Wetterstation ===&lt;br /&gt;
Zunächst muss auf einem eigenen Port eine neue FHEMWEB-Instanz angelegt werden, z.B. mit dem Namen WEBweather. Dieser muss zwingend der Name weatherstation zugewiesen werden. Dieser ist in der Firmware der Stationen fest codiert.&lt;br /&gt;
  define WEBweather FHEMWEB 8089 global&lt;br /&gt;
  attr WEBweather webname weatherstation&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Dann wird das Modul noch in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
&lt;br /&gt;
=== Eingaben im Webinterface der Station ===&lt;br /&gt;
Dann muss der Station eingestellt werden, dass die Wetterinformationen an Fhem geschickt werden sollen. Bei einer WH2600 (Station ohne LCD Display) geschieht das im Webinterface, bei einer HP1000 direkt in den Einstellungen des LCD Displays.&lt;br /&gt;
Dazu unter &amp;quot;Weather Network&amp;quot; folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customized&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (siehe unten)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbst gewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbst gewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Auch hat die Firmware oft einen Bug der verhindert, dass IP Adressen direkt verwendet werden können. Hier muss dann zwingend auf einen Domainnamen zurückgegriffen werden!&lt;br /&gt;
Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_Wetterstation FileLog ./log/Wetterstation-%Y.log Wetterstation:T:.*&lt;br /&gt;
=== Mehr Einträge im T:-Reading ===&lt;br /&gt;
Das Modul liefert standardmäßig nicht alle vom Außensender verfügbaren Daten auch in der T:-Zeile. Wenn man dort - z. B. zum Loggen - alle Daten haben möchte, kann man die übrigen Daten ergänzen. Dafür editiert man die Datei 50_HP1000.pm und ergänzt Zeilen.&lt;br /&gt;
Im Bereich von Zeile 347 suchen:&lt;br /&gt;
&amp;lt;pre&amp;gt;    $result = &amp;quot;T: &amp;quot; . $webArgs-&amp;gt;{outtemp} if ( defined( $webArgs-&amp;gt;{outtemp} ) );&lt;br /&gt;
    $result .= &amp;quot; H: &amp;quot; . $webArgs-&amp;gt;{outhumi}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{outhumi} ) );&lt;br /&gt;
    $result .= &amp;quot; Ti: &amp;quot; . $webArgs-&amp;gt;{intemp}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{intemp} ) );&lt;br /&gt;
    $result .= &amp;quot; Hi: &amp;quot; . $webArgs-&amp;gt;{inhumi}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{inhumi} ) );&lt;br /&gt;
    $result .= &amp;quot; W: &amp;quot; . $webArgs-&amp;gt;{windspeed}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{windspeed} ) );&lt;br /&gt;
    $result .= &amp;quot; R: &amp;quot; . $webArgs-&amp;gt;{rainrate}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{rainrate} ) );&lt;br /&gt;
    $result .= &amp;quot; WD: &amp;quot; . $webArgs-&amp;gt;{winddir}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{winddir} ) );&lt;br /&gt;
    $result .= &amp;quot; D: &amp;quot; . $webArgs-&amp;gt;{dewpoint}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{dewpoint} ) );&lt;br /&gt;
    $result .= &amp;quot; P: &amp;quot; . $webArgs-&amp;gt;{relbaro}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{relbaro} ) );&amp;lt;/pre&amp;gt;&lt;br /&gt;
und dahinter folgende neue Zeilen einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;    $result .= &amp;quot; U: &amp;quot; . $webArgs-&amp;gt;{UV}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{UV} ) );&lt;br /&gt;
    $result .= &amp;quot; L: &amp;quot; . $webArgs-&amp;gt;{light}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{light} ) );&lt;br /&gt;
    $result .= &amp;quot; WC: &amp;quot; . $webArgs-&amp;gt;{windchill}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{windchill}));&lt;br /&gt;
    $result .= &amp;quot; RD: &amp;quot; . $webArgs-&amp;gt;{dailyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{dailyrain}));&lt;br /&gt;
    $result .= &amp;quot; RW: &amp;quot; . $webArgs-&amp;gt;{weeklyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{weeklyrain}));&lt;br /&gt;
    $result .= &amp;quot; RM: &amp;quot;.$webArgs-&amp;gt;{monthlyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{monthlyrain}));&lt;br /&gt;
    $result .= &amp;quot; RY: &amp;quot;.$webArgs-&amp;gt;{yearlyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{yearlyrain}));&lt;br /&gt;
    $result .= &amp;quot; WG: &amp;quot;.$webArgs-&amp;gt;{windgust}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{windgust}));&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um zu verhindern, dass die eigenen Ergänzungen bei einem Update des Moduls überschrieben werden, dann noch 50_HP1000.pm vom automatischen Update ausnehmen:&lt;br /&gt;
  attr global exclude_from_update 50_HP1000.pm&lt;br /&gt;
=== Absturz von Fhem wegen Illegal division by zero ===&lt;br /&gt;
Wenn HP1000 Fhem abstürzen lässt mit der Fehlermeldung &lt;br /&gt;
&amp;lt;pre&amp;gt;2016.10.01 08:51:00 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/50_HP1000.pm line 383.&lt;br /&gt;
Illegal division by zero at ./FHEM/50_HP1000.pm line 383.&amp;lt;/pre&amp;gt;&lt;br /&gt;
dann hilft es, die mit + markierten Zeilen (natürlich ohne die +-Zeichen selbst!) in 50_HP1000.pm im sub HP1000_GetSum (um Zeile 400) einzufügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;    if ($avg) {&lt;br /&gt;
+     if (@{ $hash-&amp;gt;{helper}{history}{$t} } &amp;gt; 0) {&lt;br /&gt;
        $return = sprintf( &amp;quot;%.1f&amp;quot;,&lt;br /&gt;
            sum( @{ $hash-&amp;gt;{helper}{history}{$t} } ) /&lt;br /&gt;
              @{ $hash-&amp;gt;{helper}{history}{$t} } );&lt;br /&gt;
&lt;br /&gt;
        Log3 $name, 5, &amp;quot;HP1000 $name: Average for $t: $return&amp;quot;;&lt;br /&gt;
+     }&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16462</id>
		<title>HP1000</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HP1000&amp;diff=16462"/>
		<updated>2016-10-02T15:03:12Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* Definition der Wetterstation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Einbindung einer HP1000 Wetterstation&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Heizungssteuerung/Raumklima&lt;br /&gt;
|ModFTopic=44022&lt;br /&gt;
|ModTechName=50_HP1000.pm&lt;br /&gt;
|ModOwner={{Link2FU|1363|Loredo}}&lt;br /&gt;
}}&lt;br /&gt;
== HP1000 ==&lt;br /&gt;
HP1000 ist ein Modul zum Auslesen von HP1000/WH2600 Wetterstationen von renkforce/Froggit, etc.&lt;br /&gt;
&lt;br /&gt;
Funktionsweise des Moduls ist, dass in der Wetterstation eine FHEMWEB Instanz angegeben wird, an die die Wetterstation dann regelmäßig die Daten sendet. &lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Die Konfiguration des Moduls erfolgt in drei Schritten:&lt;br /&gt;
=== Definition einer Webinstanz für die Wetterstation ===&lt;br /&gt;
Zunächst muss auf einem eigenen Port eine neue FHEMWEB-Instanz angelegt werden, z.B. mit dem Namen WEBweather. Dieser muss zwingend der Name weatherstation zugewiesen werden. Dieser ist in der Firmware der Stationen fest codiert.&lt;br /&gt;
  define WEBweather FHEMWEB 8089 global&lt;br /&gt;
  attr WEBweather webname weatherstation&lt;br /&gt;
=== Definition der Wetterstation ===&lt;br /&gt;
Dann wird das Modul noch in Fhem definiert. Die Definition kann mit und ohne Benutzernamen und Passwort erfolgen. Wenn bei der Definition Benutzername und Passwort nicht angegeben werden, werden die von der Wetterstation gesendeten Benutzerdaten von Fhem nicht überprüft. Eine WH2600 Station erfordert im Webinterfache immer die Angabe von Benutzername und Passwort.&lt;br /&gt;
Definition mit Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000 Benutzer Passwort&lt;br /&gt;
Definition ohne Benutzername und Passwort:&lt;br /&gt;
  define Wetterstation HP1000&lt;br /&gt;
&lt;br /&gt;
=== Eingaben im Webinterface der Station ===&lt;br /&gt;
Dann muss der Station in deren Webinterface noch gesagt werden, dass die Wetterinformationen an Fhem geschickt werden. Dazu im Webinterface unter &amp;quot;Weather Network&amp;quot; Folgendes eintragen:&lt;br /&gt;
&amp;lt;pre&amp;gt;Remote Server      =&amp;gt; Customzied&lt;br /&gt;
Server IP/Hostname =&amp;gt; &amp;lt;Fhem-Domainname&amp;gt; bzw. &amp;lt;Fhem-IP&amp;gt; (s.u.)&lt;br /&gt;
Server Port        =&amp;gt; Der Port der neuen Webinstanz in Fhem (im Beispiel oben 8089)&lt;br /&gt;
Station ID         =&amp;gt; selbstgewählter Benutzername&lt;br /&gt;
Password           =&amp;gt; selbstgewähltes Passwort&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zu &#039;&#039;&#039;Server IP/Hostname&#039;&#039;&#039;: Hier muss entweder der Domainname angegeben werden, unter dem Fhem erreichbar ist (vollständige Domain nicht vergessen!), oder die IP. Wenn in Fhem keine Daten ankommen, ist das hier meist der Knackpunkt. Erfahrungen zeigen, dass teilweise der Domainname nicht vollständig angegeben wurde oder aber der Domainname nicht aufgelöst werden kann (vielleicht gibt es hier Probleme einzelner Stationen, bei der Konfiguration via DHCP den Nameserver-Eintrag richtig umzusetzen). Einfach mal alle Möglichkeiten durchprobieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Station ID&#039;&#039;&#039; und &#039;&#039;&#039;Passwort&#039;&#039;&#039; müssen hier angegeben werden. Bei der Definition der Station in Fhem kann man diese angeben (dann wird geprüft, ob die berechtigte Station Daten schickt) oder weglassen (dann werden Benutzername und Passwort nicht von Fhem geprüft).&lt;br /&gt;
== Tipps, Tricks, Problemlösungen ==&lt;br /&gt;
=== FileLog ===&lt;br /&gt;
Das Modul definiert bei der Erstellung kein FileLog. Wenn man eines definiert, bietet sich aufgrund der Häufigkeit von Datenübertragungen und damit der Menge an übertragenen Informationen das Loggen nur des T:-Readings an:&lt;br /&gt;
  define FileLog_Wetterstation FileLog ./log/Wetterstation-%Y.log Wetterstation:T:.*&lt;br /&gt;
=== Mehr Einträge im T:-Reading ===&lt;br /&gt;
Das Modul liefert standardmäßig nicht alle vom Außensender verfügbaren Daten auch in der T:-Zeile. Wenn man dort - z. B. zum Loggen - alle Daten haben möchte, kann man die übrigen Daten ergänzen. Dafür editiert man die Datei 50_HP1000.pm und ergänzt Zeilen.&lt;br /&gt;
Im Bereich von Zeile 347 suchen:&lt;br /&gt;
&amp;lt;pre&amp;gt;    $result = &amp;quot;T: &amp;quot; . $webArgs-&amp;gt;{outtemp} if ( defined( $webArgs-&amp;gt;{outtemp} ) );&lt;br /&gt;
    $result .= &amp;quot; H: &amp;quot; . $webArgs-&amp;gt;{outhumi}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{outhumi} ) );&lt;br /&gt;
    $result .= &amp;quot; Ti: &amp;quot; . $webArgs-&amp;gt;{intemp}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{intemp} ) );&lt;br /&gt;
    $result .= &amp;quot; Hi: &amp;quot; . $webArgs-&amp;gt;{inhumi}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{inhumi} ) );&lt;br /&gt;
    $result .= &amp;quot; W: &amp;quot; . $webArgs-&amp;gt;{windspeed}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{windspeed} ) );&lt;br /&gt;
    $result .= &amp;quot; R: &amp;quot; . $webArgs-&amp;gt;{rainrate}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{rainrate} ) );&lt;br /&gt;
    $result .= &amp;quot; WD: &amp;quot; . $webArgs-&amp;gt;{winddir}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{winddir} ) );&lt;br /&gt;
    $result .= &amp;quot; D: &amp;quot; . $webArgs-&amp;gt;{dewpoint}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{dewpoint} ) );&lt;br /&gt;
    $result .= &amp;quot; P: &amp;quot; . $webArgs-&amp;gt;{relbaro}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{relbaro} ) );&amp;lt;/pre&amp;gt;&lt;br /&gt;
und dahinter folgende neue Zeilen einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;    $result .= &amp;quot; U: &amp;quot; . $webArgs-&amp;gt;{UV}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{UV} ) );&lt;br /&gt;
    $result .= &amp;quot; L: &amp;quot; . $webArgs-&amp;gt;{light}&lt;br /&gt;
      if ( defined( $webArgs-&amp;gt;{light} ) );&lt;br /&gt;
    $result .= &amp;quot; WC: &amp;quot; . $webArgs-&amp;gt;{windchill}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{windchill}));&lt;br /&gt;
    $result .= &amp;quot; RD: &amp;quot; . $webArgs-&amp;gt;{dailyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{dailyrain}));&lt;br /&gt;
    $result .= &amp;quot; RW: &amp;quot; . $webArgs-&amp;gt;{weeklyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{weeklyrain}));&lt;br /&gt;
    $result .= &amp;quot; RM: &amp;quot;.$webArgs-&amp;gt;{monthlyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{monthlyrain}));&lt;br /&gt;
    $result .= &amp;quot; RY: &amp;quot;.$webArgs-&amp;gt;{yearlyrain}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{yearlyrain}));&lt;br /&gt;
    $result .= &amp;quot; WG: &amp;quot;.$webArgs-&amp;gt;{windgust}&lt;br /&gt;
      if (defined($webArgs-&amp;gt;{windgust}));&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um zu verhindern, dass die eigenen Ergänzungen bei einem Update des Moduls überschrieben werden, dann noch 50_HP1000.pm vom automatischen Update ausnehmen:&lt;br /&gt;
  attr global exclude_from_update 50_HP1000.pm&lt;br /&gt;
=== Absturz von Fhem wegen Illegal division by zero ===&lt;br /&gt;
Wenn HP1000 Fhem abstürzen lässt mit der Fehlermeldung &lt;br /&gt;
&amp;lt;pre&amp;gt;2016.10.01 08:51:00 1: PERL WARNING: Use of uninitialized value in division (/) at ./FHEM/50_HP1000.pm line 383.&lt;br /&gt;
Illegal division by zero at ./FHEM/50_HP1000.pm line 383.&amp;lt;/pre&amp;gt;&lt;br /&gt;
dann hilft es, die mit + markierten Zeilen (natürlich ohne die +-Zeichen selbst!) in 50_HP1000.pm im sub HP1000_GetSum (um Zeile 400) einzufügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;    if ($avg) {&lt;br /&gt;
+     if (@{ $hash-&amp;gt;{helper}{history}{$t} } &amp;gt; 0) {&lt;br /&gt;
        $return = sprintf( &amp;quot;%.1f&amp;quot;,&lt;br /&gt;
            sum( @{ $hash-&amp;gt;{helper}{history}{$t} } ) /&lt;br /&gt;
              @{ $hash-&amp;gt;{helper}{history}{$t} } );&lt;br /&gt;
&lt;br /&gt;
        Log3 $name, 5, &amp;quot;HP1000 $name: Average for $t: $return&amp;quot;;&lt;br /&gt;
+     }&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Falsch angezeigte/zu wenig Readings ===&lt;br /&gt;
Abhängig von der Firmwareversion und/oder dem Modell der Station kann es dazu kommen, dass teilweise nicht alle Readings oder die Readings mit den falschen Einheiten (z. B. Wingeschwindigkeit in mph, obwohl km/h konfiguriert wurde) angezeigt werden. In diesem Fall hilft es, im Webinterface der Wetterstation bei der Definition &amp;quot;Weather Network&amp;quot; den &amp;quot;Server Type&amp;quot; auf &amp;quot;JSP&amp;quot; zu stellen.&lt;br /&gt;
=== Keine Daten in Fhem ===&lt;br /&gt;
Wenn in Fhem keine Daten von der Wetterstation ankommen, liegt das häufig daran, dass FHEM nicht richtig als &amp;quot;Weather Network&amp;quot; konfiguriert wurde. Wenn die &#039;&#039;&#039;erforderlichen Eingaben im Webinterface&#039;&#039;&#039; (s. o.) der Station nicht helfen, kann man sich zum Testen per telnet mit der Wetterstation verbinden (Benutzername admin, Passwort admin). Mögliche Befehle:&lt;br /&gt;
&amp;lt;pre&amp;gt;help&lt;br /&gt;
quit&lt;br /&gt;
reboot&lt;br /&gt;
Usage: passwd&lt;br /&gt;
       Old Password:&lt;br /&gt;
       New Password:&lt;br /&gt;
       Re-enter New Password:&lt;br /&gt;
Usage: username &amp;lt;user name&amp;gt;&lt;br /&gt;
Usage: ipconfig&lt;br /&gt;
Usage: setip &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmask &amp;lt;netmask&amp;gt;&lt;br /&gt;
Usage: setgateway &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setdns &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: setmode &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: SERVER     1: CLIENT&lt;br /&gt;
Usage: setsrvport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: setdstport &amp;lt;port&amp;gt;&lt;br /&gt;
Usage: dhcpclient &amp;lt;status&amp;gt;&lt;br /&gt;
       &amp;lt;status&amp;gt;: 0: disable     1: enable&lt;br /&gt;
Usage: connectype &amp;lt;protocol&amp;gt;&lt;br /&gt;
       &amp;lt;protocol&amp;gt;: 0: TCP     1: UDP&lt;br /&gt;
Usage: transmitimer &amp;lt;time&amp;gt;&lt;br /&gt;
       &amp;lt;time&amp;gt;: time in ms&lt;br /&gt;
Usage: saveconfig&lt;br /&gt;
Usage: accessip &amp;lt;index&amp;gt; &amp;lt;ip addr&amp;gt;&lt;br /&gt;
       &amp;lt;index&amp;gt;:   index of accessible IP&lt;br /&gt;
       &amp;lt;ip addr&amp;gt;: accessible IP address&lt;br /&gt;
Usage: setaccip &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;:  0: disable    1: enable&lt;br /&gt;
Usage: setaw &amp;lt;cold start&amp;gt; &amp;lt;authentication fail&amp;gt; &amp;lt;ip changed&amp;gt; &amp;lt;password changed&amp;gt;&lt;br /&gt;
       &amp;lt;cold start&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;authentication fail&amp;gt;:    0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;ip changed&amp;gt;:             0: Disable     1: Enable&lt;br /&gt;
       &amp;lt;password changed&amp;gt;:       0: Disable     1: Enable&lt;br /&gt;
Usage: setdsthn &amp;lt;Host name/IP&amp;gt;&lt;br /&gt;
Usage: tftpsrv &amp;lt;ip addr&amp;gt;&lt;br /&gt;
Usage: filename &amp;lt;file name&amp;gt;&lt;br /&gt;
Usage: dlfirmware&lt;br /&gt;
Usage: seteep &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&lt;br /&gt;
Usage: dbgmsg &amp;lt;mode&amp;gt;&lt;br /&gt;
       &amp;lt;mode&amp;gt;: 0: Disable    1: Enable&lt;br /&gt;
Usage: connstatus&lt;br /&gt;
Usage: ping xxx.xxx.xxx.xxx&lt;br /&gt;
Usage: setRTC &amp;lt;HEX RegStartAddr&amp;gt; &amp;lt;HEX Byte 0&amp;gt; &amp;lt;HEX Byte 1&amp;gt;...&amp;lt;HEX Byte N&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am besten mit &amp;quot;ipconfig&amp;quot; sich die aktuelle Konfiguration anzeigen lassen. Mit ping kann man Verbindungen z. B. zu Fhem testen.&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16225</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16225"/>
		<updated>2016-08-21T15:14:35Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power. Das Reading gilt auch als Ersatz für das normale state Reading, wenn dieses z.B. bei Verwendung von DevIO nicht die genannten Status annimmt, sondern denen von DevIO entspricht (appeared, disappeared).&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16224</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16224"/>
		<updated>2016-08-21T15:12:14Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16223</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16223"/>
		<updated>2016-08-21T15:02:38Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16222</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16222"/>
		<updated>2016-08-21T14:09:21Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{no-c}} || {{planed-c}} || {{no-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16221</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16221"/>
		<updated>2016-08-21T14:00:48Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{no-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16220</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16220"/>
		<updated>2016-08-21T13:58:32Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16219</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=16219"/>
		<updated>2016-08-21T13:54:40Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Add stateAV definition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stateAV&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;&amp;lt;presence&amp;gt; | &amp;lt;power&amp;gt; | &amp;lt;mute&amp;gt; | &amp;lt;playStatus&amp;gt;&amp;lt;/nowiki&amp;gt; || Kombiniert den Status von bestehenden Readings zu einer logisch abhängigen Einheit nach folgendem Format: Wenn presence=absent=&amp;gt;absent, sonst power=off=&amp;gt;off, sonst mute=on=&amp;gt;muted, sonst playStatus!=stopped=&amp;gt;playStatus, sonst =&amp;gt;power&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=15376</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=15376"/>
		<updated>2016-05-22T18:05:47Z</updated>

		<summary type="html">&lt;p&gt;Loredo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=15375</id>
		<title>DevelopmentGuidelinesAV</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesAV&amp;diff=15375"/>
		<updated>2016-05-22T17:36:23Z</updated>

		<summary type="html">&lt;p&gt;Loredo: Update ONKYO&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Auf dieser Seite sollen Richtlinien für AV-Module gesammelt werden damit es einfacher wird diese zusammen mit anderen Modulen wie remotecontroll oder LightScene zu verwenden. Auch Benachrichtigungen wie Sprachdurchsagen oder Einblendungen lassen sich universeller verwenden wenn sie bei allen Geräten die dies unterstützen gleich angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Der Text aus dem ursprünglichen Forumsthread war folgender:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::gerade ist ja mit den tv und verstärker modulen sowie dem remotecontrol modul ziemlich schwung in den bereich audio und video geräte gekommen. zusätzlich gibt es noch eine ganze reihe älterer module wie sonor und xbmc und zwei arten itunes anzusprechen und neue module wie für die web radios oder das raspberry multiroom stehen vor der tür.&lt;br /&gt;
&lt;br /&gt;
::wie wäre es sich rechtzeitig auf ein möglichst einheitiches kommando set zu verständigen damit grundlegende dinge wie play/pause/volume/next bei allen geräten einheitlich, in gleicher schreibweise und mit möglichst ähnlichen parametern funktionieren?&lt;br /&gt;
&lt;br /&gt;
::das würde module wie die remotecontrol aber auch structure und lightscene deutlich einfacher und nützlicher machen und auch alternative frontends erleichtern wenn bestimmte features wie audio,video oder cover über ein einheitliches schema markiert würden.&lt;br /&gt;
&lt;br /&gt;
::mein vorschlag wäre sich an das sonos modul anzulehnen weil es mir in dieser hinsicht am fortgeschrittensten erscheint und auch weitergehende features wie cover oder durchsagen anbietet.&lt;br /&gt;
&lt;br /&gt;
::zu vereinheitlichen wäre dann u.a.:&lt;br /&gt;
::- welche kommandos zu welchem zweck&lt;br /&gt;
::- kommandos sollten einheitlich geschrieben werden. also z.b. immer klein oder immer mixed case.&lt;br /&gt;
::- parameter sollten so weit möglich den gleichen wertebereich haben. also z.b. volume immer von 0-100.&lt;br /&gt;
::- wenn es aus irgendeinem grund noch ein gerätespezifischer wertebereich nötig ist sollte der zusätzlich vorhanden sein.&lt;br /&gt;
::- cover sollten immer auf die gleiche art gelesen werden können&lt;br /&gt;
::- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Thread ist [http://forum.fhem.de/index.php/topic,13784.0.html hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Bezeichner ==&lt;br /&gt;
siehe [[DevelopmentGuidelines#Bezeichnungen|Bezeichnungen allgmein]]&lt;br /&gt;
&lt;br /&gt;
== Kommandos ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Definition von set-Befehlen aufzeigen. Dazu zählen auch ggf. Parameter und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  || Schaltet das Gerät ein, so dass es benutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  || Schaltet das Gerät aus.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  || Startet das Abspielen von Medien (Video, mp3, Radio stream etc.)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  || Pausiert das Abspielen von Medien, stoppt es aber nicht.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  || Stoppt (beendet) das Abspielen von Medien.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0 - 100 || Setzt die Lautstärke auf einen prozentualen Wert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Setzt die Lautstärke auf den absoluten Wert, so wie er vom Gerät tatsächlich verwendet wird (z.B. dB)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; || [0 - 100]  || Erhöht die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Inkrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; || [0 - 100] || Verringert die Lautstärke um einen gerätespezifischen Schritt (z.b. 5%). Wenn die Schrittweite konfigurierbar ist soll das über das Attribut volumeStep erfolgen. Optional kann das Dekrement als optionaler Parameter mit angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | toggle&amp;lt;/nowiki&amp;gt;  || Aktiviert, deaktiviert oder schaltet die Mutefunktion = Lautstärke der aktuellen Ausgabe wird verringert bzw. abgschaltet (Gerätespezifisch)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt;  || Aktivieren der Repeatfunktion = wiederholen des aktuellen Titels/Albums&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt;  || Aktiviert oder deaktiviert die Shufflefunktion = zufällige Wiedergabe.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || 0 - 9999 || Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  || Springt zum nächsten Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  || Springt zum vorherigen Sender- oder Programmspeicherplatz.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; || # || Parameter ist Hersteller- und Gerätespezifisch. Funktion bei Geräten, die es erlauben die mitgelieferte Hardware Fernbedienung zu simulieren. Parameter in lowerCamelCaps (ggf. muss im Modul selber auf die Herstellerspezifische Schreibweise umcodiert werden; Alles groß- oder klein geschrieben)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]&amp;lt;/nowiki&amp;gt; || Auswahl von Hardwarekanälen (HDMI, DVB-S, PAL, DVI) oder Softwarekanälen (Airplay, IPTV, IP-Radiostream) die das zu steuernde Gerät aktiv schalten soll (zur Darstellung auf TV, Kanalwahl bei AV-Receivern etc.). Da diese Kanäle je nach Gerät und Modellreihen unterschiedliche Bezeichnungen besitzen, sollten alle möglichen Bezeichnungen in Form von lowerCamelCaps angeboten werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;z.B. Airtunes1,Airtunes2,Intern&amp;lt;/nowiki&amp;gt; || Auswahl des/der Ausgabegerätes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; || || Den aktuellen Status des Gerätes abfragen&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Diese Tabelle soll eine einheitliche Wertedefinition von Readings. Dazu zählen auch die verwendeten Werte und deren Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Wenn es zwischen reading und zugehörigen set eine 1:1 Beziehung gibt sollte sich der Inhalt des readings als Argument des set verwenden lassen um genau diesen dargestellten Zustand zu erreichen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! mögliche Werte !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on|off&amp;lt;/nowiki&amp;gt; || Ist das Gerät an oder aus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;present|absent&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell ansprechbar? Sollte das Gerät aufgrund abgeschalteten Stromzufuhr, o.ä. aktuell nicht steuerbar sein, so sollte dies mit dem Wert &amp;quot;absent&amp;quot; verdeutlicht werden. In solch einem Fall sollte ein set-Befehl eine entsprechende Fehlermeldung bringen. Evtl. StatusUpdate-Timer sollten ensprechende Fehlermeldungen nur einmal im Log, etc. festhalten und Fehlermeldungen beim nächsten Status-Update entsprechend unterdrücken um so die Logfiles nicht unnötig vollzuschreiben. Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; || 0-100 || Der prozentuale Lautstärkepegel gemessen der maximal möglichen tatsächlichen Werte. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; || X-Y || Der tatsächliche Lautstärkepegel des Gerätes, so wie er am Gerät angezeigt/verwendet wird. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;Nur zu Verwenden, wenn das Gerät einen anderen Wertebereich als 0-100% intern verwendet.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät aktuell stumm geschaltet?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;one | all | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im repeat modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off&amp;lt;/nowiki&amp;gt; || Ist das Gerät im shuffle modus?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählter Eingangskanal&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; ||  &#039;&#039;aktuell gewählte(s) Ausgabegerät(e)&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; || &#039;&#039;aktuell gewählter Eingangskanal entsprechend dem Gerät&#039;&#039;|| &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; || &#039;&#039;aktueller Interpret&#039;&#039; || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; || &#039;&#039;aktuelles Album&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; || &#039;&#039;aktueller Titelname&#039;&#039; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; || &#039;&#039;&amp;quot;Name&amp;quot; der Wiedergabe&amp;quot;datei&amp;quot;&#039;&#039; ||  kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;playing | paused | stopped&amp;lt;/nowiki&amp;gt; ||  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; || &amp;lt;nowiki&amp;gt;on | off | absent&amp;lt;/nowiki&amp;gt; || Sofern das Gerät empfangsbereit ist, soll der Schaltzustand des Gerätes (Reading: power, sofern anwendbar) zurückgegeben werden. Ansonsten ist die Abwesenheit des Gerätes durch den Wert &amp;quot;absent&amp;quot; anzuzeigen.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;| ... &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Implementation in Modulen ==&lt;br /&gt;
{{yes}} = Implementiert {{yes2}} = device spezifisch {{planed}} = Implementation geplant/in Arbeit {{no}} = Nicht implementiert/Keine Implementation geplant&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! set-Befehl !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony !! plex&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;on&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;off&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;play&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pause&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;stop&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||   {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}}|| {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes2-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelUp&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} || {{no-c}}    || {{no-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channelDown&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}   || {{no-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;remoteControl&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes2-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; || {{yes-c}} ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}}|| {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{yes2-c}} || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;statusRequest&#039;&#039;&#039; ||  || {{yes-c}} ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
! Reading !!  LGTV !! LISTENLIVE !! STV !! VIERA !! YAMAHA_AVR !! iTunes !! ENIGMA2 !! ONKYO_AVR !! Squeezebox !! PHTV !! PIONEER !! harmony&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;power&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;presence&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volume&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||   {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;volumeStraight&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{no-c}} || {{no-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mute&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;repeat&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;shuffle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{yes-c}} || {{no-c}} || {{yes2-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{planed-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;input&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;output&#039;&#039;&#039; || ||  ||  || {{no-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}} || {{no-c}}  || {{no-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;channel&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{no-c}}  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentArtist&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentAlbum&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentTitle&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;currentMedia&#039;&#039;&#039; ||  ||  ||  || {{no-c}} ||  {{no-c}} || {{planed-c}} || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;playStatus&#039;&#039;&#039; ||  ||  ||  || {{no-c}} || {{yes-c}}  || {{yes-c}} || {{planed-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{no-c}} || {{no-c}} ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;state&#039;&#039;&#039; ||  ||  ||  || {{yes-c}} ||  {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{yes-c}} || {{no-c}} || {{yes-c}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
=== Wie funktioniert Cover Art? ===&lt;br /&gt;
Reading mit URL-Link oder als Gerätestatus???&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Sprachdurchsagen oder Text Einblendungen? ===&lt;br /&gt;
&lt;br /&gt;
Obwohl dies sehr stark davon abhängt, ob das jeweilige Gerät eine solche Funktion unterstützt, oder ob sie anderweitig (z.B. durch Google Service) umgesetzt werden können, so sollen dennoch solche Features über die folgenden Set-Kommandos angeboten werden.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sayText&#039;&#039;&#039;|| &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; sayText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 || Dieses Kommando soll den übergebenen Text auf dem jeweiligen Device in Audio-Form wieder ausgeben. Hierbei kann auf einen Synthese-Anbieter im Internet zurückgegriffen werden, der ein solches Audiosample erzeugt, oder geräteinterne Kommandos verwendet werden, je nach dem was vorhanden und unterstützt wird.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;showText&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; showText &amp;quot;Anruf in Abwesenheit&amp;quot;&amp;lt;/pre&amp;gt;|| Dieses Kommando soll einen Text z.B. auf dem Display des Gerätes (oder Fernseher) in geeigneter Form anzeigen, sofern das Gerät eine solche Funktion unterstützt. &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot;| Alternativvorschlag&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;message&#039;&#039;&#039; || &amp;lt;pre&amp;gt;set &#039;&#039;&amp;lt;device&amp;gt;&#039;&#039; message &amp;quot;Anruf in Abwesenheit&amp;quot; [audio|video]&amp;lt;/pre&amp;gt;|| Dieses Kommando soll eine Nachricht mit dem Gerät anzeigen (video) oder abspielen (audio), sofern das Gerät eine solche Funktion unterstützt. Ohne die optionale Wiedergabe-Art oder wenn die angegebene nicht unterstützt ist über die von diesem Gerät bevorzugte Methode. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Playlisten? ===&lt;br /&gt;
&lt;br /&gt;
Sofern anwendbar, sollten diese mit dem Kommando &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; playlist XY&amp;lt;/code&amp;gt; aufrufbar sein. Dabei sollten die zur Verfügung stehenden Playlists bereits bekannt sein und als möglicher Kommando-Parameter angeboten werden. &lt;br /&gt;
&lt;br /&gt;
=== Wie funktionieren Zonen? ===&lt;br /&gt;
&lt;br /&gt;
Jede einzelne Zone eines Gerätes wird durch ein eigenes FHEM-Device repräsentiert. Die gewünschte Zone ist als optionaler Parameter in den Definitions-Argumenten zu übergeben.&lt;br /&gt;
&lt;br /&gt;
Wenn keine bestimmte Zone explizit in der Definition übergeben wird, ist die Hauptzone (Main-Zone) zu verwenden. Die zur Verfügung stehenden Zonen sollten in den Internals aufgelistet sein, mindestens jedoch in der commandref des entsprechenden Moduls.&lt;br /&gt;
&lt;br /&gt;
Jede Definition sollte nur die tatsächlich möglichen Befehle, Eingänge, etc. der entsprechenden Zone anbieten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=13427</id>
		<title>Anwesenheitserkennung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=13427"/>
		<updated>2016-01-02T10:21:31Z</updated>

		<summary type="html">&lt;p&gt;Loredo: /* GEOFANCY Modul individualisieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Viele Benutzer führen bereits eine eigene &#039;&#039;&#039;Anwesenheitserkennung&#039;&#039;&#039; durch. Diese basiert in den meisten Fällen auf Ping Checks oder bei [[AVM Fritz!Box|FritzBoxen]] auf dem Befehl &#039;&#039;ctlmgr_ctl&#039;&#039;. Diese Lösungen können aber je nach Aufbau und Funktion FHEM massiv beeinträchtigen. Aufgrund des Aufbaus vom FHEM kann dieses dadurch für mehrere Sekunden zum völligen Stillstand gebracht werden.&lt;br /&gt;
&lt;br /&gt;
In FHEM gibt es mittlerweile mehrere Module, die eine zuverlässige Anwesenheitserkennung bieten, ohne dabei FHEM bei der Ausführung zu beeinträchtigen.&lt;br /&gt;
&lt;br /&gt;
Eine erweiterte Funktion der Anwesenheitserkennung ist die Standortverfolgung, die sich nicht nur auf ein oder sehr wenige mit (eigenem) WLAN versorgte Gebiete beschränkt.&lt;br /&gt;
&lt;br /&gt;
== Vorüberlegungen ==&lt;br /&gt;
Generell gibt es mehrere Ansätze um Anwesenheitserkennung mit Handys/Smartphones durchzuführen.&lt;br /&gt;
&lt;br /&gt;
* via PING Checks im gesamten WLAN&lt;br /&gt;
* Aktivitätsprüfung auf einer FritzBox&lt;br /&gt;
* Bluetooth Checks in der gesamten Wohnung&lt;br /&gt;
* eigene Perl-Funktion&lt;br /&gt;
* aktive Benachrichtigung des Smartphones, ausgelöst z.B. über Geo-Lokation/Geofence&lt;br /&gt;
&lt;br /&gt;
Dabei gilt bei der Auswahl der Art darauf zu achten wie sich das jeweilige Device verhält. Aufgrund der Vielfältigkeit kann man hier keine allgemeine Vorgehensweise empfehlen. Als einfacher Start (zumindest für Nicht-Apfel Telefone) eignet sich die Ping-Überprüfung und die FritzBox-Abfrage sehr gut.&lt;br /&gt;
&lt;br /&gt;
=== Randbedingungen ===&lt;br /&gt;
Es gibt Geräte, die ihr WLAN/Bluetooth auch im Standby ständig aktiv haben und auf Anfragen antworten können (fast alle Android-Geräte). Gerade bei Tests über WLAN kann sich das aber signifikant auf die Akku Leistung auswirken.&lt;br /&gt;
&lt;br /&gt;
Andere Geräte wiederum schalten WLAN im Standby Betrieb aus, um Akkukapazität zu sparen. Bluetooth hingegen bleibt weiterhin aktiviert und kann auf Anfragen reagieren. (iPhone)&lt;br /&gt;
&lt;br /&gt;
Wenn man bei einem iPhone die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert hat, so ist dies auch im Standby jederzeit pingbar, wenn der Recher auf dem iTunes zum synchroniseren läuft auch an ist. Ansonsten ist bei iPhone Geräten nur die Aktivitätsprüfung mit einer FritzBox oder das überwachen der DHCP Lease auf einer Airport Basestation wirklich zuverlässig.&lt;br /&gt;
&lt;br /&gt;
Auch wenn Bluetooth aktiviert ist, so bleiben einige Mobiltelefone erst dann empfangsbereit, wenn sie bereits zu irgend einem Bluetoothgerät gekoppelt wurden. Sind diese Geräte noch nie gekoppelt worden, deaktivieren diese ihren Bluetooth Empfänger beim verlassen des Bluetooth-Menüs im Gerät (iPhone).&lt;br /&gt;
&lt;br /&gt;
Hier gilt es vor allem auszuprobieren, wie stark der Akku durch eine Anwesenheitserkennung belastet wird. Entscheidend ist hier, in welchem Abstand man eine Anwesenheitserkennung durchführt. Viele Abfragen wirken sich stärker auf den Akku aus als wenige. Wenige Abfragen bieten aber keine zuverlässige und zeitnahe Erkennung.&lt;br /&gt;
&lt;br /&gt;
Als Alternative, unabhängig vom WLAN und der Erkennung, ob ein Gerät dort eingebucht ist oder nicht, bzw. unabhängig von Bluetooth kann zumindest bei einem iPhone die seit iOS 7 nochmals stark verbesserte Geo-Lokation (Geofencing) genutzt werden. Die iPhone Apps [http://geofency.com/ Geofency] oder [http://geofancy.com/ Geofancy] werden über das FHEM-Modul GEOFANCY angebunden und übertragen ihren Status immer dann, wenn ein definierter Standort betreten oder verlassen wird. Gekoppelt mit entsprechenden Notify und/oder Watchdog Kommandos ist so ebenfalls eine sehr zuverlässige Anwesenheitserkennung möglich (und das nicht nur für das eigene Zuhause).&lt;br /&gt;
&lt;br /&gt;
== Das PRESENCE Modul ==&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an. Diese sind aktuell folgende:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lan-ping&#039;&#039;&#039; - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.&lt;br /&gt;
* &#039;&#039;&#039;fritzbox&#039;&#039;&#039; - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)&lt;br /&gt;
* &#039;&#039;&#039;local-bluetooth&#039;&#039;&#039; - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)&lt;br /&gt;
* &#039;&#039;&#039;lan-bluetooth&#039;&#039;&#039; - Das Überwachen von Bluetoothgeräte, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. [[:Kategorie:Raspberry Pi|Raspberry Pi]]) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.&lt;br /&gt;
* &#039;&#039;&#039;function&#039;&#039;&#039; - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)&lt;br /&gt;
* &#039;&#039;&#039;shell-script&#039;&#039;&#039; - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.&lt;br /&gt;
&lt;br /&gt;
=== Ping-Überwachung von Geräten im WLAN/LAN ===&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die IP-Addresse 192.168.0.30 alle 30&amp;amp;nbsp;Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status &amp;quot;present&amp;quot; (anwesend), ansonsten &amp;quot;absent&amp;quot; (abwesend).&lt;br /&gt;
&lt;br /&gt;
Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30 &#039;&#039;&#039;60&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun würde das Handy alle 60 Sekunden geprüft werden.&lt;br /&gt;
&lt;br /&gt;
Nur wenn bei einem iPhone/iPad die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.&lt;br /&gt;
&lt;br /&gt;
=== FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl ===&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.&lt;br /&gt;
&lt;br /&gt;
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt &amp;quot;Heimnetz&amp;quot; auftaucht. &lt;br /&gt;
&lt;br /&gt;
Die erforderliche Definition:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE fritzbox iPhone-4S&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth-Überwachung von Geräten durch den FHEM Server ===&lt;br /&gt;
[[Datei:Bluetooth-Adresse-iPhone.png|thumb|Bluetooth-Adresse eines iPhones]]&lt;br /&gt;
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.&lt;br /&gt;
&lt;br /&gt;
Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.&lt;br /&gt;
&lt;br /&gt;
Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der [[Konfiguration]] benötigt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth-Überwachung von Geräten durch verteilte Agenten in der Wohnung (presencd/collectord) ===&lt;br /&gt;
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]&lt;br /&gt;
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.&lt;br /&gt;
&lt;br /&gt;
Dieses Netz aus Raspberrys wird mit dem presenced (Download-Link ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für den Raspberry zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beide Programme (presenced/collectord) sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt. Nach Installation der *.deb Pakete sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-rc.d presenced defaults&lt;br /&gt;
sudo update-rc.d collectord defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von presenced ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] Beschreibung zum PRESENCE Modul enthalten.&lt;br /&gt;
&lt;br /&gt;
==== Jeden Raum einzeln ansprechen (presenced) ====&lt;br /&gt;
Nun kann zuallererst jeder Raum einzeln angesprochen werden. Dabei ist zu beachten, dass pro Definition in der Konfiguration nur ein Gerät in einem Raum spezifisch überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Eine Definition sieht dabei folgendermaßen aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy_Wohnzimmer PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.0.10:5111&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird nun das Gerät nur im Wohnzimmer (Raspberry mit IP 192.168.0.10) überwacht.&lt;br /&gt;
&lt;br /&gt;
==== Alle Räume gemeinsam ansprechen (collectord) ====&lt;br /&gt;
Um jedoch alle Räume gemeinsam zu verwenden, gibt es den Collector-Daemon. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
Um alle Räume zu kennen, müssen diese mit einem Config-File dem collectord mitgeteilt werden. Dieses sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Schlafzimmer]           # Name des Raumes (wird in FHEM als Reading angezeigt)&lt;br /&gt;
address=192.168.179.31   # IP-Adresse oder Hostname des presenced&lt;br /&gt;
port=5111                # TCP Port, der verwendet werden soll (standardmäßig Port 5111)&lt;br /&gt;
presence_timeout=120     # Prüfinterval, das verwendet werden soll, wenn ein Gerät anwesend ist&lt;br /&gt;
absence_timeout=20       # Prüfinterval, das verwendet werden soll, wenn ein Gerät abwesend ist&lt;br /&gt;
&lt;br /&gt;
[Wohnzimmer]&lt;br /&gt;
address=192.168.179.34&lt;br /&gt;
port=5111&lt;br /&gt;
presence_timeout=180&lt;br /&gt;
absence_timeout=20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist dieses Config-File unter /etc/collectord.conf zu finden. Mit dieser Konfiguration kann der Collectord gestartet werden. Es empfiehlt sich diesen mit auf dem FHEM Server zu betreiben. Die erforderliche Definition in der Fhem-Konfiguration:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald das Handy irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort an FHEM und teilt den Raum mit.&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von collectord findet man in der Commandref zum PRESENCE Modul.&lt;br /&gt;
&lt;br /&gt;
=== Überwachung von Geräten mit Perl-Code ===&lt;br /&gt;
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; PRESENCE function {...} [ &amp;lt;check-interval&amp;gt; [ &amp;lt;present-check-interval&amp;gt; ] ]&lt;br /&gt;
&lt;br /&gt;
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel DHCP Überwachung auf Airport Basestation ====&lt;br /&gt;
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.&lt;br /&gt;
&lt;br /&gt;
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z.&amp;amp;nbsp;B. mit: &amp;lt;code&amp;gt;cpan install use Net::SNMP&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zuerst ist folgender Code in 99_myUtils.pl einzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::SNMP;&lt;br /&gt;
sub&lt;br /&gt;
snmpCheck($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($airport,$client)= @_;&lt;br /&gt;
&lt;br /&gt;
  my $community = &amp;quot;public&amp;quot;;&lt;br /&gt;
  my $host = $airport;&lt;br /&gt;
  my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2&amp;quot;;&lt;br /&gt;
  #my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2.25.1.10.0.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my ( $session, $error ) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
    -hostname =&amp;gt; $host,&lt;br /&gt;
    -community =&amp;gt; $community,&lt;br /&gt;
    -port =&amp;gt; 161,&lt;br /&gt;
    -version =&amp;gt; 1&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if( !defined($session) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
    return &amp;quot;Can&#039;t connect to host $host.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  my @snmpoids = ();&lt;br /&gt;
&lt;br /&gt;
  my $response = $session-&amp;gt;get_next_request($oid);&lt;br /&gt;
  my @nextid = keys %$response;&lt;br /&gt;
  while ( @nextid &amp;amp;&amp;amp; $nextid[0] &amp;amp;&amp;amp; $nextid[0] =~ m/^$oid/ ) {&lt;br /&gt;
    push( @snmpoids, $nextid[0] );&lt;br /&gt;
&lt;br /&gt;
    $response = $session-&amp;gt;get_next_request( $nextid[0] );&lt;br /&gt;
    @nextid = keys %$response;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if( !defined($response = $session-&amp;gt;get_request( @snmpoids ) ) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  foreach my $value (values %$response) {&lt;br /&gt;
    return 1 if( $value eq $client )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich das Mobilgerät so überwachen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define iPhone PRESENCE function {snmpCheck(&amp;quot;10.0.1.1&amp;quot;,&amp;quot;0x44d77429f35c&amp;quot;)} 30 30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
== Das GEOFANCY Modul ==&lt;br /&gt;
Das Modul ermöglicht über einen sogenannten Webhook Mechanismus (umgangssprachlich oft auch als &amp;quot;Push&amp;quot; benannt) das aktive Melden des aktuellen Standortes. Die iPhone Apps  [http://geofency.com/ Geofency] und [http://geofancy.com/ Geofancy] können dann aktiv und quasi in dem Moment, wo man den Wohnbereich betritt oder verlässt, benachrichtigen. Android Nutzern können [https://play.google.com/store/apps/details?id=de.egi.geofence.geozone&amp;amp;hl=de EgiGeoZone Geofence] nutzen. Das geht nochmals um einiges schneller, als die Erkennung im WLAN, bei der die Anwesenheit nur in (engen) Zyklen aktiv geprüft werden muss. Gleichzeitig werden Ressourcen in FHEM geschont. Die aktuelle Implementierung im iPhone 5S mit dediziert für das Tracking zuständigem Chip ist so gut, dass der Akku ebenfalls sehr geschont wird.&lt;br /&gt;
&lt;br /&gt;
=== Modul in FHEM einrichten ===&lt;br /&gt;
Das Modul ist mit einer einfachen Definition sofort betriebsbereit:&lt;br /&gt;
:&amp;lt;code&amp;gt;define geofancy GEOFANCY geo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit nimmt FHEM unter &amp;lt;nowiki&amp;gt;http://192.168.178.1:8083/fhem/geo&amp;lt;/nowiki&amp;gt; entsprechende Meldungen des iPhones entgegen. Damit das nicht nur über das lokale WLAN funktioniert, bedarf es allerdings noch einiger zusätzlicher Maßnahmen. FHEM muss vom Internet erreichbar gemacht werden, dabei sollte unbedingt an die Absicherung des Zugriffs gedacht werden.&lt;br /&gt;
&lt;br /&gt;
Zunächst einmal habe ich bei mir eine eigene FHEMWEB Instanz dafür angelegt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define WEBhook FHEMWEB 8088 global&lt;br /&gt;
attr WEBhook column Alarms: Apartment: Living: Bedroom: Kitchen: Sonos: Residents: Weather: Bathroom: Logs: Statistics: DashboardRoom: System: hidden: all:&lt;br /&gt;
attr WEBhook hiddenroom input,detail,save,Unsorted,Everything,CUL_HM,FS20,Commandref,style,Edit files,Select style,Logfile,Floorplans,Remote doc,FileLogs,Apartment,Bathroom,Bedroom,Kitchen,Living,Residents,System,Weather,Event monitor,NEW&lt;br /&gt;
attr WEBhook room hidden&lt;br /&gt;
attr WEBhook webname webhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist unter der URL &amp;lt;nowiki&amp;gt;http://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; das GEOFANCY Modul erreichbar. Ich verstecke in dieser Ansicht noch alle Räume, die ich so habe. Wer die Raumnamen allerdings kennt, kann sie trotzdem aufrufen. Die Anzeige in den Räumen kann man mit dem Attribut column und entsprechend leeren Definitionen verstecken. Nun muss man explizit den Devicenamen kennen, um noch etwas über die Konfiguration in Erfahrung bringen zu können.&lt;br /&gt;
Auch wenn das Security-by-Obscurity ist - ich fühle mich wohler damit.&lt;br /&gt;
&lt;br /&gt;
=== Webhook weiter absichern ===&lt;br /&gt;
Mit Hilfe eines allowed-Devices lässt sich die FHEMWEB Instanz noch weiter absichern indem nur die tatsächlich benötigten Kommandos erlaubt werden (in diesem Fall keine) und damit alle anderen nicht erlaubten (attr,define,get,set,...) automatisch nicht mehr zur Verfügung stehen: &lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
define allowedWEBhook allowed&lt;br /&gt;
attr allowedWEBhook allowedCommands ,&lt;br /&gt;
attr allowedWEBhook allowedDevices ,&lt;br /&gt;
attr allowedWEBhook validFor WEBhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem ist dringend zu empfehlen, den Zugriff über TLS/SSL und HTTP Basic-Authentication weiter abzusichern. Läuft FHEM auf einem Raspberry&amp;amp;nbsp;Pi, dann empfehle ich dazu die Konfiguration eines ReverseProxy (vorzugsweise HAproxy, Pound oder Varnish, notfalls auch Nginx oder Apache); damit ist man am flexibelsten und kann auch alle FHEMWEB Instanzen direkt über einen einzigen Port (meist 443, der HTTPS Standard Port) zusammenfassen. Ich möchte hier allerdings beschreiben, wie weit man mit FHEM Bordmitteln kommt und nehme das Beispiel einer Installation auf einer Fritzbox.&lt;br /&gt;
&lt;br /&gt;
Wie TLS aktiviert wird, steht in der Commandref für [[FHEMWEB]]. Um die Kommandos auf der Fritzbox ausführen zu können, muss zuerst Telnet aktiviert werden (bitte Google benutzen). Anschließend wechselt man auf der Fritzbox ins Verzeichnis /var/media/ftp/fhem und kann dann den Hinweisen aus der [http://fhem.de/commandref.html#FHEMWEB Commandref] unter dem Punkt HTTPS folgen. Letztlich fehlt noch das entsprechende Attribut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr WEBhook HTTPS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes aktivieren wir Benutzername+Passwort für den Zugriff. Die commandref für [[allowed]] gibt auch hier unter dem Punkt basicAuth entsprechende Hinweise. Wir fügen hier einfach mal einen Benutzer &amp;quot;webhook&amp;quot; mit dem Passwort &amp;quot;Geofancy&amp;quot; hinzu, das sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr allowedWEBhook basicAuth { &amp;quot;$user:$password&amp;quot; eq &amp;quot;webhook:Geofancy&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zur Absicherung gibt auch [[FritzBox Webzugriff absichern]].&lt;br /&gt;
&lt;br /&gt;
Um zu testen, ob unsere Absicherung erfolgreich war, kann man die URL &amp;lt;nowiki&amp;gt;https://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; aufrufen (wichtig ist, dass man jetzt https und nicht mehr http eingibt; ansonsten bekommt man keine Antwort). Eine Zertifikatswarnung kann getrost ignoriert werden, verschlüsselt wird trotzdem. Es sollte auch eine Passwort Abfrage kommen und die Eingabe der entsprechenden Daten sollte dann zu einer entsprechenden Meldung vom GEOFANCY Modul führen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NOK No data received, see API information on http://wiki.geofancy.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist ok, schließlich sind wir keine App, sondern der Mensch, der nur mal eben prüfen will :-)&lt;br /&gt;
&lt;br /&gt;
=== Zugriff vom Internet ermöglichen ===&lt;br /&gt;
Das ist je nach Fritzbox und Software Version unterschiedlich. Grundsätzlich gilt: Eine Weiterleitung des ports 8088 vom Internet auf das laufende FHEM auf Port 8088 intern ist von AVM so nicht vorgesehen.&lt;br /&gt;
Bei mir führte folgendes zum Erfolg:&lt;br /&gt;
&lt;br /&gt;
* Einloggen per Telnet auf der Fritzbox (ich habe FritzOS 6 installiert)&lt;br /&gt;
* Konfiguration editieren mittels &amp;quot;nvi /var/flash/ar7.cfg&amp;quot;&lt;br /&gt;
* Suchen nach richtiger Zeile durch Eingabe von &amp;quot;/internet_forwardrules&amp;quot; und Enter&lt;br /&gt;
* Hinzufügen einer weiteren Zeile (Vorsicht, die bestehende Zeile endet mit ; und das muss in , umgeändert werden, so dass das ; schließlich am Ende der Zeile steht.&lt;br /&gt;
&lt;br /&gt;
So sieht es bei mir vorher aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
Hinterher:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;, &amp;quot;tcp 0.0.0.0:8088 0.0.0.0:8088 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach mittels &amp;quot;:x&amp;quot; abspeichern und sofort per &amp;quot;reboot&amp;quot; die Box neu starten, um diese Änderungen zu aktivieren. Das ist wichtig; ansonsten zeigt die Erfahrung, dass die Änderung nicht dauerhaft erhalten bleibt und die gerade gemachten Änderungen verloren gehen.&lt;br /&gt;
&lt;br /&gt;
Wer die Einstellungen zu &amp;quot;internet_forwardrules&amp;quot; bei sich nicht finden kann, hat womöglich eine andere Version als ich oder ein leicht anderes Gerät und bemüht am besten Google, was er tun kann, um das Gleiche zu erreichen. Möglicherweise tauchen die Einträge auch erst auf, wenn man mal über das Webinterface ein Forwarding eingerichtet hatte.&lt;br /&gt;
&lt;br /&gt;
Hat man einen DynDNS Dienst oder myFritz auf der Fritzbox aktiviert, so kann man jetzt auch von draußen auf den Webhook zugreifen. Das kann man prüfen, indem man das iPhone aus dem WLAN ausbucht und einmal die externe Adresse eingibt, also z.B. https://meindyndns.org:8088/webhook/geo.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Alternativen für den Zugriff aus dem Internet ===&lt;br /&gt;
Als Alternative zum Port Forwarding kann man sich auch per VPN in das lokale Netzwerk einwählen. iOS bietet dazu auch eine automatische Aktivierung des VPN (VPN on Demand), wie z.B. [http://forum.loxone.com/dede/netzwerk-firewall-and-security/8121-vpn-demand-ios-8-1-1-fritz-box-kleine-how.html hier] beschrieben wird.&lt;br /&gt;
&lt;br /&gt;
Auch eine Alternative ist, das Portforwarding nicht direkt an FHEM einzurichten, sondern an einem im Netzwerk laufenden Reverse-Proxy, der dann seinerseits die Anfragen an FHEM weiterleitet. Dies kann z.B. Apache, Nginx oder am besten HAproxy sein.&lt;br /&gt;
Letzterer ist dabei sehr flexibel, allerdings nicht unbedingt einfach zu konfigurieren. Ein paar Inspirationen diesbezüglich gibt es z.B. [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/stat/etc/haproxy hier] und [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/dyn/etc/haproxy hier]. Wer pfSense nutzt, findet [http://loredo.me/post/116633549315/geeking-out-with-haproxy-on-pfsense-the-ultimate diesen Artikel] womöglich auch interessant. Er zeigt auch, dass mit HAproxy noch weit mehr möglich ist.&lt;br /&gt;
Der Reverse-Proxy sollte dabei auch unbedingt der TLS Termination Point sein (TLS Offloading). Nicht nur spart man sich dann die Aktivierung von TLS in FHEM, sondern man hat auch mehr Einfluss darauf, wie TLS arbeitet (z.B. Deaktivierung von SSLv3, forcieren von TLSv1.2, nur als sicher eingestufte Cipher Suite... siehe auch Infos auf der [https://wiki.mozilla.org/Security/Server_Side_TLS Mozilla Website]).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten in der Geof[e|a]ncy.app ===&lt;br /&gt;
Hat das alles soweit geklappt, können endlich in der Geofency.app bzw. Geofancy.app am iPhone die gewünschten Bereiche definiert werden. Am Besten zuvor in den Global Settings die folgenden Einstellungen hinterlegen:&lt;br /&gt;
&lt;br /&gt;
* URL: https://meindyndns.org:8088/webhook/geo&lt;br /&gt;
* POST (oder GET, ist egal - das FHEM Modul kann beides)&lt;br /&gt;
* HTTP Basic Authentication: EIN (entsprechend Username und Password eintragen)&lt;br /&gt;
&lt;br /&gt;
Anfänglich ist es empfehlenswert noch &amp;quot;Notification on success&amp;quot; und &amp;quot;Notification on Failure&amp;quot; einzuschalten. Ersteres kann man ausmachen wenn man weiß, dass es soweit funktioniert. Über &amp;quot;Send Test-Request&amp;quot; kann man einmal einen Test schicken und erhält das Ergebnis entsprechend dargestellt. Es sollte sowas kommen wie&lt;br /&gt;
:&amp;lt;code&amp;gt;POST Success: test OK&amp;lt;/code&amp;gt;. In Geofancy.app gibt es keine Rückmeldung über den Erfolg des Testrequests. In FHEM sollten sich durch den Testrequest jedoch die Readings sofort aktualisieren (Ggf. ist ein Reload der FHEMWEB-Seite nötig da zusätzliche Tabellenzeilen nicht via Longpoll ergänzt werden). &lt;br /&gt;
&lt;br /&gt;
Funktioniert das soweit, kann man eine neue Lokation als sein Zuhause anlegen. Es empfiehlt sich einen ID-Namen zu setzen; dieser ist dann in FHEM als Name für die Lokation sichtbar. Für die eigene Wohnung empfiehlt sich hier &amp;quot;home&amp;quot; (da dies auch direkt vom RESIDENTS Modul so verwendet werden kann). Man kann auch Trigger für andere Standorte anlegen. FHEM weiß dann sogar, wenn ihr im Büro seid und könnte sich dabei auch unterschiedlich verhalten, als wenn ihr &amp;quot;auf Achse&amp;quot; seid. Bei letzterem ist der Status im GEOFANCY Modul &amp;quot;underway&amp;quot;, was so viel heißt wie &amp;quot;unbekannter Aufenthaltsort&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Zumindest für Geofancy.app liefert ein Testrequest wohl zufällige Locations zurück. Die eigenen Location-IDs werden also nicht übergeben, selbst wenn man sich in einem Geofence befindet. Um zu testen muss man sich wohl oder übel selbst bewegen ;-).&lt;br /&gt;
&lt;br /&gt;
=== GEOFANCY Modul individualisieren ===&lt;br /&gt;
Die im GEOFANCY Modul dargestellten Readings sind nun in etwa so, wenn ihr euch bewegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      -&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:51F23894-AAAA-BBBB-CCCC-0123456789AB trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer genauer hinschaut sieht: Mein iPhone heißt wohl 51F23894-AAAA-BBBB-CCCC-0123456789AB.&lt;br /&gt;
Damit nun die Readings für mein iPhone richtig angelegt werden, muss ein Device Alias gesetzt werden. Sinnvoll erscheint mir der Vorname des Besitzers:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr geofancy devAlias 51F23894-AAAA-BBBB-CCCC-0123456789AB:Julian&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Alias-Namen können mit Leerzeichen einfach angehängt werden.&lt;br /&gt;
Jetzt werden weitere Readings angelegt, sobald GEOFANCY entsprechende Daten vom Mobilgerät empfängt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   Julian          arrived home&lt;br /&gt;
     2014-01-18 14:37:42   currLocLat_Julian 48.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocLong_Julian 11.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocTime_Julian 2014-01-18 14:37:42&lt;br /&gt;
     2014-01-18 14:37:42   currLoc_Julian  home&lt;br /&gt;
     2014-01-17 19:18:23   lastArr         Julian home&lt;br /&gt;
     2014-01-17 18:41:46   lastDep         Julian Office&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      Julian&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-17 18:41:46   lastLocArr_Julian 2014-01-17 08:58:37&lt;br /&gt;
     2014-01-17 18:41:46   lastLocDep_Julian 2014-01-17 18:41:46&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLat_Julian 48.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLong_Julian 11.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLoc_Julian  Office&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:Julian trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man nun etwas bestimmtes tun, wenn man nach Hause kommt oder das Heim verlässt, kann man am Besten ein entsprechendes Notify auf das Reading currLoc_Name setzen. Ich aktualisiere lediglich zwei Dummies, durch die dann alle weiteren Notifies ausgelöst werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define n_Julian.Presence notify geofancy:currLoc_Julian:.home set Julian.homestatus:FILTER=STATE!=home home&lt;br /&gt;
attr n_Julian.Presence room Residents&lt;br /&gt;
define n_Julian.absence notify geofancy:currLoc_Julian:.underway {\&lt;br /&gt;
if (Value(&amp;quot;Julian.homestatus&amp;quot;) ne &amp;quot;gone&amp;quot;) {\&lt;br /&gt;
  fhem(&amp;quot;set Julian.homestatus:FILTER=STATE!=absent absent&amp;quot;);;\&lt;br /&gt;
}\&lt;br /&gt;
}&lt;br /&gt;
define n_Julian.whereabout notify geofancy:currLoc_Julian:.* set Julian.whereabout:FILTER=STATE!=$EVTPART1 $EVTPART1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer es noch einfacher möchte (bzw. auch noch mehr Features) schaut sich einmal die neue Modulfamilie aus RESIDENTS[http://fhem.de/commandref_DE.html#RESIDENTS], ROOMMATE[http://fhem.de/commandref_DE.html#ROOMMATE] und GUEST[http://fhem.de/commandref_DE.html#GUEST] an. Diese sind direkt auf GEOFANCY abgestimmt. Dabei kann das devAlias Attribut entfallen und man hinterlegt die UUID stattdessen direkt im ROOMMATE oder GUEST Device (Attribut r*_geofenceUUIDs). Das erspart es für jeden Bewohner und jedes Device zig unterschiedliche Devices der Typen Notify, DOIF oder Watchdog anlegen und pflegen zu müssen.&lt;br /&gt;
&lt;br /&gt;
Wer mehr Kontrolle möchte kann natürlich bei notify, DOIF und Co. bleiben: &amp;lt;code&amp;gt;define n_rr_Julian.location notify geofancy:currLoc_Julian:.* set rr_Julian:FILTER=location!=$EVTPART1 location $EVTPART1&amp;lt;/code&amp;gt;. Wobei &amp;quot;Julian&amp;quot; dabei als devAlias in GEOFANCY eingtragen wurde, rr_Julian der Name des ROOMMATE aus RESIDENTS ist. Außerdem sind die Location-IDs in der Geofency.app bzw. Geofancy.app so gewählt wurde, dass diese direkt einem ROOMMATE-Status entsprechen (also z.B. home, wayhome...).&lt;br /&gt;
&lt;br /&gt;
== Beispiele für die Nutzung der Anwesenheitserkennung ==&lt;br /&gt;
Hier sollen Beispiele für den Nutzen von Anwesenheitserkennung aufgezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Abschalten aller Verbraucher (Licht, Musikanlage) beim Verlassen der Wohnung ===&lt;br /&gt;
Typisches Szenario: Man geht ausser Haus, aber hat vergessen im Bad das Licht aus zu machen. Allerdings geht man heutzutage fast garnicht mehr ohne Handy aus dem Haus.&lt;br /&gt;
&lt;br /&gt;
Nun soll FHEM in der gesamten Wohnung das Licht, sowie sonstige Verbraucher ausschalten, wenn ich länger als 15 Minuten ausser Haus bin. Dazu benötigt man zuerst eine structure, die alle Verbraucher und sonstigen Devices, die das betrifft, zusammenfasst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Gesamte_Wohnung structure Gesamtes_Licht Licht_Wohnzimmer Licht_Kueche LED_Kueche Licht_Bad Licht_Schlafzimmer AV_Receiver TV_Steckdose&lt;br /&gt;
attr Gesamte_Wohnung room Wohnung&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mittels eines watchdogs eine Überwachung für sein Handy anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Überwachen der gesamten Wohnung mittels collectord sowie presenced in jedem Raum&lt;br /&gt;
define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&lt;br /&gt;
attr Handy event-on-change-reading state  # Ein Event soll nur bei der Änderung des Anwesenheitsstatus (Reading: status) erfolgen. Wichtig für den watchdog!!!&lt;br /&gt;
&lt;br /&gt;
# Nach 15 Minuten Abwesenheit (Handy im Status &amp;quot;absent&amp;quot;) soll die gesamte Wohnung ausgeschaltet werden.&lt;br /&gt;
define watchdog_Anwesenheit watchdog Handy:absent 00:15 Handy:present set Gesamte_Wohnung off ; setstate watchdog_Anwesenheit defined&lt;br /&gt;
attr watchdog_Anwesenheit regexp1WontReactivate 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>Loredo</name></author>
	</entry>
</feed>