<?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=Zephyr</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=Zephyr"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Zephyr"/>
	<updated>2026-04-10T00:48:03Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Z-Wave_Command_Classes&amp;diff=22071</id>
		<title>Z-Wave Command Classes</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Z-Wave_Command_Classes&amp;diff=22071"/>
		<updated>2017-08-07T06:49:16Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: DOOR_LOCK_LOGGING ist inzwischen unterstützt durch Beitrag durch Nutzer Zephyr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Randnotiz|RNTyp=Info|RNText=Dieser Artikel wurde vor Veröffentlichung der [http://z-wave.sigmadesigns.com/design-z-wave/z-wave-public-specification/ Z-Wave Public Specification] am 31.08.2016 erstellt. Die Informationen zu den Command Classes waren bis zu diesem Zeitpunkt nicht offengelegt, die Versionen/Namen der Klassen wurden anhand der nun verfügbaren Dokumentation angepasst (03-09.2016)}}&lt;br /&gt;
[[Z-Wave Command Classes]] sind Klassen von Befehlen oder Protokollen, die zur Kommunikation und Steuerung der Z-Wave-Geräte dienen.&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite werden einige Grundlagen zu diesen Command Classes von Z-Wave, sowie deren Implementierung in FHEM beschrieben. Allgemeine Grundlagen zu Z-Wave finden sich im [[Z-Wave|Z-Wave Hauptartikel]].&lt;br /&gt;
&lt;br /&gt;
== Command Classes ==&lt;br /&gt;
=== Einleitung ===&lt;br /&gt;
Entstanden ist dieser Artikel da die Dokumentation der Z-Wave Command Classes zum damaligen Zeitpunkt leider (noch) nicht offengelegt waren, wodurch die verfügbaren Informationen teilweise veraltet, unvollständig oder auch falsch waren. Am 31.08.2016 hat Sigma Designs die Dokumentationen der ZWave Command Classes freigegeben (siehe: [http://z-wave.sigmadesigns.com/design-z-wave/z-wave-public-specification/ Z-Wave Public Specification]). Die Informationen auf dieser Seite wurden nach Erscheinen dieser offiziellen Dokumente angepasst, dieser Artikel erhebt dennoch keinen Anspruch auf Vollständigkeit, Aktualität oder Richtigkeit. Er soll vielmehr dazu dienen, die bekannten Command Classes aufzulisten, sowie einen Hinweis auf deren Unterstützung in FHEM zu geben.&lt;br /&gt;
&lt;br /&gt;
=== Allgemeines ===&lt;br /&gt;
Die Kommunikation zwischen den Z-Wave Nodes erfolgt über festgelegte Protokolle, welche jeweils in den Command Classes festgelegt sind. Für jede Gerätefunktion gibt es eine Command Class, ein Gerät hat jedoch im Allgemeinen mehrere Funktionen und damit auch mehrere Command Classes.&lt;br /&gt;
&lt;br /&gt;
Wie im Z-Wave Basisartikel beschrieben, ist die minimale Anforderung an ein Geräte die Unterstützung der Command Class &amp;quot;CLASS_BASIC&amp;quot;. Diese &amp;quot;BASIC&amp;quot; Klasse wird von den Geräten nicht explizit in der Liste Ihrer unterstützten Klassen aufgeführt, laut Spezifikation soll jedes Gerät diese Klasse unterstützen bzw. mit Nachrichten dieser Klasse umgehen können.&lt;br /&gt;
&lt;br /&gt;
Eine schaltbare Zwischensteckdose unterstützt z.B. die folgenden Command Classes:&lt;br /&gt;
SWITCH_BINARY VERSION METER MANUFACTURER_SPECIFIC CONFIGURATION ASSOCIATION PROTECTION POWERLEVEL SENSOR_MULTILEVEL SWITCH_ALL&lt;br /&gt;
&lt;br /&gt;
Dies ist jedoch von Hersteller zu Hersteller verschieden, in diesem Beispiel ist die Klasse &amp;quot;METER&amp;quot; z.B. für das Auslesen der Leistung zuständig, d.h. dieser Zwischenstecker kann z.B. auch die Leistung messen. Andere Steckdosenschalter ohne diese Funktion würden diese Klasse dementsprechend auch nicht unterstützen.&lt;br /&gt;
&lt;br /&gt;
Aktuell sind weit mehr als 100 solcher Klassen definiert, hinzu kommt, dass diese Klassen in verschiedenen Versionen existieren. Die ständige Weiterentwicklung der Gerätefunktionen erfordert teilweise eine Erweiterung der jeweils betroffenen Command Classes, was sich in einer geänderten Definition der verwendeten Protokolle auswirkt. Im allgemeinen wird hier eine Abwärtskompatibilität eingehalten, sodass die Funktionen bis zu der unterstützten Version auch von Geräten mit höheren Versionen genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
Den Command Classes ist jeweils eine eindeutige ID zugeordnet. Diese ID wird in der Kommunikation dazu genutzt die jeweilige Geräteklasse anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Der COMMAND_CLASS_METER ist beispielsweise die ID 0x32 (hexadezimal) bzw. 50 (dezimal) zugeordnet. Um die unterstützte Version einer Klasse abzufragen wird die COMMAND_CLASS_VERSION genutzt. In FHEM wird die Version der Klasse des Gerätes durch den Befehl:&lt;br /&gt;
&lt;br /&gt;
 get &amp;lt;devicename&amp;gt; versionClass &amp;lt;ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
abgefragt, die &amp;lt;ID&amp;gt; ist hier dezimal anzugeben. Als Ausgabe wird von FHEM dann z.B.:&lt;br /&gt;
&lt;br /&gt;
 versionClass_50:2&lt;br /&gt;
&lt;br /&gt;
erzeugt und es wird ein gleichnamiges Reading für das Gerät angelegt. In diesem Fall also die Version 2, meist nur als V2 angegeben.&lt;br /&gt;
&lt;br /&gt;
Um herauszufinden, ob ein Gerät prinzipiell von FHEM unterstützt wird, werden daher die Informationen zu den Command Classes bzw. deren Versionen benötigt:&lt;br /&gt;
* Liste der vom Gerät unterstützten Command Classes&lt;br /&gt;
** Informationen zu den Versionen der Command Class&lt;br /&gt;
* Liste der von FHEM unterstützten Command Classes&lt;br /&gt;
** Informationen zu den von FHEM unterstützten Versionen der Command Class&lt;br /&gt;
&lt;br /&gt;
(Grundlegende) Informationen zu den ersten beiden Punkten finden sich relativ häufig bereits in der Anleitung der Geräte, evtl. hilft auch eine Suche im Internet mit der Gerätebezeichnung und dem Stichwort &amp;quot;COMMAND CLASS&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Für die letzten beiden Punkte soll dieser Artikel die nötigen Informationen bereitstellen, bzw. eine Abschätzung liefern ob das Gerät unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
Sollte zumindest die Liste der Command Classes des Gerätes in FHEM als unterstützt gekennzeichnet sein, so wird das Gerät höchstwahrscheinlich unterstützt werden, eine Garantie ist es jedoch noch nicht. Falls die Versionen der Command Classes unterschiedlich ist, so wird eventuell nur ein begrenzter Funktionsumfang dieser Klasse nutzbar sein. Es ist jedoch auch möglich das ein Gerät zwar eine höhere Version einer Command Class unterstützt, trotzdem aber selbst keine dieser neuen Funktion nutzt. Genausogut können in der höheren Version Funktionen definiert sein, die für den Betrieb des Gerätes nicht zwingend nötig sind.&lt;br /&gt;
&lt;br /&gt;
Fehlt die Unterstützung für eine Klasse jedoch ganz, kann dies für die Funktion des Geräte von entscheidender Bedeutung sein und die Nutzung unter FHEM dadurch aktuell nicht möglich sein.&lt;br /&gt;
&lt;br /&gt;
In FHEM sind die für die Hausautomatisierung wichtigsten Klassen bereits soweit implementiert, wie es für den Betrieb der meisten Geräte nötig ist. Sollten Geräte mit neuen Funktionen &amp;quot;auftauchen&amp;quot;, so kann entweder anhand vorhandener Informationen zu den jeweiligen Command Classes oder aber durch &amp;quot;Trial and Error&amp;quot; versucht werden diese Funktion zu implementieren. &lt;br /&gt;
&lt;br /&gt;
Als Beispiel sei hier die Implementation der Command Class USER_CODE (0x63) genannt, die für den Betrieb eines RFID Keypads nötig war, da über diese Klasse die Verwaltung der RFID-Tags und Eingabecodes stattfinden. Das Gerät ist [[Z-Wave-ZIP WT-RFID Keypad|hier]] beschrieben, die Diskussion im Forum mit der Implementierung kann ({{Link2Forum&lt;br /&gt;
|Topic=36856&lt;br /&gt;
|Message=291216&lt;br /&gt;
|LinkText=hier&lt;br /&gt;
}}) nachgelesen werden.&lt;br /&gt;
&lt;br /&gt;
Im Zweifel sollte man im Vorfeld versuchen, so viele Informationen wie möglich zusammenzutragen und sich dann mit einer entsprechenden Frage im Forum von FHEM zu melden.&lt;br /&gt;
&lt;br /&gt;
=== Liste von bekannten Command Classes und deren Unterstützung in FHEM ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Commande Class Name !! ID (hex) !! ID (dezimal) !! class=&amp;quot;unsortable&amp;quot; | höchste Version !! class=&amp;quot;unsortable&amp;quot; | unterstützte &amp;lt;br&amp;gt;Version(en) !! class=&amp;quot;unsortable&amp;quot; | Kommentar&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| NO_OPERATION&lt;br /&gt;
| 0x00 &lt;br /&gt;
| 0 &lt;br /&gt;
| V1&lt;br /&gt;
| nein - für Gerätefunktion nicht relevant&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ZWAVE_CMD_CLASS&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| LowLevel-Funktionen, die von http://fhem.de/commandref.html#ZWCUL teilweise unterstützt werden&lt;br /&gt;
|-&lt;br /&gt;
| BASIC&lt;br /&gt;
| 0x20&lt;br /&gt;
| 32&lt;br /&gt;
| V2&lt;br /&gt;
| V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CONTROLLER_REPLICATION&lt;br /&gt;
| 0x21&lt;br /&gt;
| 33&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| APPLICATION_STATUS&lt;br /&gt;
| 0x22&lt;br /&gt;
| 34&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ZIP_SERVICES&lt;br /&gt;
| 0x23&lt;br /&gt;
| 35&lt;br /&gt;
| V2&lt;br /&gt;
| nein&lt;br /&gt;
| Z-Wave for IP&lt;br /&gt;
|-&lt;br /&gt;
| ZIP_SERVER&lt;br /&gt;
| 0x24&lt;br /&gt;
| 36&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten (SECURITY_PANEL_MODE ?)&lt;br /&gt;
|-&lt;br /&gt;
| SECURITY_PANEL_MODE&lt;br /&gt;
| 0x24&lt;br /&gt;
| 36&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten (ZIP_SERVER ?)&lt;br /&gt;
|-&lt;br /&gt;
| SWITCH_BINARY&lt;br /&gt;
| 0x25&lt;br /&gt;
| 37&lt;br /&gt;
| V2&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SWITCH_MULTILEVEL&lt;br /&gt;
| 0x26&lt;br /&gt;
| 38&lt;br /&gt;
| V4&lt;br /&gt;
| V1&lt;br /&gt;
| set-Befehl für StartLevelChange (0x04) nicht implementiert&lt;br /&gt;
|-&lt;br /&gt;
| SWITCH_ALL&lt;br /&gt;
| 0x27&lt;br /&gt;
| 39&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SWITCH_TOGGLE_BINARY&lt;br /&gt;
| 0x28&lt;br /&gt;
| 40&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| COMMAND_CLASS_SWITCH_TOGGLE_BINARY [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| SWITCH_TOGGLE_MULTILEVEL&lt;br /&gt;
| 0x29&lt;br /&gt;
| 41&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| CHIMNEY_FAN&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 42&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| SCENE_ACTIVATION&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 43&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SCENE_ACTUATOR_CONF&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 44&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SCENE_CONTROLLER_CONF&lt;br /&gt;
| 0x2D&lt;br /&gt;
| 45&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ZIP_CLIENT&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 46&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten (SECURITY_PANELZONE ?)&lt;br /&gt;
|-&lt;br /&gt;
| ZIP_ADV_SERVICES&lt;br /&gt;
| 0x2F&lt;br /&gt;
| 47&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten (Z/IP Tunneling Services)&amp;lt;br&amp;gt;(SECURITY_PANELZONE_SENSOR ?)&lt;br /&gt;
|-&lt;br /&gt;
| SECURITY_PANELZONE_SENSOR&lt;br /&gt;
| 0x2F&lt;br /&gt;
| 47&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten (ZIP_ADV_SERVICES ?)&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_BINARY&lt;br /&gt;
| 0x30&lt;br /&gt;
| 48&lt;br /&gt;
| V2&lt;br /&gt;
| V1, V2&lt;br /&gt;
| SENSOR_BINARY [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_MULTILEVEL&lt;br /&gt;
| 0x31&lt;br /&gt;
| 49&lt;br /&gt;
| V10&lt;br /&gt;
| unterstützt,&amp;lt;br&amp;gt;Version noch nicht geklärt&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| METER&lt;br /&gt;
| 0x32&lt;br /&gt;
| 50&lt;br /&gt;
| V4&lt;br /&gt;
| V1, V2, (V3)&lt;br /&gt;
| V3 evtl. nicht vollständig&lt;br /&gt;
|-&lt;br /&gt;
| ZIP_ADV_SERVER&lt;br /&gt;
| 0x33&lt;br /&gt;
| 51&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Class wurde durch Class COLOR_CONTROL ersetzt&lt;br /&gt;
|-&lt;br /&gt;
| SWITCH_COLOR (COLOR_CONTROL)&lt;br /&gt;
| 0x33&lt;br /&gt;
| 51&lt;br /&gt;
| V3&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_MANAGEMENT_INCLUSION&lt;br /&gt;
| 0x34&lt;br /&gt;
| 52&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| METER_PULSE&lt;br /&gt;
| 0x35&lt;br /&gt;
| 53&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| METER_PULSE [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| BASIC_TARIFF_INFO&lt;br /&gt;
| 0x36&lt;br /&gt;
| 54&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HRV_STATUS&lt;br /&gt;
| 0x37&lt;br /&gt;
| 55&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| THERMOSTAT_HEATING&lt;br /&gt;
| 0x38&lt;br /&gt;
| 56&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| HRV_CONTROL&lt;br /&gt;
| 0x39&lt;br /&gt;
| 57&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DCP_CONFIG&lt;br /&gt;
| 0x3a&lt;br /&gt;
| 58&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DCP_MONITOR&lt;br /&gt;
| 0x3b&lt;br /&gt;
| 59&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| METER_TBL_CONFIG&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 60&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| METER_TBL_MONITOR&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 61&lt;br /&gt;
| V2&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| METER_TBL_PUSH&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 62&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PREPAYMENT&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 63&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| THERMOSTAT_MODE&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| V3&lt;br /&gt;
| unterstützt,&amp;lt;br&amp;gt;Version noch nicht geklärt&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PREPAYMENT_ENCAPSULATION&lt;br /&gt;
| 0x41&lt;br /&gt;
| 67&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| THERMOSTAT_OPERATING_STATE&lt;br /&gt;
| 0x42&lt;br /&gt;
| 66&lt;br /&gt;
| V2&lt;br /&gt;
| V2&lt;br /&gt;
| V2 ohne Logging-Commands&lt;br /&gt;
|-&lt;br /&gt;
| THERMOSTAT_SETPOINT&lt;br /&gt;
| 0x43&lt;br /&gt;
| 67&lt;br /&gt;
| V3&lt;br /&gt;
| unterstützt,&amp;lt;br&amp;gt;Version noch nicht geklärt&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| THERMOSTAT_FAN_MODE&lt;br /&gt;
| 0x44&lt;br /&gt;
| 68&lt;br /&gt;
| V4&lt;br /&gt;
| V1, V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| THERMOSTAT_FAN_STATE&lt;br /&gt;
| 0x45&lt;br /&gt;
| 69&lt;br /&gt;
| V2&lt;br /&gt;
| V1, V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CLIMATE_CONTROL_SCHEDULE&lt;br /&gt;
| 0x46&lt;br /&gt;
| 70&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| CLIMATE_CONTROL_SCHEDULE [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| THERMOSTAT_SETBACK&lt;br /&gt;
| 0x47&lt;br /&gt;
| 71&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RATE_TBL_CONFIG&lt;br /&gt;
| 0x48&lt;br /&gt;
| 72&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RATE_TBL_MONITOR&lt;br /&gt;
| 0x49&lt;br /&gt;
| 73&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TARIFF_CONFIG&lt;br /&gt;
| 0x4a&lt;br /&gt;
| 74&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TARIFF_TBL_MONITOR&lt;br /&gt;
| 0x4b&lt;br /&gt;
| 75&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DOOR_LOCK_LOGGING&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 76&lt;br /&gt;
| V1&lt;br /&gt;
| ja&lt;br /&gt;
| DOOR_LOCK_LOGGING [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_MANAGEMENT_BASIC&lt;br /&gt;
| 0x4d&lt;br /&gt;
| 77&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SCHEDULE_ENTRY_LOCK&lt;br /&gt;
| 0x4E&lt;br /&gt;
| 78&lt;br /&gt;
| V3&lt;br /&gt;
| V1, V2, V3&lt;br /&gt;
| SCHEDULE_ENTRY_LOCK [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| ZI_6LOWPAN&lt;br /&gt;
| 0x4F&lt;br /&gt;
| 79&lt;br /&gt;
| V8&lt;br /&gt;
| nein&lt;br /&gt;
| ZIP_6LOWPAN (ITU-T G.9959 / IETF RFC 7428)&lt;br /&gt;
|-&lt;br /&gt;
| BASIC_WINDOW_COVERING&lt;br /&gt;
| 0x50&lt;br /&gt;
| 80&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| BASIC_WINDOW_COVERING [OBSOLETED]&lt;br /&gt;
|-&lt;br /&gt;
| MTP_WINDOW_COVERING&lt;br /&gt;
| 0x51&lt;br /&gt;
| 81&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| MTP_WINDOW_COVERING [OBSOLETED] (MTP=Move to position)&lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_MANAGEMENT_PROXY&lt;br /&gt;
| 0x52&lt;br /&gt;
| 82&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SCHEDULE (NETWORK_SCHEDULE)&lt;br /&gt;
| 0x53&lt;br /&gt;
| 83&lt;br /&gt;
| V3&lt;br /&gt;
| V1&lt;br /&gt;
| (Details für einige Paramenter unbekannt)&lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_MANAGEMENT_PRIMARY&lt;br /&gt;
| 0x54&lt;br /&gt;
| 84&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TRANSPORT_SERVICE&lt;br /&gt;
| 0x55&lt;br /&gt;
| 85&lt;br /&gt;
| V2&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CRC_16_ENCAP&lt;br /&gt;
| 0x56&lt;br /&gt;
| 86&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| APPLICATION_CAPABILITY&lt;br /&gt;
| 0x57&lt;br /&gt;
| 87&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ZIP_ND&lt;br /&gt;
| 0x58&lt;br /&gt;
| 88&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ASSOCIATION_GRP_INFO&lt;br /&gt;
| 0x59&lt;br /&gt;
| 89&lt;br /&gt;
| V3&lt;br /&gt;
| V1&lt;br /&gt;
| get-Abfrage &amp;quot;associationGroupInfo =&amp;gt; &amp;quot;03&amp;quot;&amp;quot; mit dem zugehörigen Report &amp;quot;..5904(.*)&amp;quot; fehlen, da Sinn unklar&lt;br /&gt;
|-&lt;br /&gt;
| DEVICE_RESET_LOCALLY&lt;br /&gt;
| 0x5a&lt;br /&gt;
| 90&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CENTRAL_SCENE&lt;br /&gt;
| 0x5b&lt;br /&gt;
| 91&lt;br /&gt;
| V3&lt;br /&gt;
| ?&lt;br /&gt;
| nur &amp;quot;parse&amp;quot; für set grundlegend implementiert&lt;br /&gt;
|-&lt;br /&gt;
| IP_ASSOCIATION&lt;br /&gt;
| 0x5c&lt;br /&gt;
| 92&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ANTITHEFT&lt;br /&gt;
| 0x5d&lt;br /&gt;
| 93&lt;br /&gt;
| V2&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ZWAVEPLUS_INFO&lt;br /&gt;
| 0x5e&lt;br /&gt;
| 94&lt;br /&gt;
| V2&lt;br /&gt;
| V1&lt;br /&gt;
| Neuerungen durch V2 unbekannt&lt;br /&gt;
|-&lt;br /&gt;
| ZIP_GATEWAY&lt;br /&gt;
| 0x5f&lt;br /&gt;
| 95&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MULTI_CHANNEL&lt;br /&gt;
| 0x60&lt;br /&gt;
| 96&lt;br /&gt;
| V4&lt;br /&gt;
| V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MULTI_INSTANCE&lt;br /&gt;
| 0x60&lt;br /&gt;
| 96&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| MULTI_INSTANCE wurde durch &amp;lt;br&amp;gt;MULTI_CHANNEL ersetzt&lt;br /&gt;
|-&lt;br /&gt;
| ZIP_PORTAL&lt;br /&gt;
| 0x61&lt;br /&gt;
| 97&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DOOR_LOCK&lt;br /&gt;
| 0x62&lt;br /&gt;
| 98&lt;br /&gt;
| V3&lt;br /&gt;
| V2&lt;br /&gt;
| (Details für einige Paramenter unbekannt)&lt;br /&gt;
|-&lt;br /&gt;
| USER_CODE&lt;br /&gt;
| 0x63&lt;br /&gt;
| 99&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HUMIDITY_CONTROL_SETPOINT (APPLIANCE)&lt;br /&gt;
| 0x64&lt;br /&gt;
| 100&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DMX&lt;br /&gt;
| 0x65&lt;br /&gt;
| 101&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| BARRIER_OPERATOR&lt;br /&gt;
| 0x66&lt;br /&gt;
| 102&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &amp;quot;unwichige&amp;quot; Commands über 0x03 fehlen derzeit noch&lt;br /&gt;
|-&lt;br /&gt;
| NETWORK_MANAGEMENT_INSTALLATION_MAINTENANCE&lt;br /&gt;
| 0x67&lt;br /&gt;
| 103&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| ZIP_NAMING&lt;br /&gt;
| 0x68&lt;br /&gt;
| 104&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MAILBOX&lt;br /&gt;
| 0x69&lt;br /&gt;
| 105&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| WINDOW_COVERING&lt;br /&gt;
| 0x6A&lt;br /&gt;
| 106&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| IRRIGATION&lt;br /&gt;
| 0x6B&lt;br /&gt;
| 107&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SUPERVISION&lt;br /&gt;
| 0x6C&lt;br /&gt;
| 108&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HUMIDITY_CONTROL_MODE&lt;br /&gt;
| 0x6D&lt;br /&gt;
| 109&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HUMIDITY_CONTROL_OPERATING_STATE&lt;br /&gt;
| 0x6E&lt;br /&gt;
| 110&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ENTRY_CONTROL&lt;br /&gt;
| 0x6F&lt;br /&gt;
| 111&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CONFIGURATION&lt;br /&gt;
| 0x70&lt;br /&gt;
| 112&lt;br /&gt;
| V4&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ALARM&lt;br /&gt;
| 0x71&lt;br /&gt;
| 113&lt;br /&gt;
| V8&lt;br /&gt;
| V1, V2, V3, V4&lt;br /&gt;
| ab V3 umbenannt in NOTIFICATION, wird weiterhin als ALARM angezeigt, siehe Bemerkungen.&lt;br /&gt;
|-&lt;br /&gt;
| MANUFACTURER_SPECIFIC&lt;br /&gt;
| 0x72&lt;br /&gt;
| 114&lt;br /&gt;
| V2&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| POWERLEVEL&lt;br /&gt;
| 0x73&lt;br /&gt;
| 115&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| unbekannt&lt;br /&gt;
| 0x74&lt;br /&gt;
| 116&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PROTECTION&lt;br /&gt;
| 0x75&lt;br /&gt;
| 117&lt;br /&gt;
| V2&lt;br /&gt;
| V1, V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| LOCK&lt;br /&gt;
| 0x76&lt;br /&gt;
| 118&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| NODE_NAMING&lt;br /&gt;
| 0x77&lt;br /&gt;
| 119&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| unbekannt&lt;br /&gt;
| 0x78&lt;br /&gt;
| 120&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| unbekannt&lt;br /&gt;
| 0x79&lt;br /&gt;
| 121&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| FIRMWARE_UPDATE_MD&lt;br /&gt;
| 0x7A&lt;br /&gt;
| 122&lt;br /&gt;
| V5&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| GROUPING_NAME&lt;br /&gt;
| 0x7B&lt;br /&gt;
| 123&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| GROUPING_NAME [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_ASSOCIATION_ACTIVATE&lt;br /&gt;
| 0x7C&lt;br /&gt;
| 124&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| REMOTE_ASSOCIATION_ACTIVATE [OBSOLETED]&lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_ASSOCIATION&lt;br /&gt;
| 0x7D&lt;br /&gt;
| 125&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| REMOTE_ASSOCIATION [OBSOLETED]&lt;br /&gt;
|-&lt;br /&gt;
| unbekannt&lt;br /&gt;
| 0x7E&lt;br /&gt;
| 126&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| unbekannt&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 127&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BATTERY&lt;br /&gt;
| 0x80&lt;br /&gt;
| 128&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CLOCK&lt;br /&gt;
| 0x81&lt;br /&gt;
| 129&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HAIL&lt;br /&gt;
| 0x82&lt;br /&gt;
| 130&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| HAIL [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| unbekannt&lt;br /&gt;
| 0x83&lt;br /&gt;
| 131&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| WAKE_UP&lt;br /&gt;
| 0x84&lt;br /&gt;
| 132&lt;br /&gt;
| V2&lt;br /&gt;
| V1, V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ASSOCIATION&lt;br /&gt;
| 0x85&lt;br /&gt;
| 133&lt;br /&gt;
| V2&lt;br /&gt;
| V1, V2 bei ASSOCIATION_REMOVE&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| VERSION&lt;br /&gt;
| 0x86&lt;br /&gt;
| 134&lt;br /&gt;
| V2&lt;br /&gt;
| V1, V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| INDICATOR&lt;br /&gt;
| 0x87&lt;br /&gt;
| 135&lt;br /&gt;
| V2&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PROPRIETARY&lt;br /&gt;
| 0x88&lt;br /&gt;
| 136&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| PROPRIETARY [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| LANGUAGE&lt;br /&gt;
| 0x89&lt;br /&gt;
| 137&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TIME&lt;br /&gt;
| 0x8A&lt;br /&gt;
| 138&lt;br /&gt;
| V2&lt;br /&gt;
| V2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TIME_PARAMETERS&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 139&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| GEOGRAPHIC_LOCATION&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 140&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| COMPOSITE&lt;br /&gt;
| 0x8D&lt;br /&gt;
| 141&lt;br /&gt;
| V?&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| MULTI_CHANNEL_ASSOCIATION&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 142&lt;br /&gt;
| V3&lt;br /&gt;
| unterstützt,&amp;lt;br&amp;gt;Version noch nicht geklärt&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MULTI_INSTANCE_ASSOCIATION&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 142&lt;br /&gt;
| V1&lt;br /&gt;
| unterstützt,&amp;lt;br&amp;gt;Version noch nicht geklärt&lt;br /&gt;
| MULTI_INSTANCE wurde durch&amp;lt;br&amp;gt;MULTI_CHANNEL ersetzt&lt;br /&gt;
|-&lt;br /&gt;
| MULTI_COMMAND (MULTI_CMD)&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 143&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ENERGY_PRODUCTION&lt;br /&gt;
| 0x90&lt;br /&gt;
| 144&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MANUFACTURER_PROPRIETARY&lt;br /&gt;
| 0x91&lt;br /&gt;
| 145&lt;br /&gt;
| V1&lt;br /&gt;
| für FIB_FGRM222 implementiert&lt;br /&gt;
| hersteller- und geräteabhängige Class&lt;br /&gt;
|-&lt;br /&gt;
| SCREEN_MD&lt;br /&gt;
| 0x92&lt;br /&gt;
| 146&lt;br /&gt;
| V2&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SCREEN_ATTRIBUTES&lt;br /&gt;
| 0x93&lt;br /&gt;
| 147&lt;br /&gt;
| V2&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SIMPLE_AV_CONTROL&lt;br /&gt;
| 0x94&lt;br /&gt;
| 148&lt;br /&gt;
| V4&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| AV_CONTENT_DIRECTORY_MD&lt;br /&gt;
| 0x95&lt;br /&gt;
| 149&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| AV_RENDERER_STATUS&lt;br /&gt;
| 0x96&lt;br /&gt;
| 150&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| AV_CONTENT_SEARCH_MD&lt;br /&gt;
| 0x97&lt;br /&gt;
| 151&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| SECURITY&lt;br /&gt;
| 0x98&lt;br /&gt;
| 152&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| weitere Tests erforderlich&lt;br /&gt;
|-&lt;br /&gt;
| AV_TAGGING_MD&lt;br /&gt;
| 0x99&lt;br /&gt;
| 153&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| Nicht in der offiziellen Liste von Sigma Designs enthalten&lt;br /&gt;
|-&lt;br /&gt;
| IP_CONFIGURATION&lt;br /&gt;
| 0x9A&lt;br /&gt;
| 154&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| IP_CONFIGURATION [OBSOLETED]&lt;br /&gt;
|-&lt;br /&gt;
| ASSOCIATION_COMMAND_CONFIGURATION&lt;br /&gt;
| 0x9B&lt;br /&gt;
| 155&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_ALARM&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 156&lt;br /&gt;
| V1&lt;br /&gt;
| V1&lt;br /&gt;
| SENSOR_ALARM [DEPRECATED]&lt;br /&gt;
|-&lt;br /&gt;
| SILENCE_ALARM&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 157&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SENSOR_CONFIGURATION&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 158&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| SENSOR_CONFIGURATION [OBSOLETED]&lt;br /&gt;
|-&lt;br /&gt;
| SECURITY S2&lt;br /&gt;
| 0x9F&lt;br /&gt;
| 159&lt;br /&gt;
| V1&lt;br /&gt;
| nein&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| unbekannt&lt;br /&gt;
| 0xA0 - 0xEE&lt;br /&gt;
| 160 - 238&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MARK&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 239&lt;br /&gt;
| N/A&lt;br /&gt;
| &lt;br /&gt;
| Trenner im NIF&lt;br /&gt;
|-&lt;br /&gt;
| NON_INTEROPERABLE&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 240&lt;br /&gt;
| N/A&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SECURITY_SCHEME0_MARK&lt;br /&gt;
| 0xF100&lt;br /&gt;
| 61696&lt;br /&gt;
| N/A&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bemerkungen:&lt;br /&gt;
* Die Klasse MULTI_INSTANCE wurde in der Version V2 durch MULTI_CHANNEL ersetzt. MULTI_INSTANCE wird von Z-Wave nicht mehr unterstützt.&lt;br /&gt;
* Die Klasse ALARM wurde in der Version V3 in NOTIFICATION umbenannt. Aus Kompatibilitätsgründen wird diese Klasse (0x71) in FHEM jedoch weiterhin immer als ALARM angezeigt, unabhängig von der Version. Das bedeutet, dass neuere Geräte, die laut der Produktbeschreibung NOTIFICATION unterstützen, dies in FHEM NICHT darstellen, die Funktionalitäten sind jedoch uneingeschränkt implementiert, nur eben unter dem alten Klassennamen ALARM.&lt;br /&gt;
* Einige IDs sind für das Z-Wave Protokoll reserviert oder haben eine besondere Bedeutung:&lt;br /&gt;
** 0x00 No Operation wird vom Z-Wave Protokoll und optional auch von den Geräten.&lt;br /&gt;
** 0x01 - 0x1F ist reserviert für das Z-Wave Protokoll&lt;br /&gt;
** 0x20 - 0xEE Dies ist der Bereich für die Command Classes&lt;br /&gt;
** 0xEF Support/Control Mark, ist eine kommandolose Pseudoklasse und dient als Trenner im NIF (Node Information Frame)&lt;br /&gt;
** 0xF0 Non interoperable&lt;br /&gt;
** 0xF1 - 0xFF sind für (zukünftige) Erweiterungen vorgesehen (Extended Application Command Classes). Bei diesen Befehlen wird quasi auf jeweils eine andere Liste von Befehlen verwiesen, so daß hier für die Zukunft noch einige Erweiterungen möglich sind. Als eine Besonderheit ist hier bereits 0xF100 für &amp;quot;SECURITY_SCHEME0_MARK&amp;quot; vergeben.&lt;br /&gt;
* Einige IDs sind in den unterschiedlichen Quellen unterschiedliche Klassennamen zugeordnet bzw. nicht in der offiziellen Liste von Sigma Designs enthalten:&lt;br /&gt;
** 0x24 ZIP_SERVER / SECURITY_PANEL_MODE&lt;br /&gt;
** 0x2E ZIP_CLIENT / SECURITY_PANELZONE&lt;br /&gt;
** 0x2F ZIP_ADV_SERVICES / SECURITY_PANELZONE_SENSOR&lt;br /&gt;
** 0x33 ZIP_ADV_SERVER / COLOR_CONTROL&lt;br /&gt;
** 0x34 ZIP_ADV_CLIENT / NETWORK_MANAGEMENT_INCLUSION&lt;br /&gt;
* Es gibt auch einige &amp;quot;Lücken&amp;quot; in den IDs die momentan unbekannt bzw. noch nicht durch Z-Wave vergeben sind, z.B.:&lt;br /&gt;
** 0x74 116 			&lt;br /&gt;
** 0x78 120 			&lt;br /&gt;
** 0x79 121 			&lt;br /&gt;
** 0x7E 126 			&lt;br /&gt;
** 0x7F 127 			&lt;br /&gt;
** 0x83 131&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für eine Command Class und deren Implementierung in FHEM ===&lt;br /&gt;
Implementierungshinweise im Forum:&lt;br /&gt;
* {{Link2Forum|Topic=12576|Message=76322}}&lt;br /&gt;
* {{Link2Forum|Topic=26613|Message=195944}}&lt;br /&gt;
&lt;br /&gt;
Debugging-Hinweis im Forum:&lt;br /&gt;
* {{Link2Forum|Topic=39270|Message=314126}}&lt;br /&gt;
* {{Link2Forum|Topic=67296|Message=589810}}&lt;br /&gt;
&lt;br /&gt;
=== Quellen und Links ===&lt;br /&gt;
* [[Z-Wave#Links]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Z-Wave Components]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=16577</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=16577"/>
		<updated>2016-10-09T13:37:20Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: getestet mit für ZM1701 hinzugefügt&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;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=16576</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=16576"/>
		<updated>2016-10-09T13:09:34Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Mappings für das ZWave Türschloss ZM1701 hinzugefügt.&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;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=15046</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=15046"/>
		<updated>2016-04-11T19:26:51Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Korrektur der Angaben im HomebridgeMapping, damit die Zuordnung der Statusangaben auch korrekt funktioniert.&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;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=14116</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=14116"/>
		<updated>2016-02-09T09:29:26Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: /* Bild verkleinert, Beschreibung angepasst, weil RESIDENTS automatisch als Occupancy Detector annonciert wird. */&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=valueOn=home,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;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:Homebridge_User_Configs&amp;diff=14098</id>
		<title>Diskussion:Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:Homebridge_User_Configs&amp;diff=14098"/>
		<updated>2016-02-08T14:51:46Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bild rendert nicht korrekt ==&lt;br /&gt;
Das Bild rendert leider nicht korrekt... Was kann ich denn da machen?&lt;br /&gt;
--[[Benutzer:Zephyr|Zephyr]] ([[Benutzer Diskussion:Zephyr|Diskussion]]) 10:31, 6. Feb. 2016 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Formatierungsbeispiele/-möglichkeiten findest Du u.a. hier: https://de.wikipedia.org/wiki/Hilfe:Bilder. Vielleicht hilft das schon. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:46, 6. Feb. 2016 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Also, ein Problem mit dem Rendern kann ich da nicht erkennen. Meiner Ansicht nach ist das Bild einfach unnötig groß - skaliere es auf 600x800 oder so runter; damit lässt sich trotdem wohl alles noch erkennen. Wenn es generell um die Einbindung von Bildern geht, würde ich derzeit auf die Wikipedia-Hilfe verweisen, fhemwiki-spezifisch gibt es da bisher keine Vorgaben. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 10:52, 6. Feb. 2016 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Es rendert korrekt, stimmt. Das war unpräzise von mir ausgedrückt. Was ich meine ist, dass ich zwar das Bild mittels \[\[Datei:Homebridge_bewohner_zu_szene.jpeg|180px|frame|right]] einbinde, aber mitnichten die angegebene Breite für das Bild verwendet wird. Das ist doch soweit ich weiß die übliche Syntax für Wikipedia zum Anzeigen von Bildern, oder?! --[[Benutzer:Zephyr|Zephyr]] ([[Benutzer Diskussion:Zephyr|Diskussion]]) 15:51, 8. Feb. 2016 (CET)&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:Homebridge_User_Configs&amp;diff=14081</id>
		<title>Diskussion:Homebridge User Configs</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:Homebridge_User_Configs&amp;diff=14081"/>
		<updated>2016-02-06T09:31:03Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Die Seite wurde neu angelegt: „Das Bild rendert leider nicht korrekt... Was kann ich denn da machen? --~~~~“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild rendert leider nicht korrekt... Was kann ich denn da machen?&lt;br /&gt;
--[[Benutzer:Zephyr|Zephyr]] ([[Benutzer Diskussion:Zephyr|Diskussion]]) 10:31, 6. Feb. 2016 (CET)&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=14080</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=14080"/>
		<updated>2016-02-06T09:30:34Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Kategorie hinzugefügt, Links benannt&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|180px|frame|right]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie den characteristics &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OccupancyDetected&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. Gleichzeitig zeigen wir mit der characteristic &amp;lt;code&amp;gt;OccupancyDetected&amp;lt;/code&amp;gt; in einer HomeKit-fähigen App an ob der jeweilige Bewohner zu Hause ist oder nicht. Dazu 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=valueOn=home,cmdOn=home,cmdOff=absent OccupancyDetected=presence,values=absent:OCCUPANCY_NOT_DETECTED;present:OCCUPANCY_DETECTED&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;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=14078</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=14078"/>
		<updated>2016-02-06T09:24:58Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Konfiguration der Anwesenheitssteuerung hinzugefügt.&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]]&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|180px|frame|right]]&lt;br /&gt;
Aus den einzelnen Komponenten des Moduls RESIDENTS, homebridge sowie den characteristics &amp;lt;code&amp;gt;On&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OccupancyDetected&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. Gleichzeitig zeigen wir mit der characteristic &amp;lt;code&amp;gt;OccupancyDetected&amp;lt;/code&amp;gt; in einer HomeKit-fähigen App an ob der jeweilige Bewohner zu Hause ist oder nicht. Dazu 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=valueOn=home,cmdOn=home,cmdOff=absent OccupancyDetected=presence,values=absent:OCCUPANCY_NOT_DETECTED;present:OCCUPANCY_DETECTED&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]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Homebridge_bewohner_zu_szene.jpeg&amp;diff=14077</id>
		<title>Datei:Homebridge bewohner zu szene.jpeg</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Homebridge_bewohner_zu_szene.jpeg&amp;diff=14077"/>
		<updated>2016-02-06T09:13:18Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Im Bild ist als Beispiel zu sehen, wie der Bewohner &amp;quot;KARSTEN&amp;quot; zu einer Szene hinzugefügt wird und welche Einstellungen dann vorgenommen werden müssen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im Bild ist als Beispiel zu sehen, wie der Bewohner &amp;quot;KARSTEN&amp;quot; zu einer Szene hinzugefügt wird und welche Einstellungen dann vorgenommen werden müssen.&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=14072</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=14072"/>
		<updated>2016-02-06T08:29:48Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: /* Schreibfehler korrigiert */&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;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=EnOcean-STM-250-Fenster-T%C3%BCrkontakt&amp;diff=14071</id>
		<title>EnOcean-STM-250-Fenster-Türkontakt</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=EnOcean-STM-250-Fenster-T%C3%BCrkontakt&amp;diff=14071"/>
		<updated>2016-02-06T08:19:20Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: /* Einsatzbeispiel zur Verwendung in Homebridge/HomeKit eingefügt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=platzHalter.png&lt;br /&gt;
|Bildbeschreibung=todo&lt;br /&gt;
|HWProtocol=EnOcean&lt;br /&gt;
|HWType=Sender, Sensor&lt;br /&gt;
|HWCategory=EnOcean&lt;br /&gt;
|HWComm=EnOcean Funk, 868Mhz&lt;br /&gt;
|HWChannels=&lt;br /&gt;
|HWVoltage=solarbetrieben&lt;br /&gt;
|HWPowerConsumption=&lt;br /&gt;
|HWPoweredBy=solarbetrieben&lt;br /&gt;
|HWSize=Kontakt: 110x19x15mm Magnet: 37x10x5mm / evtl. abweichend&lt;br /&gt;
|HWDeviceFHEM=[http://fhem.de/commandref.html#EnOcean EnOcean]&lt;br /&gt;
|HWManufacturer=EnOcean, diverse&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;EnOcean-STM-250-Fenster-Türkontakt&#039;&#039;&#039; ist ein solarbetriebener Sensor &lt;br /&gt;
* für&lt;br /&gt;
** Zustandsüberwachung von Fenstern und Türen&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Solarbetriebener Sensor sendet bei jeder Zustandsänderung sofort und alle 15 min eine Zustandsmeldung.&lt;br /&gt;
Der Sensor wird von verschiedenen Herstellern mit unterschiedlicher Bezeichnung angeboten (Achtung: teilweise abweichende Gehäusegrößen).&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
=== Definition/Anlernvorgang ===&lt;br /&gt;
Der Sensor wird beim Empfang des ersten normalen Funktelegramms im &amp;lt;code&amp;gt;learningMode&amp;lt;/code&amp;gt; vollständig von Fhem erkannt und das Fhem-Device für den Kontakt nebst Filelog und Plot durch autocreate angelegt. Der Versand des Anlerntelegramms ist für Fhem nicht zwingend notwendig; er führt zum gleichen Ergebnis wie der Empfang des ersten normalen Funktelegramms. &lt;br /&gt;
&lt;br /&gt;
Anlernvorgang:&lt;br /&gt;
# Fhem in Lernmodus schalten: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;set &amp;lt;IODev&amp;gt; teach &amp;lt;time/s&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Normales Funktelegramm oder alternativ Anlerntelegramm auslösen. Das Anlegen von Fhem-Devices für den Kontakt, Fileog und Plot in der Konfiguration erfolgt dann automatisch per autocreate.&lt;br /&gt;
&lt;br /&gt;
=== Fhem Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug für das Fhem-Device eines Kontaktes aus der [[Konfiguration]]:&lt;br /&gt;
 define EnO_contact_00017500 EnOcean 00017505&lt;br /&gt;
 attr EnO_contact_00017500 IODev TCM310_3&lt;br /&gt;
 attr EnO_contact_00017500 eep D5-00-01&lt;br /&gt;
 attr EnO_contact_00017500 manufID 7FF&lt;br /&gt;
 attr EnO_contact_00017500 room EnOcean&lt;br /&gt;
 attr EnO_contact_00017500 subType contact&lt;br /&gt;
&lt;br /&gt;
=== Logbeispiel ===&lt;br /&gt;
 2014-07-16_19:29:50 EnO_contact_00017500 closed&lt;br /&gt;
 2014-07-16_19:30:00 EnO_contact_00017500 open&lt;br /&gt;
 2014-07-16_19:31:10 EnO_contact_00017500 closed&lt;br /&gt;
 2014-07-16_19:31:20 EnO_contact_00017500 open&lt;br /&gt;
 2014-07-16_19:33:10 EnO_contact_00017500 closed&lt;br /&gt;
&lt;br /&gt;
== Einsatzbeispiel ==&lt;br /&gt;
=== Anzeige Türstatus im WebFrontend ===&lt;br /&gt;
[[Datei:EnOcean-STM-250-Anzeige-Fensterstatus.JPG|500px|frame|right]]&lt;br /&gt;
Durch folgendes Attribut wird der Türstatus im WebFrontend bildlich dargestellt: &lt;br /&gt;
 attr EnO_contact_00017500 devStateIcon closed:fts_door open:fts_door_open&lt;br /&gt;
&lt;br /&gt;
Mit dieser alternativen Variante des Attributs wird das Icon bei offener Tür rot und bei geschlossener Tür schwarz dargestellt:&lt;br /&gt;
 attr EnO_contact_00017500 devStateIcon open:fts_door_open@red closed:fts_door@black&lt;br /&gt;
&lt;br /&gt;
=== Türstatus in einem Plot darstellen ===&lt;br /&gt;
In aktuellen Fhem-Versionen wird ein Plot nebst Filelog für den EnOcean-Fensterkontakt automatisch beim Anlernen angelegt. Eine manuelle Anlage ist nicht mehr notwendig. Das dargestellte Vorgehen und die Erläuterungen sind aber für manuelle Anlage und Bearbeitung von Plots weiterhin noch aktuell.&lt;br /&gt;
&lt;br /&gt;
[[Datei:EnOcean-STM-250-Fenster-Türkontakt-Garden_door_gplot.jpg]]&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des [[Plots_erzeugen|.gplot-Editors]] kann ein Plot zur Darstellung des Türstatus im Zeitablauf erzeugt werden.&lt;br /&gt;
Voraussetzung ist die Existenz eines Logfiles für den Fenster-Türkontakt, das beim Teach-In standardmäßig von &amp;lt;code&amp;gt;autocreate&amp;lt;/code&amp;gt; erzeugt wird:&lt;br /&gt;
 define FileLog_EnO_contact_00017500 FileLog ./log/EnO_contact_0000FA27-%Y.log EnO_contact_0000FA27:.*&lt;br /&gt;
 attr FileLog_EnO_contact_00017500 logtype text&lt;br /&gt;
 attr FileLog_EnO_contact_00017500 room EnOcean&lt;br /&gt;
&lt;br /&gt;
Die Detailansicht des Filelogs FileLog_EnO_contact_00017500 aufrufen.&lt;br /&gt;
&lt;br /&gt;
Den Link &amp;quot;Create SVG Plot&amp;quot; anklicken.&lt;br /&gt;
&lt;br /&gt;
Die Felder im erscheinenden Plot-Editor folgendermaßen füllen:&lt;br /&gt;
{{Randnotiz|RNText=&#039;&#039;Allgemeiner Hinweis zum Function-Feld im Plot-Editor&#039;&#039;&lt;br /&gt;
Die Function dient zum Umsetzen von nicht-numerischen Werten in plotbare numerische Werte. Es ist ein Perl-Ausdruck für [http://fhem.de/commandref.html#FileLogget FileLog get] (siehe auch [[Creating_Plots#Data_Extraction|Creating Plots]])&amp;lt;br/&amp;gt;&lt;br /&gt;
x in $fld[x] bezeichnet die zu analysierende Spalte im FileLog. Die Spaltenzählung beginnt mit der 0. Spalte (Zeitstempel).&amp;lt;br/&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
# Plot title: &amp;lt;TL&amp;gt;&lt;br /&gt;
# Y-Axis label, left: Feld komplett löschen&lt;br /&gt;
# Y-Axis label, rigth: Status&lt;br /&gt;
# Range as [min:max],left: [-0.1:1.1] &lt;br /&gt;
# Range as [min:max],right: [-0.1:1.1] &lt;br /&gt;
# Tics as (&amp;quot;Txt&amp;quot; val, ...),left: (&amp;quot;open&amp;quot; 1, &amp;quot;closed&amp;quot; 0)&lt;br /&gt;
# Tics as (&amp;quot;Txt&amp;quot; val, ...),right: (&amp;quot;open&amp;quot; 1, &amp;quot;closed&amp;quot; 0)&lt;br /&gt;
# Diagramm label: notitle&lt;br /&gt;
# Source: FileLog_EnO_contact_00017500&lt;br /&gt;
# Column: 3&lt;br /&gt;
# Regexp: EnO_contact_00017500.*&lt;br /&gt;
# DefaultValue: 0&lt;br /&gt;
# Function: $fld[2]=~&amp;quot;open&amp;quot;?1:0&lt;br /&gt;
# Y-Axis: rigth&lt;br /&gt;
# Plot-Type: steps&lt;br /&gt;
# Style: I0&lt;br /&gt;
# Width: 1&lt;br /&gt;
&lt;br /&gt;
Dann {{Taste|Write .gplot-File}} anklicken. Der Plot sollte nun richtig angezeigt werden. Durch Anklicken von {{Taste|Show preprocessed input}} werden für einen kleineren Zeitraum die zugrundeliegenden Werte für den Plot angezeigt. Dies erleichtert die Kontrolle insbesondere bei der Nutzung von &amp;quot;Function&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Durch Setzen des folgendes Attribut wird die Titelzeile des Plots erzeugt:&lt;br /&gt;
 attr SVG_FileLog_EnO_contact_00017500_1 title sprintf(&amp;quot;Garden Door %s at %s&amp;quot;,$data{currval1}=~&amp;quot;1&amp;quot;?&#039;open&#039;:&#039;closed&#039;,$data{currdate1} =~ m/_(\d\d:\d\d)/?$1:&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Automatisch durch den .gplot-Editor erzeugte .glot-Datei (SVG_FileLog_EnO_contact_00017500.gplot_1):&lt;br /&gt;
 # Created by FHEM/98_SVG.pm, 2015-04-08 19:52:56&lt;br /&gt;
 set terminal png transparent size &amp;lt;SIZE&amp;gt; crop&lt;br /&gt;
 set output &#039;&amp;lt;OUT&amp;gt;.png&#039;&lt;br /&gt;
 set xdata time&lt;br /&gt;
 set timefmt &amp;quot;%Y-%m-%d_%H:%M:%S&amp;quot;&lt;br /&gt;
 set xlabel &amp;quot; &amp;quot;&lt;br /&gt;
 set title &#039;&amp;lt;TL&amp;gt;&#039;&lt;br /&gt;
 set ytics (&amp;quot;open&amp;quot; 1, &amp;quot;closed&amp;quot; 0)&lt;br /&gt;
 set y2tics (&amp;quot;open&amp;quot; 1, &amp;quot;closed&amp;quot; 0)&lt;br /&gt;
 set grid&lt;br /&gt;
 set ylabel &amp;quot;&amp;quot;&lt;br /&gt;
 set y2label &amp;quot;Status&amp;quot;&lt;br /&gt;
 set yrange [-0.1:1.1]&lt;br /&gt;
 set y2range [-0.1:1.1]&lt;br /&gt;
 &lt;br /&gt;
 #FileLog_EnO_contact_00017500 3:EnO_contact_00017500.*:0:$fld[2]=~&amp;quot;open&amp;quot;?1:0&lt;br /&gt;
 &lt;br /&gt;
 plot &amp;quot;&amp;lt;IN&amp;gt;&amp;quot; using 1:2 axes x1y2 notitle ls l0 lw 1 with steps&lt;br /&gt;
&lt;br /&gt;
aus [http://forum.fhem.de/index.php/topic,25990.msg191090.html#msg191090 Forenbeitrag]&lt;br /&gt;
&lt;br /&gt;
=== STM 250 in Homebridge / HomeKit verwenden ===&lt;br /&gt;
Der STM 250 kann mit einem homebridgeMapping ganz einfach verwendet werden:&lt;br /&gt;
 attr STM250 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED&lt;br /&gt;
&lt;br /&gt;
Details dazu im Artikel [[Hombridge_User_Configs | Homebridge User Configs]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Datenblatt: [http://www.enocean.com/de/enocean_module/stm-250-oem-data-sheet-pdf/ PDF]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:EnOcean Components]]&lt;br /&gt;
[[Kategorie:Kontaktsensor (magnetisch)]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_User_Configs&amp;diff=14070</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=14070"/>
		<updated>2016-02-06T08:09:03Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Konfigurationsbeispiel für den STM 250 eingefügt&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;generimdevicetype&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;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_einrichten&amp;diff=14069</id>
		<title>Homebridge einrichten</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_einrichten&amp;diff=14069"/>
		<updated>2016-02-06T07:55:06Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Leerzeichen zu viel: behoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses HOWTO zeigt die Installation und Erstinbetriebnahme von Homebridge. &lt;br /&gt;
&lt;br /&gt;
Damit kann Siri benutzt werden, um FHEM-Devices zu steuern. So können Devices angesprochen werden, die offiziell HomeKit nicht unterstützen (die Vorgehensweise wurde auf einem Intel NUC mit Ubuntu Server 14.04 LTS und auf einem Raspberry Pi mit Raspian getestet). Der WIKI-Eintrag bezieht sich hauptsächlich auf eine {{Link2Forum|Topic=32652|LinkText=Diskussion im FHEM-Forum}}. Ein Riesendank gilt vor allem {{Link2FU|430|Andre (justme1968)}}.&lt;br /&gt;
&lt;br /&gt;
Eine Sammlung funktionsfähiger Homebridge FHEM Konfiguration kann hier gefunden werden: [[Hombridge User Configs]]. Die Sammlung befindet sich noch im Aufbau.&lt;br /&gt;
&lt;br /&gt;
= Vorbereitung der Umgebung =&lt;br /&gt;
&lt;br /&gt;
== NodeJS installieren ==&lt;br /&gt;
&#039;&#039;Die nachfolgenden Befehle sind alle mit &amp;quot;sudo&amp;quot; prefixed. Wenn du unter &amp;quot;root&amp;quot; arbeitest oder deine Distribution einen anderen Mechanismus verwendet, so kannst du dies natürlich weglassen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get install build-essential libssl-dev&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss NodeJS installiert werden. Leider ist die Version im Debian Repository deutlich zu alt, daher wird mit den folgenden Befehlen das Node Repository hinzugefügt und NodeJS (in der LTS Version) entsprechend installiert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NodeJS V4&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NodeJS V5&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist NodeJS installiert.&lt;br /&gt;
&lt;br /&gt;
== Python, g++, MDNS installieren ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install python g++ libavahi-compat-libdnssd-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Voraussetzungen geschaffen.&lt;br /&gt;
&lt;br /&gt;
= Installation von Homebridge &amp;amp; notwendiger Shims =&lt;br /&gt;
Im Nachfolgenden Absatz wird die Installation von Homebridge sowie des notwendigen Plugins (Shim) für FHEM erläutert.&lt;br /&gt;
&lt;br /&gt;
== Homebridge installieren ==&lt;br /&gt;
Die aktuelle Homebridge version wird mit&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert, was eine Weile dauert. Anschließend wird der FHEM platform shim mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:60%;&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g homebridge-fhem&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert.&lt;br /&gt;
&lt;br /&gt;
== Homebridge aktualisieren ==&lt;br /&gt;
Die aktuelle Homebridge version wird mit&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
npm update -g homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert, was eine Weile dauert. Anschließend wird der FHEM platform shim mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:60%;&amp;quot;&amp;gt;&lt;br /&gt;
npm update -g homebridge-fhem&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert.&lt;br /&gt;
&lt;br /&gt;
=== Fehler während der Installation ===&lt;br /&gt;
Bei folgendem Fehler ist das abrufen von Github nicht möglich.&lt;br /&gt;
&amp;lt;pre&amp;gt;npm ERR! git clone --template=/home/hs-server-admin/.npm/_git-remotes/_templates --mirror &lt;br /&gt;
git://github.com/KhaosT/ed25519.git /home/hs-server-admin/.npm/_git-remotes/git-github-com-KhaosT-ed25519-git-d8bdee1d: &lt;br /&gt;
github.com[0: 192.30.252.128]: errno=Die Wartezeit für die Verbindung ist abgelaufen&amp;lt;/pre&amp;gt;&lt;br /&gt;
Fehlerursache konnte hier durch eine aktive Firewall verursacht werden.&lt;br /&gt;
&lt;br /&gt;
Kommt eine DNS Fehlermeldung fehlt meistens der AVAHI-DAEMON, zu installieren via&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width=50%&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install avahi-daemon&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Homebridge konfigurieren =&lt;br /&gt;
&#039;&#039;Wichtig: Für die weiteren Schritte sollte man nicht root verwenden, sondern beispielsweise einen dedizieren Nutzer für homebridge oder der Einfachheit halber den Nutzer unter dem auch FHEM läuft (meist &amp;quot;fhem&amp;quot;).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einstellungen für homebridge ==&lt;br /&gt;
&lt;br /&gt;
Zunächst wird das Verzeichnis für die Konfigurationsdatei erstellt und in dieses gewechselt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/.homebridge&lt;br /&gt;
cd ~/.homebridge/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss darin noch die config.json erstellt bzw. angepasst werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
nano ~/.homebridge/config.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise zur Konfiguration:&lt;br /&gt;
* &amp;quot;&#039;&#039;bridge&#039;&#039;&amp;quot;:&lt;br /&gt;
** &amp;quot;&#039;&#039;username&#039;&#039;&amp;quot;: Sollte so belassen werden. Sollte später auf dem iOS Device keine Homebridge gefunden werden, so kann man hier beispielsweise den String auf 31 statt 30 enden lassen um so eine neue Homebridge vorzutäuschen.&lt;br /&gt;
** &amp;quot;&#039;&#039;port&#039;&#039;&amp;quot;: Sollte so belassen werden&lt;br /&gt;
** &amp;quot;&#039;&#039;pin&#039;&#039;&amp;quot;: Der PIN kann beliebig in dem Format xxx-xx-xxx angepasst werden. Dieser muss nur einmal bei der Einrichtung in iOS eingegeben werden.&lt;br /&gt;
* &amp;quot;&#039;&#039;platforms&#039;&#039;&amp;quot;: &lt;br /&gt;
** &amp;quot;&#039;&#039;platform&#039;&#039;&amp;quot;: Hier muss &amp;quot;homebridge-fhem.fhem&amp;quot; beibehalten werden.&lt;br /&gt;
** &amp;quot;&#039;&#039;server&#039;&#039;&amp;quot;: Hier muss die IP des FHEM-Servers eingetragen werden. Dabei muss Homebridge nicht auf dem selben Server laufen wie FHEM, kann aber. Wenn es auf dem gleichen Rechner läuft, dann bietet es sich an, die IP 127.0.0.1 zu verwenden.&lt;br /&gt;
** &amp;quot;&#039;&#039;port&#039;&#039;&amp;quot;: Hier muss der Port des gewählten FHEMWEBS eingetragen werden (muss nicht das &amp;quot;normale&amp;quot; sein, kann eine extra Instanz sein)&lt;br /&gt;
** &amp;quot;&#039;&#039;auth&#039;&#039;&amp;quot;: Ist FHEM nicht mit Nutzername/Password abgesichert, so kann man diese Zeile einfach entfernen.&lt;br /&gt;
** &amp;quot;&#039;&#039;filter&#039;&#039;&amp;quot;: Damit nicht alle Devices von Homebridge berücksichtigt werden, bietet es sich an, die Devices zu filtern. In diesem Beispiel wurden alle Devices, die über Siri steuerbar sein sollen, zusätzlich in den Raum Homekit konfiguriert.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;bridge&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Homebridge&amp;quot;,&lt;br /&gt;
        &amp;quot;username&amp;quot;: &amp;quot;CC:22:3D:E3:CE:30&amp;quot;,&lt;br /&gt;
        &amp;quot;port&amp;quot;: 51826,&lt;br /&gt;
        &amp;quot;pin&amp;quot;: &amp;quot;031-45-154&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;platforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;platform&amp;quot;: &amp;quot;homebridge-fhem.FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;server&amp;quot;: &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: &amp;quot;8083&amp;quot;,&lt;br /&gt;
            &amp;quot;auth&amp;quot;: {&amp;quot;user&amp;quot;: &amp;quot;FhemUser&amp;quot;, &amp;quot;pass&amp;quot;: &amp;quot;XXX&amp;quot;},&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;room=Homekit&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
     ],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;accessories&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird FHEM mit SSL abgesichert, so muss zusätzlich in der Sektion &amp;quot;platforms&amp;quot; noch diese Zeile (nach &amp;quot;port&amp;quot;) eingefügt werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;quot;ssl&amp;quot;: true,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FHEM konfigurieren =&lt;br /&gt;
Um die Devices richtig mit FHEM und Homebridge vertraut zu machen, müssen wir noch unter dem &#039;&#039;global&#039;&#039;-Device das folgende zum userattr Attribut hinzufügen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
genericDeviceType:ignore,switch,outlet,light,blind,speaker,thermostat,ContactSensor,lock,window,contact&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das geht am einfachsten via Eingabefeld (nicht in der fhem.cfg):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{ addToAttrList(&amp;quot;genericDeviceType:ignore,switch,outlet,light,blind,speaker,thermostat,ContactSensor,lock,window,contact&amp;quot;) }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das subType attribut &#039;gehört&#039; dem jeweiligen Modul und sollte normalerweise nicht von Hand geändert werden.&lt;br /&gt;
&lt;br /&gt;
= Start von Homebridge =&lt;br /&gt;
&lt;br /&gt;
== Hinweis ==&lt;br /&gt;
Nach allen Änderungen die in FHEM gemacht werden, welche Homebridge betreffen, muss Homebridge neu gestartet werden. Wie der Neustart erfolgen muss, ist abhängig davon, wie man Homebridge gestartet hat. Bitte den entsprechenden Methoden entnehmen.&lt;br /&gt;
&lt;br /&gt;
== Einmaliger Manueller Start ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Homebridge sollte nun laufen. Hier kann man die Kommunikation nachverfolgen. Abbrechen kann das ganze mit CTRL+c (es dann auch keine Befehle mehr mit Siri möglich). Damit Siri auch Befehle ohne ständig offenes Terminal bearbeiten kann, bitten nächsten Punkt beachten.&lt;br /&gt;
&lt;br /&gt;
== Homebridge automatisch starten ==&lt;br /&gt;
Es gibt verschiedene Methoden, Homebridge automatisch zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Steuerung via FHEM ===&lt;br /&gt;
Auf Basis der unten stehenden &#039;&#039;Alternativen Methode&#039;&#039; wurde eine Version entwickelt, mit der man auch den Status einsehen und den Restart des Dienstes aus FHEM heraus erledigen kann. Diese Version ist auf der Seite [[Homebridge Start und Status in FHEM]] im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Methode ===&lt;br /&gt;
Dies startet homebridge als einen Service.&lt;br /&gt;
&lt;br /&gt;
==== Service anlegen ====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo nano /etc/init.d/homebridge&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code einfügen (startet den Homebridge Server als Benutzer &amp;quot;pi&amp;quot; und nimmt an, dass sich .homebridge/config.json in seinem Homeverzeichnis unter /home/pi/ befindet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides: homebridge&lt;br /&gt;
# Required-Start: $network $remote_fs $syslog&lt;br /&gt;
# Required-Stop: $remote_fs $syslog&lt;br /&gt;
# Default-Start: 2 3 4 5&lt;br /&gt;
# Default-Stop: 0 1 6&lt;br /&gt;
# Short-Description: Start daemon at boot time for homebridge&lt;br /&gt;
# Description: Enable service provided by daemon.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
export PATH=$PATH:/usr/local/bin&lt;br /&gt;
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules&lt;br /&gt;
PID=`pidof homebridge`&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
start)&lt;br /&gt;
if ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is already running&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        su - pi -c &amp;quot;homebridge &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Homebridge starting&amp;quot;&lt;br /&gt;
        $0 status&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
stop)&lt;br /&gt;
if ! ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is not running&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        kill $PID&lt;br /&gt;
        echo &amp;quot;Homebridge closed&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
restart)&lt;br /&gt;
if ! ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        $0 start&lt;br /&gt;
else&lt;br /&gt;
        $0 stop&lt;br /&gt;
        $0 start&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
status)&lt;br /&gt;
if ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is running PID $PID&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        echo &amp;quot;Homebridge is not running&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
*)&lt;br /&gt;
echo &amp;quot;Usage: $0 {start|stop|status|restart}&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
;;&lt;br /&gt;
esac&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Autostart aktivieren ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo chmod 755 /etc/init.d/homebridge&lt;br /&gt;
&lt;br /&gt;
sudo update-rc.d homebridge defaults&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo service homebridge start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo /etc/init.d/homebridge start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Dienst starten&lt;br /&gt;
&lt;br /&gt;
== FHEM Device Einstellungen ==&lt;br /&gt;
Damit die zu schaltenden Geräte überhaupt in der Homebridge aufgenommen werden muss man sie im Raum Homekit hinzufügen.&lt;br /&gt;
&lt;br /&gt;
Um HM-CC-RT-DN Thermostate steuern zu können, muss wie oben beschrieben folgendes attribute gesetzt werden (hier als Beispiel das Device &amp;quot;Heizung&amp;quot;):&lt;br /&gt;
# attr Heizung subtype thermostat&lt;br /&gt;
Für einen Dummy muss man den genericDeviceType setzen, also beispielsweise:&lt;br /&gt;
# attr Dummy genericDeviceType switch&lt;br /&gt;
# attr Dummy setList on off&lt;br /&gt;
&lt;br /&gt;
Wie bereits vorher angemerkt: Fügt man ein Device hinzu oder führt eine Änderung an einem Device durch, so sollte homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
= HomeKit in iOS =&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
Um FHEM über Homebridge in iOS nutzen zu können, muss HomeKit eingerichtet werden. &lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Apps. Im folgenden wird die App EVE von Elgato empfohlen, die aus dem App-Store geladen werden muss.&lt;br /&gt;
In der App auf:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
Gerät hinzufügen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es sollte ein Gerät mit der Bezeichnung &amp;quot;Homebridge&amp;quot; zur Auswahl erscheinen. Zur Ersteinrichtung auf PIN manuell eingeben gehen und (falls in der config.json nicht geändert):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
031-45-154&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
Im Anschluss können die Devices nach Belieben in verschiedene Räume zugeteilt werden, sowie Szenen und Bereiche erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Siri ==&lt;br /&gt;
&#039;&#039;&#039;HolyMoly&#039;&#039;&#039; aus dem FHEM-Forum hat ein paar Beispiele gegeben, wie man Siri dazu bringt Devices zu schalten:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Schalte alle Lampen im Obergeschoss ein.&amp;quot;&lt;br /&gt;
&amp;quot;Schalte Chloes Licht aus.&amp;quot;&lt;br /&gt;
&amp;quot;Dimme das Licht in der Küche.&amp;quot;&lt;br /&gt;
&amp;quot;Dimme das Licht im Esszimmer auf 50 %.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle das Licht in der Küche am hellsten ein.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle die Temperatur im Tahoe-Haus auf 22 °C ein.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle das Thermostat im Erdgeschoss auf 21 °C ein.&lt;br /&gt;
&amp;quot;Schalte den Drucker im Büro ein.&amp;quot;&lt;br /&gt;
&amp;quot;Siri, bereite alles für eine Party vor.&amp;quot;&lt;br /&gt;
&amp;quot;Bereite das Ambiente fürs Abendessen vor.&amp;quot;&lt;br /&gt;
&amp;quot;Aktiviere den Nachtruhemodus.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann Siri auch noch die Lichtfarbe von LEDs ändern.&lt;br /&gt;
&lt;br /&gt;
= Hinweise =&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Das Fhem Plugin von {{Link2FU|430|Andre (justme1968)}} unterstützt folgende Geräte&lt;br /&gt;
&lt;br /&gt;
    switches (devices with set on and set off commands)&lt;br /&gt;
    lights (devices with set on and set off commands)&lt;br /&gt;
    homematc and FS20 dimmers (devices with set on, set off and set dim or set pct commands)&lt;br /&gt;
    HUE, WifiLight, SWAP_0000002200000003 (hue, sat, bri, rgb)&lt;br /&gt;
    homematic, max and pid20 thermostats&lt;br /&gt;
    homematic, DUOFERN and FS20/IT(?) blinds&lt;br /&gt;
    homematic, MAX and FHTTK contact sensors (door, window)&lt;br /&gt;
    HM-SEC-WIN, HM-SEC-KEY&lt;br /&gt;
    presence, ROOMMATE&lt;br /&gt;
    SONOS (power, volume)&lt;br /&gt;
    harmony scenes&lt;br /&gt;
    temperaturecw and humidity sensors&lt;br /&gt;
    CO20 air quality sensor&lt;br /&gt;
    probably some more ...&lt;br /&gt;
&lt;br /&gt;
== Steuerung von MiLight Allgemein ==&lt;br /&gt;
Wie hier im {{Link2Forum|Topic=32652|Message=351706|LinkText=Forum}} erwähnt, ist es möglich auch MiLight Geräte per Siri anzusprechen. Hierzu muss die config.json angepasst werden.&lt;br /&gt;
&lt;br /&gt;
1. Es muss die Bridge hinterlegt werden. Beispiel&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;platform&amp;quot;: &amp;quot;MiLight&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;MiLight&amp;quot;,&lt;br /&gt;
            &amp;quot;ip_address&amp;quot;: &amp;quot;192.168.001.033&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 8899,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;rgbw&amp;quot;,&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 30,&lt;br /&gt;
            &amp;quot;repeat&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;zones&amp;quot;:[&amp;quot;Wohnzimmer Lampen&amp;quot;,&amp;quot;Badezimmer Lampen&amp;quot;,&amp;quot;Büro Lampen&amp;quot;,&amp;quot;Keller Lampen&amp;quot;]&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Es muss für jedes zu Steuernde Gerät ein Dummy angelegt werden. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;accessory&amp;quot;: &amp;quot;Http&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Kitchen Lamp&amp;quot;,&lt;br /&gt;
            &amp;quot;on_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/on&amp;quot;,&lt;br /&gt;
            &amp;quot;off_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/off&amp;quot;,&lt;br /&gt;
            &amp;quot;brightness_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/brightness/%b&amp;quot;,&lt;br /&gt;
            &amp;quot;http_method&amp;quot;: &amp;quot;POST&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweis für alte homebridge Versionen ==&lt;br /&gt;
UPDATE: Homebridge funktioniert mit einer kleinen Einschränkung nun auch mit node 4.0.0. Laut&lt;br /&gt;
[https://github.com/cflurin/homebridge-shims/wiki/Minimalist-Homebridge-on-a-Raspberry-Pi Homebridge on a Raspberry Pi] müssen die folgenden Abhängigkeiten (Dependencies) aus der &#039;&#039;&#039;package.json&#039;&#039;&#039; entfernt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;harmonyhubjs-client&amp;quot;: &amp;quot;^1.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-discover&amp;quot;: &amp;quot;git+https://github.com/swissmanu/harmonyhubjs-discover.git&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweis zur Geschwindigkeitsoptimierung auf einem Raspberry PI ==&lt;br /&gt;
&lt;br /&gt;
Damit es auf einem Raspberry schneller läuft, wird darüber hinaus empfohlen auch diverse Abhängigkeiten aus der &#039;&#039;&#039;package.json&#039;&#039;&#039; zu entfernen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;ad2usb&amp;quot;: &amp;quot;git+https://github.com/alistairg/node-ad2usb.git#local&amp;quot;,&lt;br /&gt;
&amp;quot;carwingsjs&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
&amp;quot;chokidar&amp;quot;: &amp;quot;^1.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;eibd&amp;quot;: &amp;quot;^0.3.1&amp;quot;,&lt;br /&gt;
&amp;quot;elkington&amp;quot;: &amp;quot;kevinohara80/elkington&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-client&amp;quot;: &amp;quot;^1.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-discover&amp;quot;: &amp;quot;git+https://github.com/swissmanu/harmonyhubjs-discover.git&amp;quot;,&lt;br /&gt;
&amp;quot;lifx-api&amp;quot;: &amp;quot;^1.0.1&amp;quot;,&lt;br /&gt;
&amp;quot;lifx&amp;quot;: &amp;quot;git+https://github.com/magicmonkey/lifxjs.git&amp;quot;,&lt;br /&gt;
&amp;quot;node-hue-api&amp;quot;: &amp;quot;^1.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;node-icontrol&amp;quot;: &amp;quot;^0.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;node-milight-promise&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
&amp;quot;tough-cookie&amp;quot;: &amp;quot;^2.0.0&amp;quot;,&lt;br /&gt;
&amp;quot;sonos&amp;quot;: &amp;quot;0.8.x&amp;quot;,&lt;br /&gt;
&amp;quot;telldus-live&amp;quot;: &amp;quot;0.2.x&amp;quot;,&lt;br /&gt;
&amp;quot;teslams&amp;quot;: &amp;quot;1.0.1&amp;quot;,&lt;br /&gt;
&amp;quot;unofficial-nest-api&amp;quot;: &amp;quot;git+https://github.com/hachidorii/unofficial_nodejs_nest.git#d8d48edc952b049ff6320ef99afa7b2f04cdee98&amp;quot;,&lt;br /&gt;
&amp;quot;wemo&amp;quot;: &amp;quot;0.2.x&amp;quot;,&lt;br /&gt;
&amp;quot;wink-js&amp;quot;: &amp;quot;0.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;komponist&amp;quot; : &amp;quot;0.1.0&amp;quot;,&lt;br /&gt;
&amp;quot;yamaha-nodejs&amp;quot;: &amp;quot;0.4.x&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daher zunächst ein ein Backup der Datei anlegen &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo cp package.json package.json.bkp &amp;lt;/pre&amp;gt;&lt;br /&gt;
Am einfachsten geht das entfernen der Zeilen einem Editor, beispielsweise nano oder vi.&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano package.json&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das config file sollte dann wie folgt aussehen: Achtung vor den letzten zwei &amp;quot;}&amp;quot; am Ende darf kein Komma sein.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;homebridge&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;HomeKit support for the impatient&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;0.1.1&amp;quot;,&lt;br /&gt;
  &amp;quot;scripts&amp;quot;: {&lt;br /&gt;
    &amp;quot;start&amp;quot;: &amp;quot;DEBUG=* node app.js || true&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;repository&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;git&amp;quot;,&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;git://github.com/nfarina/homebridge.git&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;license&amp;quot;: &amp;quot;ISC&amp;quot;,&lt;br /&gt;
  &amp;quot;dependencies&amp;quot;: {&lt;br /&gt;
    &amp;quot;async&amp;quot;: &amp;quot;^1.4.2&amp;quot;,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;0.10.x&amp;quot;,&lt;br /&gt;
    &amp;quot;debug&amp;quot;: &amp;quot;^2.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;hap-nodejs&amp;quot;: &amp;quot;^0.0.2&amp;quot;,&lt;br /&gt;
    &amp;quot;isy-js&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;mdns&amp;quot;: &amp;quot;^2.2.4&amp;quot;,&lt;br /&gt;
    &amp;quot;netatmo&amp;quot;: &amp;quot;1.3.0&amp;quot;,&lt;br /&gt;
    &amp;quot;node-cache&amp;quot;: &amp;quot;3.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;node-persist&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
    &amp;quot;node-xmpp-client&amp;quot;: &amp;quot;1.0.0-alpha23&amp;quot;,&lt;br /&gt;
    &amp;quot;q&amp;quot;: &amp;quot;1.4.x&amp;quot;,&lt;br /&gt;
    &amp;quot;queue&amp;quot;: &amp;quot;^3.1.0&amp;quot;,&lt;br /&gt;
    &amp;quot;request&amp;quot;: &amp;quot;2.49.x&amp;quot;,&lt;br /&gt;
    &amp;quot;xml2js&amp;quot;: &amp;quot;0.4.x&amp;quot;,&lt;br /&gt;
    &amp;quot;xmldoc&amp;quot;: &amp;quot;0.1.x&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Homebridge_einrichten&amp;diff=14068</id>
		<title>Homebridge einrichten</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Homebridge_einrichten&amp;diff=14068"/>
		<updated>2016-02-06T07:42:18Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: doppeltes ignore in den userAttributes korrigiert, ContactSensor als Service hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses HOWTO zeigt die Installation und Erstinbetriebnahme von Homebridge. &lt;br /&gt;
&lt;br /&gt;
Damit kann Siri benutzt werden, um FHEM-Devices zu steuern. So können Devices angesprochen werden, die offiziell HomeKit nicht unterstützen (die Vorgehensweise wurde auf einem Intel NUC mit Ubuntu Server 14.04 LTS und auf einem Raspberry Pi mit Raspian getestet). Der WIKI-Eintrag bezieht sich hauptsächlich auf eine {{Link2Forum|Topic=32652|LinkText=Diskussion im FHEM-Forum}}. Ein Riesendank gilt vor allem {{Link2FU|430|Andre (justme1968)}}.&lt;br /&gt;
&lt;br /&gt;
Eine Sammlung funktionsfähiger Homebridge FHEM Konfiguration kann hier gefunden werden: [[Hombridge User Configs]]. Die Sammlung befindet sich noch im Aufbau.&lt;br /&gt;
&lt;br /&gt;
= Vorbereitung der Umgebung =&lt;br /&gt;
&lt;br /&gt;
== NodeJS installieren ==&lt;br /&gt;
&#039;&#039;Die nachfolgenden Befehle sind alle mit &amp;quot;sudo&amp;quot; prefixed. Wenn du unter &amp;quot;root&amp;quot; arbeitest oder deine Distribution einen anderen Mechanismus verwendet, so kannst du dies natürlich weglassen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zunächst wird das Betriebssystem (in diesem Falle Debian oder Ubuntu) auf den aktuellen Stand gebracht:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get upgrade&lt;br /&gt;
sudo apt-get install build-essential libssl-dev&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss NodeJS installiert werden. Leider ist die Version im Debian Repository deutlich zu alt, daher wird mit den folgenden Befehlen das Node Repository hinzugefügt und NodeJS (in der LTS Version) entsprechend installiert:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NodeJS V4&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NodeJS V5&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install -y nodejs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist NodeJS installiert.&lt;br /&gt;
&lt;br /&gt;
== Python, g++, MDNS installieren ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install python g++ libavahi-compat-libdnssd-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun sind alle Voraussetzungen geschaffen.&lt;br /&gt;
&lt;br /&gt;
= Installation von Homebridge &amp;amp; notwendiger Shims =&lt;br /&gt;
Im Nachfolgenden Absatz wird die Installation von Homebridge sowie des notwendigen Plugins (Shim) für FHEM erläutert.&lt;br /&gt;
&lt;br /&gt;
== Homebridge installieren ==&lt;br /&gt;
Die aktuelle Homebridge version wird mit&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert, was eine Weile dauert. Anschließend wird der FHEM platform shim mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:60%;&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g homebridge-fhem&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert.&lt;br /&gt;
&lt;br /&gt;
== Homebridge aktualisieren ==&lt;br /&gt;
Die aktuelle Homebridge version wird mit&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
npm update -g homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert, was eine Weile dauert. Anschließend wird der FHEM platform shim mit:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:60%;&amp;quot;&amp;gt;&lt;br /&gt;
npm update -g homebridge-fhem&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
installiert.&lt;br /&gt;
&lt;br /&gt;
=== Fehler während der Installation ===&lt;br /&gt;
Bei folgendem Fehler ist das abrufen von Github nicht möglich.&lt;br /&gt;
&amp;lt;pre&amp;gt;npm ERR! git clone --template=/home/hs-server-admin/.npm/_git-remotes/_templates --mirror &lt;br /&gt;
git://github.com/KhaosT/ed25519.git /home/hs-server-admin/.npm/_git-remotes/git-github-com-KhaosT-ed25519-git-d8bdee1d: &lt;br /&gt;
github.com[0: 192.30.252.128]: errno=Die Wartezeit für die Verbindung ist abgelaufen&amp;lt;/pre&amp;gt;&lt;br /&gt;
Fehlerursache konnte hier durch eine aktive Firewall verursacht werden.&lt;br /&gt;
&lt;br /&gt;
Kommt eine DNS Fehlermeldung fehlt meistens der AVAHI-DAEMON, zu installieren via&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width=50%&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install avahi-daemon&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Homebridge konfigurieren =&lt;br /&gt;
&#039;&#039;Wichtig: Für die weiteren Schritte sollte man nicht root verwenden, sondern beispielsweise einen dedizieren Nutzer für homebridge oder der Einfachheit halber den Nutzer unter dem auch FHEM läuft (meist &amp;quot;fhem&amp;quot;).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einstellungen für homebridge ==&lt;br /&gt;
&lt;br /&gt;
Zunächst wird das Verzeichnis für die Konfigurationsdatei erstellt und in dieses gewechselt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/.homebridge&lt;br /&gt;
cd ~/.homebridge/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss darin noch die config.json erstellt bzw. angepasst werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
nano ~/.homebridge/config.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise zur Konfiguration:&lt;br /&gt;
* &amp;quot;&#039;&#039;bridge&#039;&#039;&amp;quot;:&lt;br /&gt;
** &amp;quot;&#039;&#039;username&#039;&#039;&amp;quot;: Sollte so belassen werden. Sollte später auf dem iOS Device keine Homebridge gefunden werden, so kann man hier beispielsweise den String auf 31 statt 30 enden lassen um so eine neue Homebridge vorzutäuschen.&lt;br /&gt;
** &amp;quot;&#039;&#039;port&#039;&#039;&amp;quot;: Sollte so belassen werden&lt;br /&gt;
** &amp;quot;&#039;&#039;pin&#039;&#039;&amp;quot;: Der PIN kann beliebig in dem Format xxx-xx-xxx angepasst werden. Dieser muss nur einmal bei der Einrichtung in iOS eingegeben werden.&lt;br /&gt;
* &amp;quot;&#039;&#039;platforms&#039;&#039;&amp;quot;: &lt;br /&gt;
** &amp;quot;&#039;&#039;platform&#039;&#039;&amp;quot;: Hier muss &amp;quot;homebridge-fhem.fhem&amp;quot; beibehalten werden.&lt;br /&gt;
** &amp;quot;&#039;&#039;server&#039;&#039;&amp;quot;: Hier muss die IP des FHEM-Servers eingetragen werden. Dabei muss Homebridge nicht auf dem selben Server laufen wie FHEM, kann aber. Wenn es auf dem gleichen Rechner läuft, dann bietet es sich an, die IP 127.0.0.1 zu verwenden.&lt;br /&gt;
** &amp;quot;&#039;&#039;port&#039;&#039;&amp;quot;: Hier muss der Port des gewählten FHEMWEBS eingetragen werden (muss nicht das &amp;quot;normale&amp;quot; sein, kann eine extra Instanz sein)&lt;br /&gt;
** &amp;quot;&#039;&#039;auth&#039;&#039;&amp;quot;: Ist FHEM nicht mit Nutzername/Password abgesichert, so kann man diese Zeile einfach entfernen.&lt;br /&gt;
** &amp;quot;&#039;&#039;filter&#039;&#039;&amp;quot;: Damit nicht alle Devices von Homebridge berücksichtigt werden, bietet es sich an, die Devices zu filtern. In diesem Beispiel wurden alle Devices, die über Siri steuerbar sein sollen, zusätzlich in den Raum Homekit konfiguriert.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;bridge&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Homebridge&amp;quot;,&lt;br /&gt;
        &amp;quot;username&amp;quot;: &amp;quot;CC:22:3D:E3:CE:30&amp;quot;,&lt;br /&gt;
        &amp;quot;port&amp;quot;: 51826,&lt;br /&gt;
        &amp;quot;pin&amp;quot;: &amp;quot;031-45-154&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;platforms&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;platform&amp;quot;: &amp;quot;homebridge-fhem.FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;FHEM&amp;quot;,&lt;br /&gt;
            &amp;quot;server&amp;quot;: &amp;quot;127.0.0.1&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: &amp;quot;8083&amp;quot;,&lt;br /&gt;
            &amp;quot;auth&amp;quot;: {&amp;quot;user&amp;quot;: &amp;quot;FhemUser&amp;quot;, &amp;quot;pass&amp;quot;: &amp;quot;XXX&amp;quot;},&lt;br /&gt;
            &amp;quot;filter&amp;quot;: &amp;quot;room=Homekit&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
     ],&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;accessories&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird FHEM mit SSL abgesichert, so muss zusätzlich in der Sektion &amp;quot;platforms&amp;quot; noch diese Zeile (nach &amp;quot;port&amp;quot;) eingefügt werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;quot;ssl&amp;quot;: true,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= FHEM konfigurieren =&lt;br /&gt;
Um die Devices richtig mit FHEM und Homebridge vertraut zu machen, müssen wir noch unter dem &#039;&#039;global&#039;&#039;-Device das folgende zum userattr Attribut hinzufügen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
genericDeviceType:ignore,switch,outlet,light,blind,speaker,thermostat, ContactSensor,lock,window,contact&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das geht am einfachsten via Eingabefeld (nicht in der fhem.cfg):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{ addToAttrList(&amp;quot;genericDeviceType:ignore,switch,outlet,light,blind,speaker,thermostat,ContactSensor,lock,window,contact&amp;quot;) }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das subType attribut &#039;gehört&#039; dem jeweiligen Modul und sollte normalerweise nicht von Hand geändert werden.&lt;br /&gt;
&lt;br /&gt;
= Start von Homebridge =&lt;br /&gt;
&lt;br /&gt;
== Hinweis ==&lt;br /&gt;
Nach allen Änderungen die in FHEM gemacht werden, welche Homebridge betreffen, muss Homebridge neu gestartet werden. Wie der Neustart erfolgen muss, ist abhängig davon, wie man Homebridge gestartet hat. Bitte den entsprechenden Methoden entnehmen.&lt;br /&gt;
&lt;br /&gt;
== Einmaliger Manueller Start ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
homebridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Homebridge sollte nun laufen. Hier kann man die Kommunikation nachverfolgen. Abbrechen kann das ganze mit CTRL+c (es dann auch keine Befehle mehr mit Siri möglich). Damit Siri auch Befehle ohne ständig offenes Terminal bearbeiten kann, bitten nächsten Punkt beachten.&lt;br /&gt;
&lt;br /&gt;
== Homebridge automatisch starten ==&lt;br /&gt;
Es gibt verschiedene Methoden, Homebridge automatisch zu starten.&lt;br /&gt;
&lt;br /&gt;
=== Steuerung via FHEM ===&lt;br /&gt;
Auf Basis der unten stehenden &#039;&#039;Alternativen Methode&#039;&#039; wurde eine Version entwickelt, mit der man auch den Status einsehen und den Restart des Dienstes aus FHEM heraus erledigen kann. Diese Version ist auf der Seite [[Homebridge Start und Status in FHEM]] im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Methode ===&lt;br /&gt;
Dies startet homebridge als einen Service.&lt;br /&gt;
&lt;br /&gt;
==== Service anlegen ====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo nano /etc/init.d/homebridge&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code einfügen (startet den Homebridge Server als Benutzer &amp;quot;pi&amp;quot; und nimmt an, dass sich .homebridge/config.json in seinem Homeverzeichnis unter /home/pi/ befindet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides: homebridge&lt;br /&gt;
# Required-Start: $network $remote_fs $syslog&lt;br /&gt;
# Required-Stop: $remote_fs $syslog&lt;br /&gt;
# Default-Start: 2 3 4 5&lt;br /&gt;
# Default-Stop: 0 1 6&lt;br /&gt;
# Short-Description: Start daemon at boot time for homebridge&lt;br /&gt;
# Description: Enable service provided by daemon.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
export PATH=$PATH:/usr/local/bin&lt;br /&gt;
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules&lt;br /&gt;
PID=`pidof homebridge`&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
start)&lt;br /&gt;
if ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is already running&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        su - pi -c &amp;quot;homebridge &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Homebridge starting&amp;quot;&lt;br /&gt;
        $0 status&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
stop)&lt;br /&gt;
if ! ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is not running&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        kill $PID&lt;br /&gt;
        echo &amp;quot;Homebridge closed&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
restart)&lt;br /&gt;
if ! ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        $0 start&lt;br /&gt;
else&lt;br /&gt;
        $0 stop&lt;br /&gt;
        $0 start&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
status)&lt;br /&gt;
if ps -p $PID &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;Homebridge is running PID $PID&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        echo &amp;quot;Homebridge is not running&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
;;&lt;br /&gt;
*)&lt;br /&gt;
echo &amp;quot;Usage: $0 {start|stop|status|restart}&amp;quot;&lt;br /&gt;
exit 1&lt;br /&gt;
;;&lt;br /&gt;
esac&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Autostart aktivieren ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo chmod 755 /etc/init.d/homebridge&lt;br /&gt;
&lt;br /&gt;
sudo update-rc.d homebridge defaults&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mit &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo service homebridge start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bzw.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sudo /etc/init.d/homebridge start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
den Dienst starten&lt;br /&gt;
&lt;br /&gt;
== FHEM Device Einstellungen ==&lt;br /&gt;
Damit die zu schaltenden Geräte überhaupt in der Homebridge aufgenommen werden muss man sie im Raum Homekit hinzufügen.&lt;br /&gt;
&lt;br /&gt;
Um HM-CC-RT-DN Thermostate steuern zu können, muss wie oben beschrieben folgendes attribute gesetzt werden (hier als Beispiel das Device &amp;quot;Heizung&amp;quot;):&lt;br /&gt;
# attr Heizung subtype thermostat&lt;br /&gt;
Für einen Dummy muss man den genericDeviceType setzen, also beispielsweise:&lt;br /&gt;
# attr Dummy genericDeviceType switch&lt;br /&gt;
# attr Dummy setList on off&lt;br /&gt;
&lt;br /&gt;
Wie bereits vorher angemerkt: Fügt man ein Device hinzu oder führt eine Änderung an einem Device durch, so sollte homebridge neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
= HomeKit in iOS =&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
Um FHEM über Homebridge in iOS nutzen zu können, muss HomeKit eingerichtet werden. &lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Apps. Im folgenden wird die App EVE von Elgato empfohlen, die aus dem App-Store geladen werden muss.&lt;br /&gt;
In der App auf:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
Gerät hinzufügen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es sollte ein Gerät mit der Bezeichnung &amp;quot;Homebridge&amp;quot; zur Auswahl erscheinen. Zur Ersteinrichtung auf PIN manuell eingeben gehen und (falls in der config.json nicht geändert):&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
031-45-154&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
eingeben.&lt;br /&gt;
&lt;br /&gt;
Im Anschluss können die Devices nach Belieben in verschiedene Räume zugeteilt werden, sowie Szenen und Bereiche erstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Schalten mit Siri ==&lt;br /&gt;
&#039;&#039;&#039;HolyMoly&#039;&#039;&#039; aus dem FHEM-Forum hat ein paar Beispiele gegeben, wie man Siri dazu bringt Devices zu schalten:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Schalte alle Lampen im Obergeschoss ein.&amp;quot;&lt;br /&gt;
&amp;quot;Schalte Chloes Licht aus.&amp;quot;&lt;br /&gt;
&amp;quot;Dimme das Licht in der Küche.&amp;quot;&lt;br /&gt;
&amp;quot;Dimme das Licht im Esszimmer auf 50 %.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle das Licht in der Küche am hellsten ein.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle die Temperatur im Tahoe-Haus auf 22 °C ein.&amp;quot;&lt;br /&gt;
&amp;quot;Stelle das Thermostat im Erdgeschoss auf 21 °C ein.&lt;br /&gt;
&amp;quot;Schalte den Drucker im Büro ein.&amp;quot;&lt;br /&gt;
&amp;quot;Siri, bereite alles für eine Party vor.&amp;quot;&lt;br /&gt;
&amp;quot;Bereite das Ambiente fürs Abendessen vor.&amp;quot;&lt;br /&gt;
&amp;quot;Aktiviere den Nachtruhemodus.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile kann Siri auch noch die Lichtfarbe von LEDs ändern.&lt;br /&gt;
&lt;br /&gt;
= Hinweise =&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Das Fhem Plugin von {{Link2FU|430|Andre (justme1968)}} unterstützt folgende Geräte&lt;br /&gt;
&lt;br /&gt;
    switches (devices with set on and set off commands)&lt;br /&gt;
    lights (devices with set on and set off commands)&lt;br /&gt;
    homematc and FS20 dimmers (devices with set on, set off and set dim or set pct commands)&lt;br /&gt;
    HUE, WifiLight, SWAP_0000002200000003 (hue, sat, bri, rgb)&lt;br /&gt;
    homematic, max and pid20 thermostats&lt;br /&gt;
    homematic, DUOFERN and FS20/IT(?) blinds&lt;br /&gt;
    homematic, MAX and FHTTK contact sensors (door, window)&lt;br /&gt;
    HM-SEC-WIN, HM-SEC-KEY&lt;br /&gt;
    presence, ROOMMATE&lt;br /&gt;
    SONOS (power, volume)&lt;br /&gt;
    harmony scenes&lt;br /&gt;
    temperaturecw and humidity sensors&lt;br /&gt;
    CO20 air quality sensor&lt;br /&gt;
    probably some more ...&lt;br /&gt;
&lt;br /&gt;
== Steuerung von MiLight Allgemein ==&lt;br /&gt;
Wie hier im {{Link2Forum|Topic=32652|Message=351706|LinkText=Forum}} erwähnt, ist es möglich auch MiLight Geräte per Siri anzusprechen. Hierzu muss die config.json angepasst werden.&lt;br /&gt;
&lt;br /&gt;
1. Es muss die Bridge hinterlegt werden. Beispiel&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;platform&amp;quot;: &amp;quot;MiLight&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;MiLight&amp;quot;,&lt;br /&gt;
            &amp;quot;ip_address&amp;quot;: &amp;quot;192.168.001.033&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 8899,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;rgbw&amp;quot;,&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 30,&lt;br /&gt;
            &amp;quot;repeat&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;zones&amp;quot;:[&amp;quot;Wohnzimmer Lampen&amp;quot;,&amp;quot;Badezimmer Lampen&amp;quot;,&amp;quot;Büro Lampen&amp;quot;,&amp;quot;Keller Lampen&amp;quot;]&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Es muss für jedes zu Steuernde Gerät ein Dummy angelegt werden. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; style=&amp;quot;width:50%;&amp;quot;&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;accessory&amp;quot;: &amp;quot;Http&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Kitchen Lamp&amp;quot;,&lt;br /&gt;
            &amp;quot;on_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/on&amp;quot;,&lt;br /&gt;
            &amp;quot;off_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/off&amp;quot;,&lt;br /&gt;
            &amp;quot;brightness_url&amp;quot;: &amp;quot;https://192.168.1.22:3030/devices/23222/brightness/%b&amp;quot;,&lt;br /&gt;
            &amp;quot;http_method&amp;quot;: &amp;quot;POST&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweis für alte homebridge Versionen ==&lt;br /&gt;
UPDATE: Homebridge funktioniert mit einer kleinen Einschränkung nun auch mit node 4.0.0. Laut&lt;br /&gt;
[https://github.com/cflurin/homebridge-shims/wiki/Minimalist-Homebridge-on-a-Raspberry-Pi Homebridge on a Raspberry Pi] müssen die folgenden Abhängigkeiten (Dependencies) aus der &#039;&#039;&#039;package.json&#039;&#039;&#039; entfernt werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;harmonyhubjs-client&amp;quot;: &amp;quot;^1.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-discover&amp;quot;: &amp;quot;git+https://github.com/swissmanu/harmonyhubjs-discover.git&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweis zur Geschwindigkeitsoptimierung auf einem Raspberry PI ==&lt;br /&gt;
&lt;br /&gt;
Damit es auf einem Raspberry schneller läuft, wird darüber hinaus empfohlen auch diverse Abhängigkeiten aus der &#039;&#039;&#039;package.json&#039;&#039;&#039; zu entfernen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;ad2usb&amp;quot;: &amp;quot;git+https://github.com/alistairg/node-ad2usb.git#local&amp;quot;,&lt;br /&gt;
&amp;quot;carwingsjs&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
&amp;quot;chokidar&amp;quot;: &amp;quot;^1.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;eibd&amp;quot;: &amp;quot;^0.3.1&amp;quot;,&lt;br /&gt;
&amp;quot;elkington&amp;quot;: &amp;quot;kevinohara80/elkington&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-client&amp;quot;: &amp;quot;^1.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;harmonyhubjs-discover&amp;quot;: &amp;quot;git+https://github.com/swissmanu/harmonyhubjs-discover.git&amp;quot;,&lt;br /&gt;
&amp;quot;lifx-api&amp;quot;: &amp;quot;^1.0.1&amp;quot;,&lt;br /&gt;
&amp;quot;lifx&amp;quot;: &amp;quot;git+https://github.com/magicmonkey/lifxjs.git&amp;quot;,&lt;br /&gt;
&amp;quot;node-hue-api&amp;quot;: &amp;quot;^1.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;node-icontrol&amp;quot;: &amp;quot;^0.1.4&amp;quot;,&lt;br /&gt;
&amp;quot;node-milight-promise&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
&amp;quot;tough-cookie&amp;quot;: &amp;quot;^2.0.0&amp;quot;,&lt;br /&gt;
&amp;quot;sonos&amp;quot;: &amp;quot;0.8.x&amp;quot;,&lt;br /&gt;
&amp;quot;telldus-live&amp;quot;: &amp;quot;0.2.x&amp;quot;,&lt;br /&gt;
&amp;quot;teslams&amp;quot;: &amp;quot;1.0.1&amp;quot;,&lt;br /&gt;
&amp;quot;unofficial-nest-api&amp;quot;: &amp;quot;git+https://github.com/hachidorii/unofficial_nodejs_nest.git#d8d48edc952b049ff6320ef99afa7b2f04cdee98&amp;quot;,&lt;br /&gt;
&amp;quot;wemo&amp;quot;: &amp;quot;0.2.x&amp;quot;,&lt;br /&gt;
&amp;quot;wink-js&amp;quot;: &amp;quot;0.0.5&amp;quot;,&lt;br /&gt;
&amp;quot;komponist&amp;quot; : &amp;quot;0.1.0&amp;quot;,&lt;br /&gt;
&amp;quot;yamaha-nodejs&amp;quot;: &amp;quot;0.4.x&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daher zunächst ein ein Backup der Datei anlegen &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo cp package.json package.json.bkp &amp;lt;/pre&amp;gt;&lt;br /&gt;
Am einfachsten geht das entfernen der Zeilen einem Editor, beispielsweise nano oder vi.&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo nano package.json&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das config file sollte dann wie folgt aussehen: Achtung vor den letzten zwei &amp;quot;}&amp;quot; am Ende darf kein Komma sein.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;homebridge&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;HomeKit support for the impatient&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;0.1.1&amp;quot;,&lt;br /&gt;
  &amp;quot;scripts&amp;quot;: {&lt;br /&gt;
    &amp;quot;start&amp;quot;: &amp;quot;DEBUG=* node app.js || true&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;repository&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;git&amp;quot;,&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;git://github.com/nfarina/homebridge.git&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;license&amp;quot;: &amp;quot;ISC&amp;quot;,&lt;br /&gt;
  &amp;quot;dependencies&amp;quot;: {&lt;br /&gt;
    &amp;quot;async&amp;quot;: &amp;quot;^1.4.2&amp;quot;,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;0.10.x&amp;quot;,&lt;br /&gt;
    &amp;quot;debug&amp;quot;: &amp;quot;^2.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;hap-nodejs&amp;quot;: &amp;quot;^0.0.2&amp;quot;,&lt;br /&gt;
    &amp;quot;isy-js&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;mdns&amp;quot;: &amp;quot;^2.2.4&amp;quot;,&lt;br /&gt;
    &amp;quot;netatmo&amp;quot;: &amp;quot;1.3.0&amp;quot;,&lt;br /&gt;
    &amp;quot;node-cache&amp;quot;: &amp;quot;3.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;node-persist&amp;quot;: &amp;quot;0.0.x&amp;quot;,&lt;br /&gt;
    &amp;quot;node-xmpp-client&amp;quot;: &amp;quot;1.0.0-alpha23&amp;quot;,&lt;br /&gt;
    &amp;quot;q&amp;quot;: &amp;quot;1.4.x&amp;quot;,&lt;br /&gt;
    &amp;quot;queue&amp;quot;: &amp;quot;^3.1.0&amp;quot;,&lt;br /&gt;
    &amp;quot;request&amp;quot;: &amp;quot;2.49.x&amp;quot;,&lt;br /&gt;
    &amp;quot;xml2js&amp;quot;: &amp;quot;0.4.x&amp;quot;,&lt;br /&gt;
    &amp;quot;xmldoc&amp;quot;: &amp;quot;0.1.x&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Callmonitor_mit_Anruferliste_und_Zusatzfunktionen&amp;diff=6832</id>
		<title>Callmonitor mit Anruferliste und Zusatzfunktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Callmonitor_mit_Anruferliste_und_Zusatzfunktionen&amp;diff=6832"/>
		<updated>2014-07-12T10:30:50Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Beschreibung des Callmonitors weitergeführt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert hauptsächlich auf der Diskussion &amp;quot;Callmonitor für Anfänger&amp;quot; im FHEM-Forum [http://forum.fhem.de/index.php/topic,19238.0.html].&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem Post [[http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]] in oben genannter Diskussion entnommen. Er umfasst alle Bestandteile zum Anzeigen einer rollierenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS) sind auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
Wie die Anruferliste erstellt wird und wie die Voraussetzungen für auszulösende Aktionen eingebunden werden wird im Abschnitt &amp;quot;Lösung&amp;quot; schrittweise erklärt. Die Anforderungen an die Anruferliste und auszulösende Aktionen werden folgend kurz dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Anforderungen an die Anruferliste ===&lt;br /&gt;
* Liste mit der Möglichkeit die letzten fünf über die Fritz!Box angenommenen und getätigten Anrufe darzustellen&lt;br /&gt;
* die Liste soll den letzen Anruf in der ersten Zeile anzeigen&lt;br /&gt;
* der Status des Anrufes ist über ein Symbol ersichtlich&lt;br /&gt;
* Name und Nummer des Angerufenen / Anrufenden sind ersichtlich&lt;br /&gt;
&lt;br /&gt;
=== Anforderungen an die Möglichkeit Aktionen auszulösen ===&lt;br /&gt;
* Aktionen können in Abhängigkeit von Status des Anrufes ausgeführt werden&lt;br /&gt;
* Aktionen können auch gekapselt werden&lt;br /&gt;
&lt;br /&gt;
=== durchzuführende Schritte ===&lt;br /&gt;
Die Reihenfolge ist hier unerheblich. Die Liste soll lediglich einen groben Überblick über die folgenden einzelnen Schritte zur Orientierung geboten werden&lt;br /&gt;
* 99_myUtilsTelefon.pm erstellen (bitte zuerst durchführen)&lt;br /&gt;
* UserReadings im Callmonitor in FHEM einrichten&lt;br /&gt;
* Readingsgroup erstellen, die die UserReadings anzeigt&lt;br /&gt;
* Notify erstellen, das die Telefonaktionen aufruft&lt;br /&gt;
* in Abhängigkeit vom Anrufstatus auszulösende Aktionen einbinden&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Aktivierter Callmonitor in der Fritz!Box ===&lt;br /&gt;
Damit das Modul Callmonitor in FHEM überhaupt arbeitet, muss zuerst in der Fritz!Box der Callmonitor eingeschalten werden. Das geht am einfachsten, indem man von einem direkt an die Fritz!Box angeschlossenen Telefon die Nummer #96*5* wählt.&lt;br /&gt;
&lt;br /&gt;
=== Funktionierendes Modul Callmonitor in FHEM ===&lt;br /&gt;
Ist bereits das Modul Callmonitor in FHEM aktiv, muss es natürlich nicht extra eingerichtet werden. Wie das funktioniert erklärt sehr gut der Artikel [[FB CALLMONITOR]].&lt;br /&gt;
&lt;br /&gt;
=== Anlegen einer Datei 99_myUtilsTelefon.pm ===&lt;br /&gt;
Die Datei 99_myUtilsTelefon.pm wird den Perlcode aufnehmen, der die Anruferliste sowie die damit verknüpften Aktionen ausführt. Das Prinzip, um die 99_myUtilsTelefon.pm zu erstellen die exakt das gleich wie wenn man eine [[99 myUtils anlegen]] möchte. In unserem konkreten Fall soll die Datei allerdings den Namen 99_myUtilsTelefon.pm erhalten.&lt;br /&gt;
&lt;br /&gt;
Bitte diesen Schritt nun ausführen, damit später das Script nur noch in die 99_myUtilsTelefon.pm kopiert werden muss.&lt;br /&gt;
&lt;br /&gt;
Natürlich muss auch die 99_myUtilsTelefon.pm nach jeder Anpassung an eigene Bedürfnisse neu geladen werden.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
In die [[Konfiguration|fhem.cfg]:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
#attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6764</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6764"/>
		<updated>2014-07-06T20:01:34Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Aufgabenstellung als groben Überblick und Anforderungen beschrieben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert hauptsächlich auf der Diskussion &amp;quot;Callmonitor für Anfänger&amp;quot; im FHEM-Forum [http://forum.fhem.de/index.php/topic,19238.0.html].&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem Post [[http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]] in oben genannter Diskussion entnommen. Er umfasst alle Bestandteile zum Anzeigen einer rollierenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS) sind auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
Wie die Anruferliste erstellt wird und wie die Voraussetzungen für auszulösende Aktionen eingebunden werden wird im Abschnitt &amp;quot;Lösung&amp;quot; schrittweise erklärt. Die Anforderungen an die Anruferliste und auszulösende Aktionen werden folgend kurz dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Anforderungen an die Anruferliste ===&lt;br /&gt;
* Liste mit der Möglichkeit die letzten fünf über die Fritz!Box angenommenen und getätigten Anrufe darzustellen&lt;br /&gt;
* die Liste soll den letzen Anruf in der ersten Zeile anzeigen&lt;br /&gt;
* der Status des Anrufes ist über ein Symbol ersichtlich&lt;br /&gt;
* Name und Nummer des Angerufenen / Anrufenden sind ersichtlich&lt;br /&gt;
&lt;br /&gt;
=== Anforderungen an die Möglichkeit Aktionen auszulösen ===&lt;br /&gt;
* Aktionen können in Abhängigkeit von Status des Anrufes ausgeführt werden&lt;br /&gt;
* Aktionen können auch gekapselt werden&lt;br /&gt;
&lt;br /&gt;
=== durchzuführende Schritte ===&lt;br /&gt;
Die Reihenfolge ist hier unerheblich. Die Liste soll lediglich einen groben Überblick über die folgenden einzelnen Schritte zur Orientierung geboten werden&lt;br /&gt;
* 99_myUtilsTelefon.pm erstellen (bitte zuerst durchführen)&lt;br /&gt;
* UserReadings im Callmonitor in FHEM einrichten&lt;br /&gt;
* Readingsgroup erstellen, die die UserReadings anzeigt&lt;br /&gt;
* Notify erstellen, das die Telefonaktionen aufruft&lt;br /&gt;
* in Abhängigkeit vom Anrufstatus auszulösende Aktionen einbinden&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Aktivierter Callmonitor in der Fritz!Box ===&lt;br /&gt;
Damit das Modul Callmonitor in FHEM überhaupt arbeitet, muss zuerst in der Fritz!Box der Callmonitor eingeschalten werden. Das geht am einfachsten, indem man von einem direkt an die Fritz!Box angeschlossenen Telefon die Nummer #96*5* wählt.&lt;br /&gt;
&lt;br /&gt;
=== Funktionierendes Modul Callmonitor in FHEM ===&lt;br /&gt;
Ist bereits das Modul Callmonitor in FHEM aktiv, muss es natürlich nicht extra eingerichtet werden. Wie das funktioniert erklärt sehr gut der Artikel [[FB CALLMONITOR]].&lt;br /&gt;
&lt;br /&gt;
=== Anlegen einer Datei 99_myUtilsTelefon.pm ===&lt;br /&gt;
Die Datei 99_myUtilsTelefon.pm wird den Perlcode aufnehmen, der die Anruferliste sowie die damit verknüpften Aktionen ausführt. Das Prinzip, um die 99_myUtilsTelefon.pm zu erstellen die exakt das gleich wie wenn man eine [[99 myUtils anlegen]] möchte. In unserem konkreten Fall soll die Datei allerdings den Namen 99_myUtilsTelefon.pm erhalten.&lt;br /&gt;
&lt;br /&gt;
Bitte diesen Schritt nun ausführen, damit später das Script nur noch in die 99_myUtilsTelefon.pm kopiert werden muss.&lt;br /&gt;
&lt;br /&gt;
Natürlich muss auch die 99_myUtilsTelefon.pm nach jeder Anpassung an eigene Bedürfnisse neu geladen werden.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die fhem.cfg :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6763</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6763"/>
		<updated>2014-07-06T19:39:43Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Kurzer Hinweis, dass dieser Schritt zuerst durchgeführt werden muss&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert hauptsächlich auf der Diskussion &amp;quot;Callmonitor für Anfänger&amp;quot; im FHEM-Forum [http://forum.fhem.de/index.php/topic,19238.0.html].&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem Post [[http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]] in oben genannter Diskussion entnommen. Er umfasst alle Bestandteile zum Anzeigen einer rollierenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS) sind auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Aktivierter Callmonitor in der Fritz!Box ===&lt;br /&gt;
Damit das Modul Callmonitor in FHEM überhaupt arbeitet, muss zuerst in der Fritz!Box der Callmonitor eingeschalten werden. Das geht am einfachsten, indem man von einem direkt an die Fritz!Box angeschlossenen Telefon die Nummer #96*5* wählt.&lt;br /&gt;
&lt;br /&gt;
=== Funktionierendes Modul Callmonitor in FHEM ===&lt;br /&gt;
Ist bereits das Modul Callmonitor in FHEM aktiv, muss es natürlich nicht extra eingerichtet werden. Wie das funktioniert erklärt sehr gut der Artikel [[FB CALLMONITOR]].&lt;br /&gt;
&lt;br /&gt;
=== Anlegen einer Datei 99_myUtilsTelefon.pm ===&lt;br /&gt;
Die Datei 99_myUtilsTelefon.pm wird den Perlcode aufnehmen, der die Anruferliste sowie die damit verknüpften Aktionen ausführt. Das Prinzip, um die 99_myUtilsTelefon.pm zu erstellen die exakt das gleich wie wenn man eine [[99 myUtils anlegen]] möchte. In unserem konkreten Fall soll die Datei allerdings den Namen 99_myUtilsTelefon.pm erhalten.&lt;br /&gt;
&lt;br /&gt;
Bitte diesen Schritt nun ausführen, damit später das Script nur noch in die 99_myUtilsTelefon.pm kopiert werden muss.&lt;br /&gt;
&lt;br /&gt;
Natürlich muss auch die 99_myUtilsTelefon.pm nach jeder Anpassung an eigene Bedürfnisse neu geladen werden.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die fhem.cfg :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6762</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6762"/>
		<updated>2014-07-06T19:30:51Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: /* Funktionierendes Modul Callmonitor in FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert hauptsächlich auf der Diskussion &amp;quot;Callmonitor für Anfänger&amp;quot; im FHEM-Forum [http://forum.fhem.de/index.php/topic,19238.0.html].&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem Post [[http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]] in oben genannter Diskussion entnommen. Er umfasst alle Bestandteile zum Anzeigen einer rollierenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS) sind auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Aktivierter Callmonitor in der Fritz!Box ===&lt;br /&gt;
Damit das Modul Callmonitor in FHEM überhaupt arbeitet, muss zuerst in der Fritz!Box der Callmonitor eingeschalten werden. Das geht am einfachsten, indem man von einem direkt an die Fritz!Box angeschlossenen Telefon die Nummer #96*5* wählt.&lt;br /&gt;
&lt;br /&gt;
=== Funktionierendes Modul Callmonitor in FHEM ===&lt;br /&gt;
Ist bereits das Modul Callmonitor in FHEM aktiv, muss es natürlich nicht extra eingerichtet werden. Wie das funktioniert erklärt sehr gut der Artikel [[FB CALLMONITOR]].&lt;br /&gt;
&lt;br /&gt;
=== Anlegen einer Datei 99_myUtilsTelefon.pm ===&lt;br /&gt;
Die Datei 99_myUtilsTelefon.pm wird den Perlcode aufnehmen, der die Anruferliste sowie die damit verknüpften Aktionen ausführt. Das Prinzip, um die 99_myUtilsTelefon.pm zu erstellen die exakt das gleich wie wenn man eine [[99 myUtils anlegen]] möchte. In unserem konkreten Fall soll die Datei allerdings den Namen 99_myUtilsTelefon.pm erhalten.&lt;br /&gt;
&lt;br /&gt;
Natürlich muss auch die 99_myUtilsTelefon.pm nach jeder Anpassung an eigene Bedürfnisse neu geladen werden.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die fhem.cfg :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6761</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6761"/>
		<updated>2014-07-06T19:29:26Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert hauptsächlich auf der Diskussion &amp;quot;Callmonitor für Anfänger&amp;quot; im FHEM-Forum [http://forum.fhem.de/index.php/topic,19238.0.html].&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem Post [[http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]] in oben genannter Diskussion entnommen. Er umfasst alle Bestandteile zum Anzeigen einer rollierenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS) sind auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Aktivierter Callmonitor in der Fritz!Box ===&lt;br /&gt;
Damit das Modul Callmonitor in FHEM überhaupt arbeitet, muss zuerst in der Fritz!Box der Callmonitor eingeschalten werden. Das geht am einfachsten, indem man von einem direkt an die Fritz!Box angeschlossenen Telefon die Nummer #96*5* wählt.&lt;br /&gt;
&lt;br /&gt;
=== Funktionierendes Modul Callmonitor in FHEM ===&lt;br /&gt;
Ist bereits das Modul Callmonitor in FHEM aktiv, muss es natürlich nicht extra eingerichtet werden. Wie das funktioniert erklärt sehr gut der Artikel &lt;br /&gt;
&lt;br /&gt;
=== Anlegen einer Datei 99_myUtilsTelefon.pm ===&lt;br /&gt;
Die Datei 99_myUtilsTelefon.pm wird den Perlcode aufnehmen, der die Anruferliste sowie die damit verknüpften Aktionen ausführt. Das Prinzip, um die 99_myUtilsTelefon.pm zu erstellen die exakt das gleich wie wenn man eine [[99 myUtils anlegen]] möchte. In unserem konkreten Fall soll die Datei allerdings den Namen 99_myUtilsTelefon.pm erhalten.&lt;br /&gt;
&lt;br /&gt;
Natürlich muss auch die 99_myUtilsTelefon.pm nach jeder Anpassung an eigene Bedürfnisse neu geladen werden.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die fhem.cfg :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6760</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6760"/>
		<updated>2014-07-06T19:18:26Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert hauptsächlich auf der Diskussion &amp;quot;Callmonitor für Anfänger&amp;quot; im FHEM-Forum [http://forum.fhem.de/index.php/topic,19238.0.html].&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem Post [[http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]] in oben genannter Diskussion entnommen. Er umfasst alle Bestandteile zum Anzeigen einer rollierenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS) sind auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Aktivierter Callmonitor in der Fritz!Box ===&lt;br /&gt;
Damit das Modul Callmonitor in FHEM überhaupt arbeitet, muss zuerst in der Fritz!Box der Callmonitor eingeschalten werden. Das geht am einfachsten, indem man von einem direkt an die Fritz!Box angeschlossenen Telefon die Nummer #96*5* wählt.&lt;br /&gt;
&lt;br /&gt;
=== Anlegen einer Datei 99_myUtilsTelefon.pm ===&lt;br /&gt;
Wie &lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die fhem.cfg :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6758</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6758"/>
		<updated>2014-07-06T18:56:15Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert hauptsächlich auf der Diskussion &amp;quot;Callmonitor für Anfänger&amp;quot; im FHEM-Forum [http://forum.fhem.de/index.php/topic,19238.0.html].&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist einem Post [[http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]] in oben genannter Diskussion entnommen.&lt;br /&gt;
&lt;br /&gt;
Der Code umfasst alle Bestandteile zum Anzeigen einer autom. scrollenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS, habe ich auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die fhem.cfg :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6757</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6757"/>
		<updated>2014-07-06T18:47:20Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Callmonitor mit Anruferliste und Zusatzfunktionen &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Eintrag basiert haupsächlich auf diesem Post: [http://forum.fhem.de/index.php/topic,19238.msg163260.html#msg163260]&amp;lt;br&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Der hier gezeigte Beispielcode ist die von mir derzeit (Juni 2014) genutze Variante des Callmonitor mit Zusatzfunktionen, auf der Basis des o.g. Posts und des übrigen Threads &amp;quot;Callmonitor für Anfänger&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Der Code umfasst alle Bestandteile zum Anzeigen einer autom. scrollenden Anruferliste. &lt;br /&gt;
&lt;br /&gt;
Die Zusatzfunktionen (z.B. Floorplan- Seitenwechsel mit Anzeige des Anrufers und dessen gleichzeitiger Ansage über TTS, habe ich auskommentiert. Sie können als Anregung verstanden werden.&lt;br /&gt;
&lt;br /&gt;
Achtung: Größtes Problem bei der Implementierung scheint zu sein, dass die Bezeichnung des Callmonitors nicht einheitlich durchgehalten wird.&lt;br /&gt;
In diesem Beispiel heißt er: &amp;quot;my_callmonitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die fhem.cfg :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Logfile der Anrufe (Fritzbox)&lt;br /&gt;
define FileLog_my_callmonitor FileLog /opt/fhem/log/my_callmonitor-%Y.log my_callmonitor&lt;br /&gt;
attr FileLog_my_callmonitor logtype text&lt;br /&gt;
attr FileLog_my_callmonitor room 4_Logdaten&lt;br /&gt;
&lt;br /&gt;
# Callmonitor mit rollierender Anruferliste:&lt;br /&gt;
define my_callmonitor FB_CALLMONITOR 192.168.1.1:1012&lt;br /&gt;
attr my_callmonitor group Connections&lt;br /&gt;
attr my_callmonitor icon phone_call&lt;br /&gt;
attr my_callmonitor local-area-code 030&lt;br /&gt;
attr my_callmonitor reverse-search all&lt;br /&gt;
attr my_callmonitor reverse-search-cache-file /opt/fhem/callmoncache.txt&lt;br /&gt;
attr my_callmonitor reverse-search-phonebook-file /opt/fhem/fb_phonebook.xml&lt;br /&gt;
attr my_callmonitor room 5_System&lt;br /&gt;
attr my_callmonitor userReadings eing0 eing1 eing2 eing3 eing4 A0 A1 A2 A3 A4 B0 B1 B2 B3 B4 C0 C1 C2 C3 C4 D0 D1 D2 D3 D4 E0 E1 E2 E3 E4&lt;br /&gt;
attr my_callmonitor verbose 0&lt;br /&gt;
#attr my_callmonitor reverse-search-cache 1&lt;br /&gt;
#attr my_callmonitor reverse-search internal|klicktel.de|dasoertliche.de&lt;br /&gt;
&lt;br /&gt;
# Anrufer Anzeigen:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige des Namen:&lt;br /&gt;
define Dum_TelMon_ShowNa_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNa_D fp_9_Telefon 23,209,0,Eingehender Anruf von:&lt;br /&gt;
attr Dum_TelMon_ShowNa_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNa_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Dummy zur Anzeige der Nummer:&lt;br /&gt;
define Dum_TelMon_ShowNu_D dummy&lt;br /&gt;
#attr Dum_TelMon_ShowNu_D fp_9_Telefon 165,278,0,Telefonnummer:&lt;br /&gt;
attr Dum_TelMon_ShowNu_D group Programm&lt;br /&gt;
attr Dum_TelMon_ShowNu_D room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon klingelt, wechsle zum FP &amp;quot;Telefon&amp;quot;,zeige und sage Anrufer an:&lt;br /&gt;
#define Func_TelMon_Show_N notify my_callmonitor:event:.ring { \&lt;br /&gt;
#my $intum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;internal_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extnum = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_number&amp;quot;, undef);;\&lt;br /&gt;
#my $extname = ReadingsVal(&amp;quot;my_callmonitor&amp;quot;, &amp;quot;external_name&amp;quot;, undef);;\&lt;br /&gt;
#\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNa_D $extname&amp;quot;;;\&lt;br /&gt;
#fhem &amp;quot;set Dum_TelMon_ShowNu_D $extnum&amp;quot;;;\&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/9_Telefon&amp;quot;);;\&lt;br /&gt;
#\&lt;br /&gt;
#   if ($extname eq &amp;quot;unknown&amp;quot;){\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts Rufnummer unterdrückt&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#   else {\&lt;br /&gt;
#      fhem(&amp;quot;define Melde_Anrufer_A at +00:00:01 set TTS tts $extname.&amp;quot;);;\&lt;br /&gt;
#   }\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Show_N group Programm&lt;br /&gt;
#attr Func_TelMon_Show_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Wenn Telefon aufgelegt, wechsle zum Haupt-FP:&lt;br /&gt;
#define Func_TelMon_Back_N notify my_callmonitor:event:.disconnect { \&lt;br /&gt;
#fhem(&amp;quot;set Dum_pageswap_D /fhem/floorplan/0_Hauptbildschirm&amp;quot;);;\&lt;br /&gt;
#}&lt;br /&gt;
#attr Func_TelMon_Back_N group Programm&lt;br /&gt;
#attr Func_TelMon_Back_N room 5_System&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Anrufliste genereieren:&lt;br /&gt;
#########################&lt;br /&gt;
&lt;br /&gt;
# Telefonevents für Anrufliste abfangen:&lt;br /&gt;
define Func_TelMon_N notify my_callmonitor:.* { \&lt;br /&gt;
   TelefonMonitor ($EVENT);; \&lt;br /&gt;
}&lt;br /&gt;
attr Func_TelMon_N group Programm&lt;br /&gt;
attr Func_TelMon_N room 5_System&lt;br /&gt;
&lt;br /&gt;
# Anzeige der Anrufliste generieren:&lt;br /&gt;
define Anrufliste readingsGroup my_callmonitor:A0,B0,C0,D0,E0 my_callmonitor:A1,B1,C1,D1,E1 my_callmonitor:A2,B2,C2,D2,E2 my_callmonitor:A3,B3,C3,D3,E3 my_callmonitor:A4,B4,C4,D4,E4&lt;br /&gt;
attr Anrufliste fp_9_Telefon 370,206,0,Anrufliste&lt;br /&gt;
attr Anrufliste mapping &amp;amp;nbsp&lt;br /&gt;
attr Anrufliste nameStyle style=&amp;quot;font-weight:bold&amp;quot;&lt;br /&gt;
attr Anrufliste noheading 0&lt;br /&gt;
attr Anrufliste nolinks 1&lt;br /&gt;
attr Anrufliste nostate 1&lt;br /&gt;
attr Anrufliste notime 1&lt;br /&gt;
attr Anrufliste room 0_Überblick&lt;br /&gt;
attr Anrufliste style style=&amp;quot;font-size:20px&amp;quot;&lt;br /&gt;
attr Anrufliste valueIcon {&#039;A0.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A0.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A0.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A0.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A0.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;, &#039;A1.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A1.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A1.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A1.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A1.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A2.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A2.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A2.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A2.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A2.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A3.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A3.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A3.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A3.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A3.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;,&#039;A4.out_connected&#039; =&amp;gt; &#039;phone_call_out@lightgreen&#039;, &#039;A4.out_notconnected&#039; =&amp;gt; &#039;phone_call_out@red&#039;,&#039;A4.in_connected&#039; =&amp;gt; &#039;phone_call_in@lightgreen&#039;,&#039;A4.in_notconnected&#039; =&amp;gt; &#039;phone_call_in@red&#039;, &#039;A4.AB&#039; =&amp;gt; &#039;audio_volume_mid@lightgreen&#039;}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In die 99_myUtilsTelefon.pm :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#################################################&lt;br /&gt;
# $Id: 99_myUtilsTelefon.pm 1932 2012-10-06 20:15:33Z ulimaass $&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use POSIX;&lt;br /&gt;
use FritzBoxUtils;&lt;br /&gt;
&lt;br /&gt;
# fuer Telefonanrufe&lt;br /&gt;
our @A;&lt;br /&gt;
our @B;&lt;br /&gt;
our @C;&lt;br /&gt;
our @D;&lt;br /&gt;
our @E;&lt;br /&gt;
our %TelefonAktionsListe;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub myUtilsTelefon_Initialize($$) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    #...&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
################################################################&lt;br /&gt;
&lt;br /&gt;
sub SendSMS ($$) {&lt;br /&gt;
    my $adress = $_[0] . &#039;@sms.kundenserver.de&#039;;&lt;br /&gt;
    my $body   = $_[1];&lt;br /&gt;
    Log( 3, &amp;quot;SendSMS: $adress - $body&amp;quot; );&lt;br /&gt;
    FB_mail( $adress, &amp;quot;&amp;quot;, $body );&lt;br /&gt;
&lt;br /&gt;
    # end sub SendSMS&lt;br /&gt;
}&lt;br /&gt;
#####################################&lt;br /&gt;
# Anruffunktionen ueber Fritzbox&lt;br /&gt;
&lt;br /&gt;
sub FBCall ($$) {&lt;br /&gt;
&lt;br /&gt;
    my $callnr   = $_[0];&lt;br /&gt;
    my $duration = $_[1];&lt;br /&gt;
&lt;br /&gt;
    Log( 3, &amp;quot;FBCall: $callnr mit Dauer $duration&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    $callnr = &amp;quot;ATDT&amp;quot; . $callnr . &amp;quot;#&amp;quot;;&lt;br /&gt;
    my $ret = &amp;quot;ATD: &amp;quot; . `echo $callnr | nc 127.0.0.1 1011`;&lt;br /&gt;
    InternalTimer( gettimeofday() + $duration, &amp;quot;FBHangOn&amp;quot;, &amp;quot;&amp;quot;, 0 );&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub FBHangOn () {&lt;br /&gt;
    Log( 3, &amp;quot;FBCallHangOn aufgerufen&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    my $ret = &amp;quot; ATH: &amp;quot; . `echo &amp;quot;ATH&amp;quot; | nc 127.0.0.1 1011`;&lt;br /&gt;
    $ret =~ s,[\r\n]*,,g;&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonAktion($$) {&lt;br /&gt;
&lt;br /&gt;
    # es wird der Name und die interne angerufene Nummer uebergeben&lt;br /&gt;
&lt;br /&gt;
    my ($caller) = split( &#039;\(&#039;, $_[0] );&lt;br /&gt;
    $caller = ltrim( rtrim($caller) );&lt;br /&gt;
&lt;br /&gt;
    my $intern = $_[1];&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TelefonAktion: $caller $intern&amp;quot;);&lt;br /&gt;
    # Sound ausgeben&lt;br /&gt;
&lt;br /&gt;
    my $com = $main::TelefonAktionsListe{$caller};&lt;br /&gt;
&lt;br /&gt;
    if ($com) {&lt;br /&gt;
        Log( 3, &amp;quot;TelefonAktion: commando: $com&amp;quot; );&lt;br /&gt;
        sig2_repeat( $com, 5, 4 );&lt;br /&gt;
    }    # falls commando vorhanden&lt;br /&gt;
&lt;br /&gt;
}    # end sub TelefonAktion&lt;br /&gt;
&lt;br /&gt;
######################################&lt;br /&gt;
&lt;br /&gt;
sub TelefonMonitor($) {&lt;br /&gt;
    our $extnum;&lt;br /&gt;
    our $intnum;&lt;br /&gt;
    our $extname;&lt;br /&gt;
    our $callID;&lt;br /&gt;
    our $callDuration;&lt;br /&gt;
    # Anrufdauer als Integervariable speichern&lt;br /&gt;
    our $intCallDuration;  &lt;br /&gt;
    our $stat;&lt;br /&gt;
    our @lastPhoneEvent;&lt;br /&gt;
    my $i;&lt;br /&gt;
    my $j;&lt;br /&gt;
    our $ab;&lt;br /&gt;
    my $my_callmonitor = $defs{&amp;quot;my_callmonitor&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    my ( $event, $arg ) = split( &#039;:&#039;, $_[0] );&lt;br /&gt;
    $arg = ltrim($arg);&lt;br /&gt;
&lt;br /&gt;
    # Log(3,&amp;quot;TM: event: $event arg: $arg&amp;quot;);&lt;br /&gt;
    if ( $event eq &amp;quot;event&amp;quot; ) {&lt;br /&gt;
        $stat = $arg;&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if event&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;ring&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;internal_number&amp;quot; ) {&lt;br /&gt;
            $intnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if intnum&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            &lt;br /&gt;
            # hier koennen wir eine anrufgesteuerte Aktion starten&lt;br /&gt;
            TelefonAktion( $extname, $intnum );&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if ring loop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;connect&amp;quot; ) {&lt;br /&gt;
        if ( ( $event eq &amp;quot;internal_connection&amp;quot; ) &amp;amp;&amp;amp; ( $arg =~ m/Answering_Machine_.*/ ) )&lt;br /&gt;
        {&lt;br /&gt;
            $ab = &amp;quot;AB&amp;quot;;&lt;br /&gt;
        }    # end if internal_connection&lt;br /&gt;
    }    # end if connect&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
        if ( $event eq &amp;quot;external_number&amp;quot; ) {&lt;br /&gt;
            $extnum = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if external number&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;external_name&amp;quot; ) {&lt;br /&gt;
            $extname = $arg;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID     = $arg;&lt;br /&gt;
&lt;br /&gt;
            $B[$callID] = EventZeit();&lt;br /&gt;
            $C[$callID] = $extname;&lt;br /&gt;
            $D[$callID] = $extnum;&lt;br /&gt;
            &lt;br /&gt;
            $lastPhoneEvent[$callID] = $stat;&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
        return;&lt;br /&gt;
    }    # end if callloop&lt;br /&gt;
&lt;br /&gt;
    if ( $stat eq &amp;quot;disconnect&amp;quot; ) {&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_duration&amp;quot; ) {&lt;br /&gt;
            $intCallDuration = $arg;&lt;br /&gt;
            $callDuration = sprintf( &amp;quot;%2d:%02d&amp;quot;, ( $arg / 60 ), $arg % 60 );&lt;br /&gt;
            return;&lt;br /&gt;
        }    # if call_duration&lt;br /&gt;
        &lt;br /&gt;
        if ( $lastPhoneEvent[$callID] eq &amp;quot;call&amp;quot; ) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
            } elsif ( $intCallDuration gt 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;out_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein eingehender Anruf war, der angenommen wurde&lt;br /&gt;
            }&lt;br /&gt;
        } elsif ( $lastPhoneEvent[$callID] eq &amp;quot;ring&amp;quot;) {&lt;br /&gt;
            if ( $intCallDuration eq 0 ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;in_notconnected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der nicht angenommen wurde&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ( $ab eq &amp;quot;AB&amp;quot; ) {&lt;br /&gt;
                $A[$callID] = &amp;quot;AB&amp;quot;;&lt;br /&gt;
                $ab = undef;&lt;br /&gt;
                # hier notieren was passieren soll, wenn der AB dranging&lt;br /&gt;
&lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            } elsif ($intCallDuration gt 0 ){&lt;br /&gt;
                $A[$callID] = &amp;quot;in_connected&amp;quot;;&lt;br /&gt;
                # hier notieren was passieren soll, wenn es ein ausgehender Anruf war, der angenommen wurde&lt;br /&gt;
                &lt;br /&gt;
                $intCallDuration = undef;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        #hier notieren was generell passieren soll, sobald ein Anruf beendet wurde (egal ob angenommen, nicht angenommen, aus- oder eingehend oder der AB dranging)&lt;br /&gt;
&lt;br /&gt;
        if ( $event eq &amp;quot;call_id&amp;quot; ) {&lt;br /&gt;
            $callID = $arg;&lt;br /&gt;
&lt;br /&gt;
            # shiften der alten Inhalte&lt;br /&gt;
            my $tt;&lt;br /&gt;
            readingsBeginUpdate($my_callmonitor);&lt;br /&gt;
&lt;br /&gt;
            for ( $i = 4 ; $i &amp;gt; 0 ; $i-- ) {&lt;br /&gt;
                foreach $j ( &#039;A&#039; .. &#039;E&#039; ) {&lt;br /&gt;
&lt;br /&gt;
                    #   $defs{&amp;quot;my_callmonitor&amp;quot;}{READINGS}{$j.($i-1)}{VAL};&lt;br /&gt;
&lt;br /&gt;
                    $tt = ReadingsVal( &amp;quot;my_callmonitor&amp;quot;, $j . ( $i - 1 ), &amp;quot;-&amp;quot; );&lt;br /&gt;
                    readingsBulkUpdate( $my_callmonitor, $j . $i, $tt );&lt;br /&gt;
                }    # end j&lt;br /&gt;
            }    # end i&lt;br /&gt;
            $E[$callID] = $callDuration;&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;A0&amp;quot;, $A[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;B0&amp;quot;, $B[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;C0&amp;quot;, $C[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;D0&amp;quot;, $D[$callID] );&lt;br /&gt;
            readingsBulkUpdate( $my_callmonitor, &amp;quot;E0&amp;quot;, $E[$callID] );&lt;br /&gt;
&lt;br /&gt;
            readingsEndUpdate( $my_callmonitor, 1 );&lt;br /&gt;
            $stat = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }    # end if callid&lt;br /&gt;
&lt;br /&gt;
    }    # end if disconnect&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
}    #end sub TelefonMonitor&lt;br /&gt;
&lt;br /&gt;
sub EventZeit() {&lt;br /&gt;
    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =&lt;br /&gt;
      localtime( time() );&lt;br /&gt;
    return sprintf(&lt;br /&gt;
        &amp;quot;%2d:%02d:%02d %2d.%02d.%4d&amp;quot;,&lt;br /&gt;
        $hour, $min, $sec, $mday,&lt;br /&gt;
        ( $mon + 1 ),&lt;br /&gt;
        ( $year + 1900 )&lt;br /&gt;
    );&lt;br /&gt;
}    # end sub EventZeit&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
&lt;br /&gt;
== Beschreibung der Funktion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6248</id>
		<title>Benutzer:Zephyr/Telefonat als Auslöser für Aktionen</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Zephyr/Telefonat_als_Ausl%C3%B6ser_f%C3%BCr_Aktionen&amp;diff=6248"/>
		<updated>2014-05-09T19:53:01Z</updated>

		<summary type="html">&lt;p&gt;Zephyr: Die Seite wurde neu angelegt: „Im FHEM-Forum wurde im Diskussionsfaden [http://forum.fhem.de/index.php/topic,19238.135.html] über mehrere Schritte eine Anrufliste mit Hilfe des Moduls FB Ca…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im FHEM-Forum wurde im Diskussionsfaden [http://forum.fhem.de/index.php/topic,19238.135.html] über mehrere Schritte eine Anrufliste mit Hilfe des Moduls FB Callmonitor programmiert.&lt;/div&gt;</summary>
		<author><name>Zephyr</name></author>
	</entry>
</feed>