<?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=Sidey</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=Sidey"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Sidey"/>
	<updated>2026-04-11T07:04:07Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=38242</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=38242"/>
		<updated>2023-04-02T09:24:31Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Aktualisierung auf aktuellen Stand, Pflege von Hyperlinks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Wo finde ich was/welche Info?&lt;br /&gt;
;Hardware&lt;br /&gt;
#SIGNALDuino ((noch) &amp;quot;hier&amp;quot;)&lt;br /&gt;
#[[Selbstbau CUL]]&lt;br /&gt;
#[[Maple-SignalDuino]]&lt;br /&gt;
#[[ESP32-SignalDuino]]&lt;br /&gt;
;Firmware&lt;br /&gt;
#&amp;quot;Sidey&amp;quot; - [[SIGNALduino#Flashen_des_Arduino_mit_der_SIGNALduino_Firmware|mittels Modul]]&lt;br /&gt;
#&amp;quot;Ralf9&amp;quot; - [https://github.com/Ralf9/SIGNALDuino Github]&lt;br /&gt;
;FHEM Modul&lt;br /&gt;
#&amp;quot;Sidey&amp;quot; - [[SIGNALduino]] (&amp;quot;hier&amp;quot;)&lt;br /&gt;
#&amp;quot;Ralf9&amp;quot; - {{Link2Forum|Topic=111653|Linktext=hier beschrieben}}&lt;br /&gt;
}}&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles Weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (z.B. Raspberry) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt änderbarer/updatebarer Rechner-Seite). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung auf Stick-Firmware-Seite korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichenden Frequenzen steuerbar sind. So empfangen die &#039;&#039;Somfy&#039;&#039;-Rolladenmotoren beispielsweise auf 433.42 MHz und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen; dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt. In FHEM existieren inzwischen zwei verschiedene Versionen: eine offizielle (Maintainer ist Sidey) und eine inoffizielle (Maintainer ist Ralf9). Die offizielle Version wird über den update-Prozess verteilt, wer die inoffizielle nutzen will, muss hier händisch eingreifen. Beide Versionen sind inzwischen so weit entwickelt, dass sie nicht mehr ohne Weiteres kompatibel sind. Man muss also eine Entscheidung treffen, welches das für einen geeignete Modul ist. Das betrifft inzwischen nicht nur das eigentliche SIGNALduino.pm-Modul, sondern auch die dazugehörige Firmware.&lt;br /&gt;
&lt;br /&gt;
==== Offizielles Modul (Sidey) ====&lt;br /&gt;
Die offizielle Version wird in mehreren Forenbeiträgen beschrieben:  {{Link2Forum|Topic=58397|Linktext=erster Beitrag]}} (inzwischen geschlossen), {{Link2Forum|Topic=58396|LinkText=weiterer Thread}} sowie {{Link2Forum|Topic=60170|Linktext=noch ein Thread}}.&lt;br /&gt;
&lt;br /&gt;
An einem weiteren Thread ({{Link2Forum|Topic=58396|Linktext=Link}}) scheinen beide Autoren beteiligt zu sein.&lt;br /&gt;
&lt;br /&gt;
==== Inoffizielles Modul (Ralf9) ====&lt;br /&gt;
Das Modul von Ralf9 wird {{Link2Forum|Topic=111653|Linktext=hier}} beschrieben. Wer es installieren möchte, muss beim üblichen update-Prozess das Modul 00_SIGNALduino.pm vom [[update]] (Attribut &#039;&#039;[[Update#exclude from update|exclude from update]]&#039;&#039;) ausschließen oder nach jedem Update erneut Ralf9s-Modul herunterladen. Die Installation des Moduls wird im ersten Post beschrieben, Hilfe gibt es auch in diesem Thread. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;Aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum FHEMduino &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, Link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist momentan die Übersetzung mittels [https://platformio.org/ Plattform IO]. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] oder [https://de.wikipedia.org/wiki/ESP32 ESP32] nativ läuft.&lt;br /&gt;
&lt;br /&gt;
Auch an den &amp;quot;ESP8266&amp;quot; oder &amp;quot;ESP32&amp;quot; kann ein [[Selbstbau CUL|CC1101]] Modul via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP 8266 Pin&lt;br /&gt;
!ESP 32 PIN&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|D18&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|D23&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|D19&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|D5&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|D4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|D13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird eine einfache Empfänger / Sender Kombination verwendet, dann über die Pins:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP 8266 Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) - es wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltagstauglichen Zustand haben. Aktuell wird dort die Version 3.5.4 seit 06.01.2023 verteilt.&lt;br /&gt;
&lt;br /&gt;
Mit Version 3.5.x ist die Unterstützung für Geräte mit &#039;&#039;&#039;FSK&#039;&#039;&#039;-Modulation integriert.&lt;br /&gt;
&lt;br /&gt;
Die aktuell in Entwicklung befindliche Version kann über folgende Vorgehensweise installiert werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/master&amp;lt;nowiki/&amp;gt;/controls_signalduino.txt&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&amp;lt;code&amp;gt;&amp;lt;nowiki/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Es empfiehlt sich, die Github-Quelle dauerhaft einzutragen: &amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/master/controls_signalduino.txt&amp;lt;/code&amp;gt;, um weitere Entwicklungs-Updates zu bekommen, und damit das nächste Standard-&amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; nicht die alte Version wieder einspielt.&lt;br /&gt;
&lt;br /&gt;
Das Gerät kann wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen, ist die Syntax (ebenso wird auch vorgegangen wenn der SIGNALduino beispielsweise über ser2net freigeben wird):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 -  &lt;br /&gt;
&lt;br /&gt;
Verbindungsversuche via telnet müssen dieselbe Baudrate verwenden. &lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
Wenn ein miniCUL geflasht werden soll, sind einige Besonderheiten zu beachten. Details dazu in {{Link2Forum|Topic=114413|LinkText=diesem Forenthema}}.&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Die Version 3.4 ist die aktuell stabile Version.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut &amp;lt;code&amp;gt;hardware&amp;lt;/code&amp;gt; auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl &amp;lt;code&amp;gt;availableFirmware&amp;lt;/code&amp;gt; werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut &amp;lt;code&amp;gt;updateChannelFW&amp;lt;/code&amp;gt; kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten Version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut &amp;lt;code&amp;gt;flashCommand&amp;lt;/code&amp;gt; hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|Conrad RSL Funkschalter||E S|| || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen &#039;&#039;Intertechno&#039;&#039;-Funksteckdosen (&#039;&#039;Brennenstuhl&#039;&#039;) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (&amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&lt;br /&gt;
&amp;lt;!-- &amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;  ... markdown lexer not yet available; use pre instead --&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Modul, welches diese Protokolle verarbeitet.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist auch kurz und knapp manuell (also ohne Modul und automatisch angelegtem Gerät).&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes [[notify]]-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich muss in diesem Moment auch eine &amp;lt;code&amp;gt;sub my_sender_trigger_indicate()&amp;lt;/code&amp;gt; definiert werden (z.B. in &amp;lt;code&amp;gt;FHEM/99_myUtils.pm&amp;lt;/code&amp;gt;), die dort z.B. als Test eine Log-Ausgabe (&amp;lt;code&amp;gt;Log3()&amp;lt;/code&amp;gt;) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (&amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und Vorzeichen): Die Zahl gibt in Mikrosekunden die Zeitdauer an, das Vorzeichen bestimmt, ob es sich um eine gesendetes Signal gehandelt hat (positives Vorzeichen) oder ob das Signal gerade pausierte (negatives Vorzeichen). Insofern ist die Beschreibung &amp;quot;negatives Signal&amp;quot; irreführend - es gab in der Zeitspanne gerade kein Signal. Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde 395 Mikrosekunden (P1) ein Signal gesendet (weil P1=&#039;&#039;&#039;+&#039;&#039;&#039;395), danach gab es 8916 Mikrosekunden kein Signal (Pause, wegen P5=&#039;&#039;&#039;-&#039;&#039;&#039;8196).  CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MN : Nachrichten dieser Art wurden vom cc1101 vor bearbeitet. Die Nachrichten dieser Art enthalten unter D= den Empfangenen Datensatz hexadezimal codiert. Der Wert R= gibt die Empfangsstärke, auch hexadezimal an.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MN;D=3002925F3A1E7B6C000200002584;R=43;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Internet-Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise folgende Bits-Bereiche enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Daten-Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich (identisch) erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut &amp;lt;code&amp;gt;WhitelistID&amp;lt;/code&amp;gt; minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die &amp;lt;code&amp;gt;WhitelistID&amp;lt;/code&amp;gt; aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann der Tabelle [[#Unterstützte Geräte|Unterstützte Geräte]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das Signal so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;Rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegebenen Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut &amp;lt;code&amp;gt;ITClock&amp;lt;/code&amp;gt; eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt Geräte-Instanz-spezifische Konfiguration) das &amp;lt;code&amp;gt;ITclock&amp;lt;/code&amp;gt; eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
&lt;br /&gt;
=== Modul-Initialisierung ===&lt;br /&gt;
&lt;br /&gt;
==== Perl-Modul Digest::CRC fehlt ====&lt;br /&gt;
&lt;br /&gt;
Das FHEM-Log kann (bei Version ab 3.5.x) folgendes enthalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Can&#039;t locate Digest/CRC.pm in @INC (you may need to install the Digest::CRC module) (@INC contains: fhem.p/lib fhem.p/FHEM/lib ./FHEM/lib ./lib ./FHEM ./ /usr/local/FHEM/share/fhem/FHEM/lib /opt/fhem . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/arm-linux-gnueabihf/perl5/5.28 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at ./FHEM/00_SIGNALduino.pm line 28, &amp;lt;$fh&amp;gt; line 1870.&lt;br /&gt;
BEGIN failed--compilation aborted at ./FHEM/00_SIGNALduino.pm line 28, &amp;lt;$fh&amp;gt; line 1870.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Fall ist der Transceiver nicht funktionsfähig - es muss erst Perl-Modul &amp;lt;code&amp;gt;Digest::CRC&amp;lt;/code&amp;gt; (Ubuntu und Debian: Package &amp;lt;code&amp;gt;libdigest-crc-perl&amp;lt;/code&amp;gt;) installiert werden und fhem neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von Firmware/Hardware (Reset usw.) ===&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl im Modul direkt ausgeführt werden können. Sofern möglich, sollte die Abfrage von Werten aus dem Modul allerdings mit den dafür vorgesehenen Kommandos erfolgen, da die Rückmeldungen des &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehls nur im Logfile ab verbose 4 erscheinen. Die Befehle sind nützlich, wenn direkt auf den Microcontroller zugegriffen wird: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: &amp;lt;code&amp;gt;set raw C35&amp;lt;/code&amp;gt; führt ab verbose 4 zu einer Logausgabe folgender Art: &amp;lt;code&amp;gt;Read, msg: C35 = 0D&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die EEPROM Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2 des CC1101)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unbekannte_Funkprotokolle&amp;diff=37918</id>
		<title>Unbekannte Funkprotokolle</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unbekannte_Funkprotokolle&amp;diff=37918"/>
		<updated>2023-01-05T12:03:54Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Vorgehen zur Aktualisierung controls Datei überarbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es gibt jede Menge offiziell in FHEM unterstützte Devices und Funkprotokolle. Solange das Device Ross und Reiter benennt (Homematic, Z-Wave, Intertechno etc.), ist es einfach, dieses in FHEM einzubinden. Was aber, wenn selbst mit hinreichend gut aktualisierter Installation nichts erkannt wird und es ein No-Name Produkt ist, bei dem man nur die Hoffnung hat, dass es im Innern etwas Bekanntes beherbergt?&lt;br /&gt;
&lt;br /&gt;
Dieser Wiki-Artikel soll jenen helfen, die Geräte mit einem unbekannten Funkprotokoll an FHEM anbinden bzw. mit FHEM steuern wollen.&lt;br /&gt;
&lt;br /&gt;
Wenn hier drin irgendetwas unverständlich sein sollte (und wenn es nur deswegen sein sollte, weil es hinreichend bescheuert beschrieben ist :)), dann --&amp;gt; &amp;lt;big&amp;gt;&#039;&#039;&#039;MELDEN!&#039;&#039;&#039;&amp;lt;/big&amp;gt;, vielleicht via BenutzerSeite (oder natürlich einfach direkt verbessern) - die Usability dieses Projekts sollte sehr gut werden...&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel soll eine möglichst gut chronologische Sortierung haben, also:&lt;br /&gt;
&lt;br /&gt;
Einführung ... erste Schritte ... Tests ... Analyse ... stabiler Betrieb ... Verfeinerung / letzte Schritte (Expertise-Details).&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
&lt;br /&gt;
Neben den bekannten Hardware-Dongles gibt es Selbstbaulösungen in Form eines SIGNALduino, CUL oder JeeLink. &lt;br /&gt;
&lt;br /&gt;
Diese unterscheiden sich in verschiedener Hinsicht:&lt;br /&gt;
* Sendemodul (SIGNALduino/CUL -&amp;gt; CC1101; JeeLink -&amp;gt; RF12B) [https://de.wikipedia.org/wiki/Amplitudenumtastung]&lt;br /&gt;
* Modulationsverfahren (OOK, ASK/FSK)&lt;br /&gt;
* Frequenzband (433 MHz, 868 MHz)&lt;br /&gt;
&lt;br /&gt;
(bei SIGNALduino / CUL kann manche Hardware - z.B. nanoCUL - da hardware-kompatibel, mit Projektaktivitäten von CUL &#039;&#039;oder&#039;&#039; SIGNALduino betrieben/firmware-geflasht werden; evt. ist es sogar außerdem empfehlenswert, mehrere baugleiche Geräte zu haben, um Support für SIGNALduino &#039;&#039;und&#039;&#039; CUL gleichzeitig verfügbar zu haben - evt. auch weitere Geräte mit unterschiedlichen Frequenzen: 433/868)&lt;br /&gt;
&lt;br /&gt;
==== Frequenzbereich ====&lt;br /&gt;
Für die funkbasierte Heimautomation kommen im Wesentlichen zwei Frequenzbänder in Frage: 433 und 868 MHz. Die meisten Geräte haben auf der Rückseite ein Typenschild, auf dem das Frequenzband ausgewiesen ist.&lt;br /&gt;
&lt;br /&gt;
Dann gibt es noch 2,4 GHz (WLAN, Bluetooth, Funkmaus-Chipsätze...) und 5GHz (WLAN...), diese Frequenzbänder werden in diesem Artikel aber nicht betrachtet.&lt;br /&gt;
&lt;br /&gt;
==== Modulationsverfahren ====&lt;br /&gt;
&lt;br /&gt;
So, wie vom Rundfunk (AM/FM) her bekannt, kennt man auch bei 433/868 MHz verschiedene Modulationsverfahren. &lt;br /&gt;
&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Amplitudenumtastung OOK/ASK/Amplitudenabtastung]&lt;br /&gt;
: Das Signal des Senders wird auf der angegebenen Frequenz ein-/ausgeschaltet um die Dateninformationen zu übermitteln. &lt;br /&gt;
* [https://de.wikipedia.org/wiki/Frequenzumtastung FSK/Frequenzumtastung]&lt;br /&gt;
: Der Sender überträgt den Datenstrom indem, ausgehend von der Trägerfrequenz, zwischen Frequenzen (z.B. Frequenz-Frequenzhub, Frequenz+Frequenzhub) hin- und hergeschaltet wird. Dieses Verfahren kennt verschiedene Ausprägungen: 2-FSK, 4-FSK, GFSK (Details siehe [http://www.rfwireless-world.com/Terminology/2FSK-modulation-vs-4FSK-modulation.html hier]).&lt;br /&gt;
&lt;br /&gt;
==== Encoding oder auch Leitungscode ====&lt;br /&gt;
&lt;br /&gt;
Die Art und Weise wie dieses Signal interpretiert wird, hängt wiederum vom Encoding ab. Dazu sei auf die nachfolgenden Quellen verwiesen.&lt;br /&gt;
&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Leitungscode Leitungscode (Einstieg)]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Non_Return_to_Zero NRZ]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Manchester-Code Manchester]&lt;br /&gt;
&lt;br /&gt;
Je nach verwendetem Encoding wird ggf. mehr als 1 Übertragungs-Bit für ein Datenbit benötigt. Der Empfänger erwartet z.B. einen Bitwechsel zu einem bestimmten Zeitpunkt. Eine Abfolge &lt;br /&gt;
* 100 (short high, long low) wird als 0&lt;br /&gt;
* 110 (long high, short low) wird als 1&lt;br /&gt;
interpretiert.&lt;br /&gt;
&lt;br /&gt;
Im FHEM-Forum gibt es viele freundliche Helfer, die Euch bei Bedarf den richtigen Weg weisen.&lt;br /&gt;
&lt;br /&gt;
==== Signalstruktur ====&lt;br /&gt;
&lt;br /&gt;
Ein typischer Aufbau einer Signalstruktur sieht z.B. so aus&lt;br /&gt;
&lt;br /&gt;
| Pause | Sync | Pause | Daten |&lt;br /&gt;
&lt;br /&gt;
* eine größere Pause zur Trennung der Sequenzen &lt;br /&gt;
* ein Sync-Block mit dem sich der Empfänger auf den Sender einstellt&lt;br /&gt;
* eine Pause um Sync und Daten zu trennen&lt;br /&gt;
* die eigentlichen, zu übertragenden Daten.&lt;br /&gt;
&lt;br /&gt;
Es müssen nicht immer alle Bestandteile in der übertragenen Signalstruktur vorkommen (Details siehe auch [https://de.wikipedia.org/wiki/Datenpr%C3%A4ambel Datenpräambel] oder auch [https://en.wikipedia.org/wiki/Syncword Syncword]).&lt;br /&gt;
&lt;br /&gt;
Die Sequenz wird ggf. mehrfach wiederholt &lt;br /&gt;
&lt;br /&gt;
| Pause | Sync | Pause | Daten | Pause | Sync | Pause | Daten | Pause | Sync | Pause | Daten | ...&lt;br /&gt;
&lt;br /&gt;
==== Protokoll ====&lt;br /&gt;
&lt;br /&gt;
Das ist der herstellerspezifische Teil des Signalstroms - die Daten. Hersteller haben i.d.R. ihre eigene Definition der übertragenen Datenströme. Teils werden feste Code-Sequenzen übertragen, es gibt aber auch rollierende Codes (Engl.: Rolling Codes) bei denen sich die Daten bei jeder Übertragung ändern (Fremd-Manipulations-Sicherheit). &lt;br /&gt;
&lt;br /&gt;
Mit etwas Glück erkennt z.B. SIGNALduino bereits das Protokoll, damit den Hersteller und legt automatisch ein passendes Device in FHEM an. Manchmal gibt es auch Fehlinterpretationen und das vermeintlich bekannte Device entpuppt sich als etwas anderes (Statement aus dem Forum: &amp;quot;Lösung war, wo Dooya drauf steht muss nicht immer Dooya drin stecken.&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Wie fange ich an? ==&lt;br /&gt;
&lt;br /&gt;
==== Recherche ====&lt;br /&gt;
&lt;br /&gt;
Sucht im Internet nach Informationen zu dem fraglichen Device. Zu bekannten Devices sollten sich Informationen finden lassen, die einem weiter helfen. Solltet Ihr fündig werden, verfolgt die Hinweise, wie diese Devices in FHEM eingebunden werden können.&lt;br /&gt;
&lt;br /&gt;
Evt. haben auch konkrete verwandte Projekte bereits Protokoll-Informationen über das Gerät, z.B.:&lt;br /&gt;
* [https://github.com/merbanan/rtl_433/tree/master/src/devices rtl_433: Geräte-Verzeichnis]&lt;br /&gt;
&lt;br /&gt;
Wenn sich nichts Verwertbares finden lässt, geht&#039;s mit dem nächsten Abschnitt weiter.&lt;br /&gt;
&lt;br /&gt;
==== Ansatz 1 - Versuchen ====&lt;br /&gt;
&lt;br /&gt;
Einfach probieren: Bau Dir einen [[SIGNALduino]] für das passende Frequenzband (die 433 oder 868 MHz-Variante des CC1101). Stelle im SIGNALduino-Setting die Frequenz auf die genannte ein (durch den Befehl cc1101_freq = 433.000 oder 868.000) und die Bandbreite auf das Maximum (cc1101_bWidth = 325 kHz bzw. 650 kHz). Jetzt noch das Attribut verbose auf 5 setzen und dann das FHEM-log (tail -f fhem-yyyy-mm.log) beobachten.&lt;br /&gt;
&lt;br /&gt;
Ist ein Gerät in Reichweite, das regelmäßig etwas sendet (z.B. ein Funkthermometer), sollte hin und wieder etwas empfangen werden. Wenn [[Autocreate|autocreate]] aktiv ist, werden auf Basis der erkannten, bekannten Funkprotokolle automatisch neue Devices angelegt (dabei können auch diverse Funkthermometer der Nachbarschaft auftauchen).&lt;br /&gt;
&lt;br /&gt;
Ist es ein Gerät, das sich über eine Fernbedienung steuern lässt: Eine Taste betätigen und hoffen, dass sich im FHEM-Log etwas tut. Auch hier gilt: Handelt es sich um ein bekanntes Funkprotokoll, wird automatisch ein Device angelegt, allerdings nur eines für die Gerätefamilie. Bei Baumarkt-Funksteckdosen z.B. nur das erste gefundene. Die anderen müsst Ihr manuell anlegen und die entsprechenden Codes zur Identifikation der einzelnen Steckdosen anpassen (schaut z.B. hier nach: [[Intertechno_Code_Berechnung]]). &lt;br /&gt;
&lt;br /&gt;
Solltet Ihr mit diesem Ansatz Erfolg haben, ist das schon mal gut - Euer Gerät sendet ein bekanntes Protokoll und wird unterstützt.&lt;br /&gt;
&lt;br /&gt;
Solltet Ihr etwas empfangen (MC, MS, MU), aber keine neuen Devices sehen, wird Euer Gerät möglicherweise noch nicht unterstützt. Jetzt gibt es zwei Varianten&lt;br /&gt;
* es handelt sich um ein neues, noch nicht bekanntes Protokoll -&amp;gt; postet einen Log-Ausschnitt auf [https://github.com/RFD-FHEM/RFFHEM/issues github] wie im [[SIGNALduino]]-Wiki vorgeschlagen)&lt;br /&gt;
* es handelt sich um etwas proprietäres, altes oder ähnlich kompliziertes (nicht aufgeben, weiterlesen)&lt;br /&gt;
&lt;br /&gt;
==== Ansatz 2 - Aufschrauben ====&lt;br /&gt;
&lt;br /&gt;
Fernbedienung aufschrauben, schauen welcher Chip dort verbaut ist.&lt;br /&gt;
Endgerät/Device aufschrauben, schauen welcher Chip dort verbaut ist.&lt;br /&gt;
&lt;br /&gt;
Das Teil ist zu klein? Folgende Möglichkeiten:&lt;br /&gt;
* so im Winkel gegen ein Lampenlicht halten, dass man die Schrift besonders gut lesen kann&lt;br /&gt;
* abfotografieren und das Foto vergrößern bis Ihr den Aufdruck lesen könnt&lt;br /&gt;
&lt;br /&gt;
Danach folgt dann Internet-Suchmaschine und das Studium der zugehörigen Data Sheets der Chips.&lt;br /&gt;
&lt;br /&gt;
Das gibt Euch weitere Anhaltspunkte zum Modulationsverfahren, den Frequenzen und Optionen welche diese Chips unterstützen.&lt;br /&gt;
&lt;br /&gt;
Wenn die Grundsatzfrage geklärt ist, ergeben sich die ersten Handlungsoptionen&lt;br /&gt;
* OOK-Modulation -&amp;gt; [[SIGNALduino]]&lt;br /&gt;
* ASK/FSK -&amp;gt; [[Selbstbau_CUL]] oder [[JeeLink]]&lt;br /&gt;
&lt;br /&gt;
Die Devices senden/empfangen nicht notwendigerweise auf 433 oder 868 MHz, sondern auf Frequenzen &amp;quot;knapp daneben&amp;quot;, das kann z.B. bis zu 870 MHz hochgehen. Darüber, welche Frequenz es genau ist, gibt möglicherweise der verbaute Quarz Auskunft. Meist klein, silber mit einer Gravur wie z.B. 6,70 MHz versehen. Mit Hilfe der Spezifikationen (Frequenzteiler, ...) im Datenblatt des daneben verbauten Chips lässt sich dann die tatsächliche Sende- bzw. Empfangsfrequenz errechnen.&lt;br /&gt;
&lt;br /&gt;
==== Ansatz 3 - Messen ====&lt;br /&gt;
&lt;br /&gt;
Ihr nutzt einen Spektrumanalysator. Es gibt verschiedene preisgünstige Ansätze. &lt;br /&gt;
&lt;br /&gt;
* Zum einen könnt Ihr den nrfmon-Ansatz verfolgen (siehe [https://jeelabs.net/projects/cafe/wiki/NRfMon_-_nano_Spectrum_Analyzer_with_the_RFM12B hier)]. Tipp: bestellt Euch direkt genug Material um zwei zu bauen, denn die RF12demo kann als Sender und Empfänger genutzt werden. Damit lässt sich direkt verifizieren, dass Euer RFM12B-Device wirklich sendet/empfängt.&lt;br /&gt;
* Der andere Ansatz nutzt einen DVB-T-Stick (siehe z.B. [https://homematic-forum.de/forum/viewtopic.php?t=11087 hier]. Es gibt aber viele Internet-Suchmaschine-Treffer unter dem Stichwort [https://www.mikrocontroller.net/topic/243367 SDR]. Außerdem ein konkretes Projekt: [https://github.com/merbanan/rtl_433/ rtl_433].&lt;br /&gt;
* Mein persönlicher Favorit ist der [https://github.com/jopohl/urh Universal Radio Hacker]. Mit dem war ich in der Lage, mittels RTL-SDR-Stick nicht nur Sequenzen mitzuschneiden sondern auch direkt zu analysieren.&lt;br /&gt;
&lt;br /&gt;
Wieso überhaupt so kompliziert? OOK nutzt nur eine Frequenz, FSK zwei, vier, je nach Variante. Es kann auch vorkommen (so wie bei mir), dass ein FSK-Device auf einen OOK-Sender anspricht. Der Grund dafür sind Oberwellen die mit dem Ein-/Auschalten der Frequenz einher gehen.&lt;br /&gt;
&lt;br /&gt;
Die Spektrumanalyse gibt Aufschluss über&lt;br /&gt;
* das Modulationsverfahren (OOK vs. FSK) sowie&lt;br /&gt;
* die relevante(n) Frequenz(en)&lt;br /&gt;
&lt;br /&gt;
== SIGNALduino - OOK ==&lt;br /&gt;
&lt;br /&gt;
Dieses Kapitel geht davon aus, dass ihr einen SIGNALduino für alle weiteren Schritte nutzt.&lt;br /&gt;
&lt;br /&gt;
==== Log-Meldungen ====&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino empfängt die Rohdaten, ermittelt identische Zeitscheiben und ordnet diese den Zahlen 0-7 zu (P0...P7). Ein negativer Zahlenwert bedeutet &amp;quot;kein Empfang&amp;quot; und ein positiver &amp;quot;Signal empfangen&amp;quot;. Damit lässt sich der Datenstrom analysieren und für das Senden auch wieder generieren.&lt;br /&gt;
&lt;br /&gt;
Die folgenden Pulslängen-Zahlen stehen für Mikrosekunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P0=-13020;P1=15916;P2=-398;P3=415;P4=4008;P5=-794;P6=812;D=01232323232323232323232324532653265353532653262653265326                                      26262626265353532653265326532653535326265353535353265353532653262653265353265353535353535353265326;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was bedeutet D=012323...?&lt;br /&gt;
: 0 -&amp;gt; P0=-13020 =&amp;gt; 13.020 Mikrosekunden Pause&lt;br /&gt;
: 1 -&amp;gt; P1=15916 =&amp;gt; 15.916 Mikrosekunden Signal&lt;br /&gt;
: 2 -&amp;gt; P2=-398 =&amp;gt; 398 Mikrosekunden Pause&lt;br /&gt;
: 3 -&amp;gt; P3=415 =&amp;gt; 415 Mikrosekunden Signal&lt;br /&gt;
: 2 -&amp;gt; P2=-398 =&amp;gt; 398 Mikrosekunden Pause&lt;br /&gt;
: 3 -&amp;gt; P3=415 =&amp;gt; 415 Mikrosekunden Signal&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: um hier schnell zu einem guten Analyse-Ergebnis zu kommen, sind einige verfügbare Beispiel-Zeilen sinnvoll - hier könnte folgendes hilfreich sein:&lt;br /&gt;
Bei Geräten, die nicht on-demand (Knopfdruck) Funk-Aktivität generieren können:&lt;br /&gt;
Nicht langwierig auf das jeweils nächste verzögerte Intervall der Funk-Aktivität des Geräts warten, sondern stattdessen mehrfach die Geräte-Batterien erneut wieder einsetzen, so dass (hoffentlich) das Gerät immer eine erste Funk-Aktivität sendet, die:&lt;br /&gt;
* Log-Zeitstempelmäßig genau erkennbar ist&lt;br /&gt;
* hoffentlich immer gleich/ähnlich ist --&amp;gt; gute Analyse-Grundlage&lt;br /&gt;
Damit dürfte die Funk-Aktivität hinsichtlich Empfangsstärke, Trägerfrequenz etc. leichter festnagelbar sein.&lt;br /&gt;
&lt;br /&gt;
==== Frequenz ermitteln ====&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel geht davon aus, dass Ihr im 868 MHz-Band unterwegs seid. Bei 433 MHz könnt Ihr in gleicher Weise vorgehen.&lt;br /&gt;
&lt;br /&gt;
Fangt damit an, dass Ihr den CC101 mittels set-Command cc1101_freq auf 868.000, cc1101_bWidth auf 650 und cc11=1_sens auf 8 einstellt. Kontrollieren könnt Ihr das durch &amp;lt;code&amp;gt;get ccconf&amp;lt;/code&amp;gt;. Die Bandbreite bWidth gibt an wie groß der Empfangsbereich ist. Bei 650 kHz sind das z.B. +/- 325 kHz, also der Bereich von 867.675 bis 868.325 MHz. &lt;br /&gt;
&lt;br /&gt;
Wenn ihr etwas empfangt ist das ein Ansatzpunkt. Anderfalls könnt Ihr die cc1101_freq in 200 kHz-Schritten (868.200, 868.400 ...) erhöhen und das Frequenzband auf diese Art und Weise absuchen. Ein Hinweis an der Stelle: Im FHEM-Log folgt bei den SIGNALduino-Einträgen nach dem Datenteil D= die Empfangsstärke R=. Damit könnt Ihr feststellen, ob Ihr Euch der Sendefrequenz nähert oder entfernt.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr nun Frequenzen gefunden habt bei denen Ihr etwas empfangt, dann könnt Ihr die bWidth jeweils halbieren und den Bereich, in dem etwas empfangen wurde, mit halbierter Frequenz-Schrittweite weiter durchforsten. Das macht Ihr so lange, bis bWidth bei 58 kHz angekommen ist. Damit sollte sich die gesuchte Trägerfrequenz herauskristallisieren.&lt;br /&gt;
&lt;br /&gt;
==== Eingrenzung - Selektiver Empfang ====&lt;br /&gt;
&lt;br /&gt;
Am sichersten geht man selektiv vor - einen Message-Typ nach dem anderen testen. Im SIGNALduino kann man über das set-Command &amp;lt;code&amp;gt;disableMessagetype&amp;lt;/code&amp;gt; die Interpretation als MC, MS und MU selektiv ausschalten. Man kann mit MC beginnen und danach beobachten, ob es bei aktivem MS + MU Dekoder jeweils nur eine Art von Nachrichten gibt.&lt;br /&gt;
&lt;br /&gt;
Sobald man sieht, dass die Meldungen im FHEM-Log wechseln, die Message-Typen MS, MU bzw. MC mit nur einem aktiven Dekoder aufzeichnen.&lt;br /&gt;
&lt;br /&gt;
Das sollte Anhaltspunkte geben worauf der S&#039;duino am Besten reagiert.&lt;br /&gt;
&lt;br /&gt;
==== Eingrenzung - Log-Analyse via regex ====&lt;br /&gt;
&lt;br /&gt;
Wenn man schon ziemlich genau weiß, wie das Message-Pattern des relevanten Geräts aussieht, dann kann man sich folgendermaßen sehr elegant und schnell viele weitere zu diesem Gerät gehörige Aktivitäten aus dem Log fischen, ohne sehr störenden Traffic von anderen Geräten mit dabei zu haben:&lt;br /&gt;
z.B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tail -f log/fhem-2018-11.log|grep &amp;quot;sduino.*msg READ: .*=-4...;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
um sich alle Pattern eines Geräts rauszufischen, bei dem man weiß, dass dessen Sende-Traffic das hinreichend charakteristische Merkmal besitzt, einen Low-Puls mit +- 4000us Länge zu haben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sduino433/msg READ: MU;P0=-956;P1=450;P2=-1987;P3=-4212;P4=96;P6=-304;D=01212121212121312131212131312121213131312131313431316;CP=1;R=224;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anmerkung: dies ist natürlich mit einem On-Demand-beherrschbaren Gerät (z.B. Fernbedienung, oder Batterie-basiertes Außerbetriebsetzen) kein Problem: hier kann man direkt live (aktueller Zeitpunkt!) nachvollziehen, ob die aktuelle Regex-Filterung tatsächlich Geräte-Aktivität richtig herausfischt (oder eben dummerweise nicht!). Jedoch bei nicht so leicht kontrollierbaren Geräten (intervall-mäßiges Senden, z.B. Klima-Sensoren, oder noch blöder, nur vereinzeltes Senden, z.B. Schwellwert-Sensoren, oder nicht direkt zugängliche Geräte) muss man natürlich den Regex möglichst wenig strikt formulieren, um sicherzustellen, dass man keine im Log abgelegte Aktivität dieses Geräts fälschlicherweise total übersieht/ignoriert.&lt;br /&gt;
&lt;br /&gt;
==== Variationen ====&lt;br /&gt;
&lt;br /&gt;
Solltet Ihr verschiedene Fernbedienungen für die Produktfamilie besitzen oder so wie ich eine die 8 Rolllädenmotoren bedienen kann, könnt Ihr bei nicht dokumentierten Protokollen trotzdem die Funktion der einzelnen Bytes herausarbeiten.&lt;br /&gt;
&lt;br /&gt;
Spielt jede Tastenkombination durch, extrahiert die Meldungen aus dem FHEM-Log und legt sie in separaten Dateien ab die ihr z.B. mit Motor, Richtung, Fernbedienung kennzeichnet.&lt;br /&gt;
&lt;br /&gt;
==== Signal analysieren ====&lt;br /&gt;
&lt;br /&gt;
Habt Ihr nun den Punkt erreicht an dem Ihr &#039;&#039;reproduzierbar&#039;&#039; (hinreichend stabil erfasste) (Teil-)Code-Sequenzen (oft in mehrfacher, identischer Wiederholung) im FHEM-Log seht, geht es ans Entschlüsseln. Auch hier wieder der einfache Fall: SIGNALduino kennt den Hersteller bzw. Device-Typ schon und legt automatisch ein FHEM-Device an (da das aber öfter nicht der Fall sein wird, muss man hier weiterarbeiten).&lt;br /&gt;
&lt;br /&gt;
Wenn ein Signal demoduliert wurde ist man den Bits und Bytes schon einen Schritt näher gekommen.&lt;br /&gt;
&lt;br /&gt;
Gehen wir wieder von unserem Beispiel aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P0=-13020;P1=15916;P2=-398;P3=415;P4=4008;P5=-794;P6=812;D=01232323232323232323232324532653265353532653262653265326                                      26262626265353532653265326532653535326265353535353265353532653262653265353265353535353535353265326;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie ist diese Sequenz zu interpretieren?&lt;br /&gt;
&lt;br /&gt;
Anhand der anfänglich gelisteten Puls-Beschreibungen Px= (Aktiv-Indikator/Dauer):&lt;br /&gt;
&lt;br /&gt;
* Es startet mit einer Pause D=&#039;&#039;&#039;0&#039;&#039;&#039;123232323232&lt;br /&gt;
* gefolgt von einem Signal D=0&#039;&#039;&#039;1&#039;&#039;&#039;23232323232 in der Länge von ca. 16 ms (15916 µs).&lt;br /&gt;
* danach folgt ein Sync-Block D=01&#039;&#039;&#039;23232323232&#039;&#039;&#039;... bei dem jeweils Pärchen von 400 µs Pause/400 µs Signal wiederholt werden.&lt;br /&gt;
* Sync- und Datenteil sind durch einen Puls von 4 ms [P4=4008] getrennt D=0123232323232323232323232&#039;&#039;&#039;4&#039;&#039;&#039;53265&lt;br /&gt;
* gefolgt vom Datenteil D=01232323232323232323232324&#039;&#039;&#039;53265&#039;&#039;&#039;....&lt;br /&gt;
&lt;br /&gt;
Beim Datenteil wird es etwas komplizierter. Hier sind immer ein kurzer (2 oder 3) und ein langer (5 oder 6) Wert kombiniert. Folglich muss man bei der Interpretation zwischen Aktiv-Indikator (Vorzeichen) und Dauer differenzieren. Ein Pärchen ist immer 1.200 µs lang. In der Mitte dieser Zeitscheibe kann der übertragene Wert folglich eine Pause oder ein Signal sein.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Den Vorspann&lt;br /&gt;
&amp;lt;code&amp;gt;P0=-32001;P1=15874;P2=-364;P3=447;P4=4060;P5=-762;P6=853;D=01232323232323232323232324&amp;lt;/code&amp;gt; (bestehend aus Puls-Beschreibungen und initialer Puls-Aktivität) lassen wir mal außen vor und konzentrieren uns auf den nachfolgenden echten Nutz-Daten-Teil (hinsichtlich dessen logischer Protokoll-Umformung hin zur finalen Nutz-Datenwort-Sequenz):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;53265326535326535326265353262653265353535326265353265326262653265326265353535353532653535353262653265353265353535353535353532626 (rohe Abfolge der Puls-Typen)&lt;br /&gt;
&lt;br /&gt;
lSsLlSsLlSlSsLlSlSsLsLlSlSsLsLlSsLlSlSlSlSsLsLlSlSsLlSsLsLsLlSsLlSsLsLlSlSlSlSlSlSsLlSlSlSlSsLsLlSsLlSlSsLlSlSlSlSlSlSlSlSlSsLsL (als sSlL-Notation)&lt;br /&gt;
&lt;br /&gt;
1 0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 (als Bitfolge)&lt;br /&gt;
&lt;br /&gt;
10101101 10011001 01111001 10100010 10011111 10111100 10110111 11111100 (Gruppierung auf Bit-Datenworte)&lt;br /&gt;
&lt;br /&gt;
AD99 79A2 9FBC B7FC (als Hex-Datenworte)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Analyse basiert auf folgenden Annahmen (mit Beispiels-Werten)&lt;br /&gt;
* Mapping von Puls-Werten auf logische Zustände: wenn 800-ter Pulse: Wert kleiner 0 (z.B. -800) ist ein l (long low), größer 0 ist L (long high), wenn 400-ter Pulse: analog, gemapped auf sS (short low/high) - &amp;quot;sSlL-Notation&amp;quot;...&lt;br /&gt;
* Weiter angenommen es werden immer 2 Frequenzen/Zustände verglichen (lS =&amp;gt; 1 und sL =&amp;gt; 0) (ein Gerät hat ja salopp gesagt nicht mehr zu tun als nur 2 Zustände - 0er und 1er Daten-Bits - robust codiert über Funk zu vermitteln - aus diesen Bits ergibt sich dann zusammengefügt ein gesamtes Geräte-Datenwort, welches anschließend in Bit-Bereiche wie Temperatur, Feuchte, Wind zerlegungs-analysiert werden muss, anhand charakteristischer Werte-Veränderungen, die man idealerweise auch direkt in z.B. einem Sensor-LCD-Display erkennen kann)&lt;br /&gt;
&lt;br /&gt;
Abseits-Bemerkung: Sollte man mit dem SIGNALduino ein &#039;&#039;FSK&#039;&#039;-Signal empfangen/interpretieren (im Gegensatz zu &amp;quot;normaleren&amp;quot; &#039;&#039;ASK&#039;&#039;, &#039;&#039;OOK&#039;&#039;), so hängt die Bewertung davon ab, ob man die Sendefrequenz+Frequenzhub oder Sendefrequenz-Frequenzhub empfängt. Die Bedeutung von 0/1 wird dann negiert. FIXME diese Beschreibung ist (mir) zu unklar, eine Verbesserung sollte erarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Weitere wichtige Tips:&lt;br /&gt;
* es ist wohl sinnvoll, zu versuchen, sich evt. an einem längsten Puls (das ist nämlich evt. eine Sync-Pause) zu orientieren, um nachfolgende Bereiche evt. als startendes Bit-Datenpaket identifizieren zu können&lt;br /&gt;
* man sollte die Pulsfolge per Textsuche analysieren, in einem Editor/Reader, der Such-Texte in einer Zeile &#039;&#039;&#039;mehrfach&#039;&#039;&#039; farbig markieren kann (less, ...) - bei markiertem Suchtreffer kann man dann Teil-Folgen identifizieren, welche sich deterministisch &#039;&#039;wiederholen&#039;&#039; - diese sind dann wohl offensichtlich codierte Bit-Daten, welche es passend zu entschlüsseln gilt&lt;br /&gt;
* die identifizierten Merkmale sind dann als ein neues Protokoll (falls kein bereits existierendes Protokoll zu unpräzise formuliert sein sollte!) in &amp;lt;code&amp;gt;FHEM/lib/signalduino_protocols.hash&amp;lt;/code&amp;gt; hinzuzufügen (Angabe präziser Durchschnittswerte von Basis-Takt, Gesamt-Patternlänge, Puls-Pause-Verhältnisse, ... - Details dieses Protokolls siehe Header dieser Datei), und dann muss ein &amp;lt;code&amp;gt;reload 00_SIGNALduino&amp;lt;/code&amp;gt; gemacht werden, um dies zu testen (hier: beim sduino-Device temporär(!! - hoher Platzbedarf...) Attribute verbose 5 und debug 1 setzen!)&lt;br /&gt;
* für Beispiele einer Protokoll-Implementierung sollte man sich wohl auch die History (entsprechende Commits) im [[#Links|RFFHEM git repository]] ansehen&lt;br /&gt;
* es ist evt. sinnvoll, sich die Verarbeitungskette anhand von Empfang/Senden bereits funktionsfähiger Protokolle / Geräte zu verdeutlichen, bevor man selber loslegt, neue Geräte (Protokolle) zu unterstützen&lt;br /&gt;
* richtige Verarbeitung von empfangenen Funk-Pattern (oder in leicht abgeänderter Form derselben) kann man wohl besonders effizient debuggen, indem man sich einen Dummy-SIGNALduino anlegt:&lt;br /&gt;
&amp;lt;code&amp;gt;define sduino_dummy SIGNALduino none&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesen kann man dann die gewünschten zu unterstützenden Pattern einimpfen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;get sduino_dummy raw MC;;LL=-653;;LH=665;;SL=-317;;SH=348;;D=D55B58;;C=330;;L=21;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Strichpunkte (Semikolon) müssen hierbei jeweils escaped werden (durch Wiederholung), vermutlich da sie in FHEM&#039;s Perl-Code-Umgebung sonst als normale &#039;&#039;sequence points&#039;&#039; interpretiert würden.&lt;br /&gt;
&lt;br /&gt;
Weitere für einen Test verwendbare Beispiel-Pattern siehe [[#Links|RFFHEM git repository]], in Datei: &amp;lt;code&amp;gt;FHEM/14_SD_BELL.pm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wenn alles richtig läuft (weil man es richtig implementiert hat), dann sollte die gesamte Kette von Pattern-Fingerprinting bis hin zu Dispatch an Datenwort-Modul und dortige Verarbeitung bis hin zu einem entsprechend sichtbaren Auftauchen der Device-Aktivitäten/-Autocreate in FHEMWEB Event Monitor page und/oder Log durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
==== Steuern ====&lt;br /&gt;
&lt;br /&gt;
Die empfangenen, im Log ausgewiesenen Sequenzen könnt Ihr als Basis für das Senden verwenden. Relevant sind dabei Puls-Beschreibungen P0...P7 sowie D (Data). Die RSSI-Empfangsstärke wird beim Empfang als R= ausgewiesen. Beim Senden steht R jedoch für die Anzahl der Wiederholungen. Entnehmt die Details und Möglichkeiten bitte der Dokumentation [https://github.com/RFD-FHEM/SIGNALDuino/wiki/Commands Commands].&lt;br /&gt;
&lt;br /&gt;
==== Signal-Protokoll-Beschreibung verfeinern ====&lt;br /&gt;
&lt;br /&gt;
Sobald man bei einem Gerät initial erfolgreich empfangen / dekodieren (/ senden?) konnte, sollte man folgendes noch beachten:&lt;br /&gt;
&lt;br /&gt;
Es ist recht wichtig, dass jede Protokoll-Beschreibung eines Geräte-Signals &#039;&#039;&#039;möglichst präzise Geräte-konforme&#039;&#039;&#039; Werte aufführt:&lt;br /&gt;
&lt;br /&gt;
wenn mehrere Protokoll-Beschreibungen aufgrund von zu ungenauen Werten jeweils als passend betrachtet werden, dann&lt;br /&gt;
landet das Signal-Pattern (auch) bei falschen Protokoll-Beschreibungen - die weitere Zuordnung (dies ist eine Routing-Entscheidung!) hin zu spezifischen Geräte-Datenwort-FHEM-Modulen ist also gefährdet / sinnlos:&lt;br /&gt;
* evt. ganz fehlgeschlagen aufgrund von Falsch-Zuordnung&lt;br /&gt;
* viel sinnlose Noise im Log, weil gleich mehrere Pfade angeblich passen und dann &amp;quot;noch nicht supported&amp;quot;-Fehlermeldungen werfen&lt;br /&gt;
Mit stark steigender Anzahl von bekannten Protokoll-Beschreibungen dürfte dieses Problem immer schlimmer werden.&lt;br /&gt;
&lt;br /&gt;
Daher sollte man folgendes beachten:&lt;br /&gt;
* sicherstellen, dass nicht eine andere - also bereits existierende! - Protokoll-Beschreibung eigentlich die richtige gewesen wäre, welche nur aufgrund von Impräzisionen das aktuelle völlig Protokoll-gleiche Gerät NICHT erkannt hat (zudem: &amp;quot;ähnlich&amp;quot; aussehende Protokolle, die allerdings von klar unterschiedlichen Geräte-Familien erzeugt werden, sollten NICHT in der gleichen Protokoll-Beschreibung zusammengemischt werden, und man sollte diese Abgrenzung dort auch klarstellen: durch Referenz-Hinweise auf entsprechende fast gleiche Protokoll-Beschreibungen dort)&lt;br /&gt;
* &#039;&#039;length_min&#039;&#039; , &#039;&#039;length_max&#039;&#039; möglichst passend restriktiv spezifizieren (also z.B. 12 , 12)&lt;br /&gt;
* &#039;&#039;clockabs&#039;&#039;-Basistakt-Mittelwert möglichst präzise ermitteln&lt;br /&gt;
* ((die Perl-Demodulations-Implementierung - in &amp;lt;code&amp;gt;00_SIGNALduino.pm&amp;lt;/code&amp;gt; etc. - ebenfalls auf möglichst restriktive Checks / Wertebereiche trimmen))&lt;br /&gt;
&lt;br /&gt;
Ermittlung eines präzisen &#039;&#039;clockabs&#039;&#039;-Basistakt-Mittelwerts dürfte folgendermaßen gut machbar sein:&lt;br /&gt;
* einige Geräte-Pattern aus dem Log fischen&lt;br /&gt;
* dort die &#039;&#039;clockabs&#039;&#039;-Werte suchen (&amp;lt;code&amp;gt;CP=x&amp;lt;/code&amp;gt; verweist darauf)&lt;br /&gt;
* aus diesen dann einen Mittelwert bilden, damit man die größte Präzision erreicht&lt;br /&gt;
* evt. sogar längere (Sync-)Pulse (z.B.: 15x &#039;&#039;clockabs&#039;&#039; Low, 1x &#039;&#039;clockabs&#039;&#039; High) heranziehen, um durch Mittelung (+ Teilung) über viele dieser z.B. 15x wiederholten Pulslängen einen daraus resultierend maximal präzisen &#039;&#039;clockabs&#039;&#039;-Basistakt-Mittelwert zu ermitteln&lt;br /&gt;
* evt. ist es auch hilfreich, den im Gerät verbauten Quarz zu berücksichtigen - u.U. lässt sich hieraus (falls eine solche Verarbeitung im Gerät tatsächlich Timer-mäßig relevant sein sollte!) ein sehr präziser da &amp;quot;mechanisch&amp;quot; passender Puls-Takt-Wert ermitteln (Pseudo-Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;(1 / 8MHz) * 2048 [digitaler Teiler] = 0.256ms == 256us&amp;lt;/code&amp;gt;&lt;br /&gt;
); wobei der mechanische Gerätetakt evt. doch erstaunlich anders sein könnte als die von SIGNALduino erfassten Werte (inwiefern das dann hinsichtlich Rx-/Tx-Präzision relevant ist - wer weiß...)&lt;br /&gt;
&lt;br /&gt;
==== Development / patch submission ====&lt;br /&gt;
&lt;br /&gt;
Es ist evt. empfehlenswert, auf github einen eigenen Fork des RFFHEM-Upstream-Repositories zu erstellen - dann kann man &#039;&#039;dort&#039;&#039; seine Entwicklung durchführen:&lt;br /&gt;
* Änderungen durchführen (im korrekten Branch)&lt;br /&gt;
* alles committen&lt;br /&gt;
* &amp;lt;code&amp;gt;controls_signalduino.txt&amp;lt;/code&amp;gt; updaten (wird via via github actions automatisch aktualisiert), sonst kann nicht über den update Befehl installiert werden!&lt;br /&gt;
* mit dem üblichen FHEM-Befehl (&amp;lt;code&amp;gt;update all ...&amp;lt;/code&amp;gt;, aber eben sinnigerweise unter Angabe der URL seines &#039;&#039;eigenen&#039;&#039; Repositories!!) seine eigenen Änderungen jeweils korrekt verwaltend und updatend austesten&lt;br /&gt;
* evt. hier jeweils &amp;lt;code&amp;gt;reload BEARBEITETES_MODUL&amp;lt;/code&amp;gt; nötig&lt;br /&gt;
* wenn das alles passt, hat man bereits seinen eigenen Fork fix und fertig (und authentisch getestet) und kann somit direkt - evt. nach einem bereinigenden &amp;lt;code&amp;gt;git rebase -i @{u}&amp;lt;/code&amp;gt; - einen Pull Request daraus machen (anders ausgedrückt: &amp;quot;direkt kontext-integrierte Entwicklung&amp;quot;, &amp;quot;am Puls der Zeit&amp;quot;, &amp;quot;mit voller Tool-Unterstützung&amp;quot;). Dies am besten vollständig Automatisierungs-gekapselt durch ein Shell-Script (FIXME: am besten hier einfach direkt hier präsentieren?), welches an FHEM den &amp;lt;code&amp;gt;update all ...&amp;lt;/code&amp;gt; request schickt (über telnet, Port 7072) &#039;&#039;und&#039;&#039; den &amp;lt;code&amp;gt;reload BEARBEITETES_MODUL&amp;lt;/code&amp;gt; durchführt.&lt;br /&gt;
&lt;br /&gt;
== SIGNALduino - FSK ==&lt;br /&gt;
&lt;br /&gt;
Dieses Kapitel geht davon aus, dass ihr einen SIGNALduino für alle weiteren Schritte nutzt. &lt;br /&gt;
&lt;br /&gt;
Aktuell laufen Bestrebungen, den SIGNALduino FSK-fähig zu machen: siehe [https://forum.fhem.de/index.php/topic,106582.0.html FSK mit SIGNALduino] (vormals https://forum.fhem.de/index.php/topic,82379.0.html)&lt;br /&gt;
&lt;br /&gt;
Die Summary der CC1101-Settings findet ihr [https://forum.fhem.de/index.php/topic,106594.0.html#new hier].&lt;br /&gt;
&lt;br /&gt;
=== FSK Senden ===&lt;br /&gt;
&lt;br /&gt;
Die ersten Bits des CC1101-Register 12 MDMCFG2 bestimmen die Übertragungsweise:&lt;br /&gt;
000 = 2-FSK&lt;br /&gt;
001 = GFSK&lt;br /&gt;
011 = ASK/OOK&lt;br /&gt;
100 = 4-FSK&lt;br /&gt;
&lt;br /&gt;
Schaut Euch den aktuellen Registerinhalt an, bevor Ihr ihn ändert. Am einfachsten geht das über &lt;br /&gt;
&amp;lt;code&amp;gt;get &amp;lt;mysduino&amp;gt; ccreg 99&amp;lt;/code&amp;gt;&lt;br /&gt;
Ihr müsst beim angezeigten Wert die ersten drei Bits entsprechend abändern, also z.B. aus 0x30 dann 0x10 für GFSK statt OOK machen.&lt;br /&gt;
Das Register wird über &lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;mysduino&amp;gt; raw W1410&amp;lt;/code&amp;gt;&lt;br /&gt;
abgeändert (bitte beachtet das Offset von 0x02 für das Beschreiben eines Registers, 14 adressiert Register 12).&lt;br /&gt;
&lt;br /&gt;
Nun könnt Ihr FSK senden. Das im URH angezeigte Spektrum sollte nun zwei Spitzen aufweisen. Ihr seht daneben vermutlich auch weitere kleine links und rechts daneben. Das liegt daran, dass es Oberwellen gibt. Bei 2-FSK sind dies mehr als bei dem geglätteten GFSK.&lt;br /&gt;
&lt;br /&gt;
=== Sendefrequenz und Frequenzhub ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:PeakLow.png|mini|ohne|300px|FSK, Trägerfrequenz minus Hub]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:PeakHigh.png|mini|links|300px|FSK, Trägerfrequenz plus Hub]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei OOK wird das Funksignal ein- und ausgeschaltet, um die bits als 0 und 1 darzustellen. Bei FSK sieht das anders aus. Zur Übertragung wird ein permanentes Signal ausgestrahlt; die Darstellung der bits 0 und 1 erfolgt durch Erniedrigung bzw. Erhöhung der Frequenz. Folglich gilt es sowohl die Trägerfrequenz als auch den Frequenzhub zu ermitteln. Das bit 0 wird i.d.R. durch Trägerfrequenz minus Hub, das bit 1 durch Trägerfrequenz plus Hub dargestellt.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispielspektrum eines FSK-Signals ist ersichtlich, dass die untere Frequenz bei ca. 868,233 Mhz und die obere bei ca. 868,281 Mhz liegt. Die Trägerfrequenz liegt folglich in der Mitte bei 868,257 MHz und der Frequenzhub beträgt ca. 24 kHz.&lt;br /&gt;
&lt;br /&gt;
=== Ermittlung der Frequenzen ===&lt;br /&gt;
&lt;br /&gt;
Wie im OOK-Kapitel bereits angesprochen, ist eine Messung mit Hilfe eines SDR-Sticks hilfreich. Doch Vorsicht - diese Sticks sind oftmals nicht geeicht und die angezeigte Frequenz wird &amp;quot;relativ&amp;quot; genau gemessen. Was aber hilft ist ein Vergleich Original/Kopie. Messt mit dem SDR-Stick unter Nutzung eines Programms wie URH die Frequenzen, sendet mit dem SDUINO ebenfalls ein Signal auf einer von Euch vorgegebenen Frequenz. Nehmt als Basis für den Ver- bzw. Abgleich die von Euch im SDUINO vorgegebene Frequenz. Die ist für die weiteren Aktivitäten relevant. Die Abweichung könnt Ihr in der URH-Software zur Frequenzkorrektur vorgeben, dann werden identische Werte angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== Hub ===&lt;br /&gt;
&lt;br /&gt;
Da hilft Euch das RF Studio für den CC1101. Der darin ermittelte Wert ist in das Register 15 DEVIATN zu übertragen. Bei 25 kHz Hub ist das der Wert 40, der mittels &lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;mysduino&amp;gt; raw W1740&amp;lt;/code&amp;gt;&lt;br /&gt;
an den CC1101 des SDUINO übermittelt wird.&lt;br /&gt;
&lt;br /&gt;
Wenn Ihr soweit seid, sollten die Funksignale der Original-Fernbedienung und Eures SDUINO ähneln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:RIO FB-Signal.png|mini|Spektrum Original-Fernbedienung]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Datei:Signal des SDUINO GFSK .png|mini|Spektrum SDUINO GFSK ]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Baudrate ===&lt;br /&gt;
&lt;br /&gt;
Beim SDUINO übernimmt der CC1101 die Funktion eines Modems. Die Signalaufbereitung bzw. -erzeugung erfolgt im Arduino. Das können wir auch für das Senden von FSK Signalen nutzen. Der CC1101 bietet eine Fülle weiterer Optionen (Sync, FIFO etc.), die aber eher für Spezialisten geeignet sind.&lt;br /&gt;
&lt;br /&gt;
Welche Baudrate soll/muss ich angeben? Zunächst mal gilt es folgende Teilstrecken zu unterscheiden:&lt;br /&gt;
FHEM &amp;lt;-&amp;gt; Arduino &amp;lt;-&amp;gt; CC1101 &amp;lt;-&amp;gt; Sendesignal&lt;br /&gt;
&lt;br /&gt;
Die Baudrate zwischen FHEM und dem Arduino wird in FHEM vorgegeben. Die für den CC1101 angegebene und mittels &amp;lt;code&amp;gt;get &amp;lt;myduino&amp;gt; ccconf&amp;lt;/code&amp;gt; ausgegebene Baudrate ist die zwischen dem Arduino und dem CC1101. Mit dieser Baudrate wird das Funksignal gesampled.&lt;br /&gt;
&lt;br /&gt;
Beim Empfang interpretiert der Arduino den Signalpegel und erkennt die Übergänge zwischen 0 und 1. Es wird die Dauer des jeweiligen Signals ermittelt und einem Parameter (&#039;&#039;&#039;P&#039;&#039;&#039;uls?) 0-7 zugeordnet. Auf diese Weise wird die gesamte empfangene Codesequenz beschrieben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:both&amp;quot;&amp;gt;[[Datei:RIO-Signal.png|mini|600px|RIO-Signal decodiert]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Baudrate lässt sich im CC1101 nur bedingt präzise einstellen, da dafür nur ein Byte zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Ich habe bei der obigen Sequenz die Baudrate bzw. SCLK aus dem Vorspann (Preamble) ermittelt und bin auf 2.482 Baud gekommen. Für die Übertragung habe ich aber die 10fache Rate verwendet, um die Steuerung des Zustandes 0/1 dem Arduino und nicht dem CC1101 zu überlassen. Statt einer 0 werden dann halt 10x 0 übertragen. Auf Sendeseite ändert sich dadurch nichts. Die Software URH arbeitet ähnlich. Das Signal wird z.B. mit 1 MHz gesampled. Um auf die ermittelte Baudrate und eine reale Darstellung zu kommen, gebe ich 402 Samples/Symbol (Symbol=bit) ein.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:both&amp;quot;&amp;gt;[[Datei:Vergleich RIO-SDUINO-Signale.png|mini|600px|Vergleich RIO/SDUINO-Signale]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Codesequenzen ===&lt;br /&gt;
Die Interpretaion des low- und high-Zustandes hängt von der Sende- und Empfangsfrequenz ab. Wenn Ihr im OOK-Modus Sequenzen mitgeschnitten habt werden die möglicherweise anders interpretiert als die mittels FSK empfangenen. Deshalb: Sequenzen mit der Original-Fernbedienung neu erzeugen und mitschneiden. Achtet dabei darauf, dass diese lang genug sind, um das komplette Steuerungssignal mitzuschneiden. Die Preamble ist recht auffällig (bei mir 01232323 ...). Die wiederholt sich nach dem eigentlichen Steuerungssignal. Ab hier könnt Ihr also abschneiden. Ferner empfiehlt sich, das mitgeschnittene Signal zu dekodieren und in Hex darzustellen. Dann erkennt Ihr, ob identische Inhalte/Sequenzen mitgeschnitten wurden. Das trennt die Spreu vom Weizen. &lt;br /&gt;
&lt;br /&gt;
Damit konnte ich mein Problem meines unbekannten Funkprotokolls (RIO-Fernbedienung) letztendlich lösen.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
&lt;br /&gt;
Last but not least meine Konfiguration: SDUINO Firmware war die Version v3.4.1_dev_21.12&lt;br /&gt;
&lt;br /&gt;
Register-Settings:&lt;br /&gt;
&lt;br /&gt;
* Trägerfrequenz: 868.302 MHz&lt;br /&gt;
* Deviation: 25 kHz&lt;br /&gt;
* Bandwidth: 58 kHz&lt;br /&gt;
* Baudrate: 24.795 kBaud&lt;br /&gt;
* Modulation: GFSK&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ccregAll: &lt;br /&gt;
&lt;br /&gt;
ccreg 00: 0D 2E 2D 47 D3 91 3D 04 32 00 00 06 00 21 65 6F&lt;br /&gt;
ccreg 10: F9 F4 18 23 B9 40 07 00 18 14 6C 07 00 91 87 6B&lt;br /&gt;
ccreg 20: F8 56 11 EF 2D 12 1F 41 00 59 7F 3F 88 31 0B &lt;br /&gt;
&lt;br /&gt;
Configuration Register Detail (address, name, value):&lt;br /&gt;
0x00 IOCFG2   - 0x0D&lt;br /&gt;
0x01 IOCFG1   - 0x2E&lt;br /&gt;
0x02 IOCFG0   - 0x2D&lt;br /&gt;
0x03 FIFOTHR  - 0x47&lt;br /&gt;
0x04 SYNC1    - 0xD3&lt;br /&gt;
0x05 SYNC0    - 0x91&lt;br /&gt;
0x06 PKTLEN   - 0x3D&lt;br /&gt;
0x07 PKTCTRL1 - 0x04&lt;br /&gt;
0x08 PKTCTRL0 - 0x32&lt;br /&gt;
0x09 ADDR     - 0x00&lt;br /&gt;
0x0A CHANNR   - 0x00&lt;br /&gt;
0x0B FSCTRL1  - 0x06&lt;br /&gt;
0x0C FSCTRL0  - 0x00&lt;br /&gt;
0x0D FREQ2    - 0x21&lt;br /&gt;
0x0E FREQ1    - 0x65&lt;br /&gt;
0x0F FREQ0    - 0x6F&lt;br /&gt;
0x10 MDMCFG4  - 0xF9&lt;br /&gt;
0x11 MDMCFG3  - 0xF4&lt;br /&gt;
0x12 MDMCFG2  - 0x18&lt;br /&gt;
0x13 MDMCFG1  - 0x23&lt;br /&gt;
0x14 MDMCFG0  - 0xB9&lt;br /&gt;
0x15 DEVIATN  - 0x40&lt;br /&gt;
0x16 MCSM2    - 0x07&lt;br /&gt;
0x17 MCSM1    - 0x00&lt;br /&gt;
0x18 MCSM0    - 0x18&lt;br /&gt;
0x19 FOCCFG   - 0x14&lt;br /&gt;
0x1A BSCFG    - 0x6C&lt;br /&gt;
0x1B AGCCTRL2 - 0x07&lt;br /&gt;
0x1C AGCCTRL1 - 0x00&lt;br /&gt;
0x1D AGCCTRL0 - 0x91&lt;br /&gt;
0x1E WOREVT1  - 0x87&lt;br /&gt;
0x1F WOREVT0  - 0x6B&lt;br /&gt;
0x20 WORCTRL  - 0xF8&lt;br /&gt;
0x21 FREND1   - 0x56&lt;br /&gt;
0x22 FREND0   - 0x11&lt;br /&gt;
0x23 FSCAL3   - 0xEF&lt;br /&gt;
0x24 FSCAL2   - 0x2D&lt;br /&gt;
0x25 FSCAL1   - 0x12&lt;br /&gt;
0x26 FSCAL0   - 0x1F&lt;br /&gt;
0x27 RCCTRL1  - 0x41&lt;br /&gt;
0x28 RCCTRL0  - 0x00&lt;br /&gt;
0x29 FSTEST   - 0x59&lt;br /&gt;
0x2A PTEST    - 0x7F&lt;br /&gt;
0x2B AGCTEST  - 0x3F&lt;br /&gt;
0x2C TEST2    - 0x88&lt;br /&gt;
0x2D TEST1    - 0x31&lt;br /&gt;
0x2E TEST0    - 0x0B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finale ===&lt;br /&gt;
&lt;br /&gt;
Nach Aktivierung der vormals ausgeschalteten Message-Typen im SIGNALduino werden nunmehr SD_Keeloq-Devices angelegt.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino erkennt &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 2020.01.12 14:33:03 4: mySIGNALduino: Parse_MS, Decoded matched MS Protocol id 88 dmsg P88#74D21B18008B48058 length 68  RSSI = -32&lt;br /&gt;
 2020.01.12 14:33:03 5: mySIGNALduino: Dispatch, P88#74D21B18008B48058, test ungleich: disabled&lt;br /&gt;
 2020.01.12 14:33:03 5: mySIGNALduino: Dispatch, P88#74D21B18008B48058, -32 dB, dispatch&lt;br /&gt;
 2020.01.12 14:33:03 5: mySIGNALduino: dispatch P88#74D21B18008B48058&lt;br /&gt;
 2020.01.12 14:33:04 2: mySIGNALduino: SD_Keeloq_Parse Unknown device unknown with Code 012D100 detected, please define (rawdate=74D21B18008B48058)&lt;br /&gt;
 2020.01.12 14:33:04 2: autocreate: define SD_Keeloq_012D100 SD_Keeloq 012D100&lt;br /&gt;
 2020.01.12 14:33:04 2: autocreate: define FileLog_SD_Keeloq_012D100 FileLog ./log/SD_Keeloq_012D100-%Y.log SD_Keeloq_012D100&lt;br /&gt;
 2020.01.12 14:33:04 4: mySIGNALduino: Parse_MS, Matched MS Protocol id 91.1 -&amp;gt; Atlantic security&lt;br /&gt;
 2020.01.12 14:33:04 5: mySIGNALduino: Parse_MS, Starting demodulation at Position 3&lt;br /&gt;
 2020.01.12 14:33:04 4: mySIGNALduino: Parse_MS, last part pair=2 reconstructed, last bit=0&lt;br /&gt;
 2020.01.12 14:33:04 4: mySIGNALduino: Parse_MS, Matched MS Protocol id 87 -&amp;gt; JAROLIFT&lt;br /&gt;
 2020.01.12 14:33:04 5: mySIGNALduino: Parse_MS, Starting demodulation at Position 2&lt;br /&gt;
 2020.01.12 14:33:04 4: mySIGNALduino: Parse_MS, last part pair=1 reconstructed, last bit=1&lt;br /&gt;
 2020.01.12 14:33:04 4: mySIGNALduino: Parse_MS, Matched MS Protocol id 88 -&amp;gt; HCS300/HCS301&lt;br /&gt;
 2020.01.12 14:33:04 5: mySIGNALduino: Parse_MS, Starting demodulation at Position 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und routet die Requests an das Modul SD_Keeloq weiter. Der Hinweis auf HCS301 führt auf die richtige Spur. Das analysierte Protokoll KeeLoq ist im Data Sheet des Microchip HCS301 (KeeLoq Code Hopping Encoder) beschrieben. Somit wurde aus einem unbekannten Funkprotokoll letztlich ein bekanntes.&lt;br /&gt;
&lt;br /&gt;
Mittlerweile ist das Protokoll als &#039;&#039;&#039;model enjoy_motors_HS&#039;&#039;&#039; in das Modul &#039;&#039;&#039;SD_Keeloq&#039;&#039;&#039; aufgenommen.&lt;br /&gt;
&lt;br /&gt;
== CUL - FSK und Co. ==&lt;br /&gt;
&lt;br /&gt;
Dieses Kapitel geht davon aus, dass ihr einen CUL für alle weiteren Schritte nutzt. &lt;br /&gt;
&lt;br /&gt;
Es befindet sich aber noch im Aufbau....&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Woran genau wird erkannt ob ein Signal ShortHigh, bzw ShortLow ist? ===&lt;br /&gt;
&lt;br /&gt;
Diese Begriffe kommen nur bei der Manchester Codierung zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Die Bestimmung short High / Low erfolgt einfach dadurch, ob gesendet wird oder ob gerade eine Pause eingelegt wird.&lt;br /&gt;
&lt;br /&gt;
Short und Long wird einfach durch die Kalkulation der Dauer ermittelt.&lt;br /&gt;
&lt;br /&gt;
Die Dauer eines short Intervalles ist in der Regel halb so lang wie die von einem long und entspricht der Taktrate.&lt;br /&gt;
Bei der ganzen Berechnung müssen natürlich Toleranzen berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel einer empfangenen Sequenz&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;P0=-32001;P1=15874;P2=-364;P3=447;P4=4060;P5=-762;P6=853;D=01232323232323232323232324&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
P0, P2 + P5 haben ein negatives Vorzeichen. Damit ist gemeint, dass für eine Zeit von 762µs (P5) kein Signal empfangen wurde (Low). Die positiven sind dann High.&lt;br /&gt;
&lt;br /&gt;
Generell sind die absoluten, gemessenen low-Werte bei Signalduino kürzer als die high-Werte.&lt;br /&gt;
&lt;br /&gt;
Wie bereits ausgeführt, werden für die Daten die Pulse P2, P3, P5 und P6 genutzt. Der Mittelwert [ (P2 + P3 + P5 + P6) / 6 ] der absoluten Werte ergibt 404µs für ein Short und 808µs ein Long (2xShort). Idealisiert werden 400µs angenommen.&lt;br /&gt;
&lt;br /&gt;
Das Umwandeln der Pulse in den Daten in eine &amp;quot;sSlL-Notation&amp;quot; vereinfacht die Erkennung von Mustern (in mehreren Nachrichten variieren auch die Pulse).&lt;br /&gt;
Dass ein lS=1 und sL=0 entspricht, ist nur eine willkürlich angenommene Arbeitshypothese, die bis dato ganz gute Ergebnisse produziert hat.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/RFD-FHEM/RFFHEM RFFHEM git repository] (drandenken: korrekten Branch auswählen!)&lt;br /&gt;
* [https://www.hamspirit.de/2286/signalanalyse-fuer-dummies/ Signalanalyse für Dummies]&lt;br /&gt;
* [https://github.com/jopohl/urh Universal Radio Hacker]&lt;br /&gt;
* [https://www.elttam.com.au/blog/intro-sdr-and-rf-analysis/ Intro SDR and RF Analysis]&lt;br /&gt;
* [https://www.sigidwiki.com/wiki/Signal_Identification_Guide Signal Identification Guide]&lt;br /&gt;
* [https://www.rtl-sdr.com/tag/fsk/ Unknown Signal Reverse Engineering and Decoding AFSK Signals Tutorial]&lt;br /&gt;
* [[Intertechno Code Berechnung]]&lt;br /&gt;
* [[Funksignalanalyse mit DVB-T Stick]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Intertechno]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=37913</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=37913"/>
		<updated>2023-01-04T18:18:03Z</updated>

		<summary type="html">&lt;p&gt;Sidey: 98_Hello aktualisiert, Referenz auf Template Repository auf Github hinterlegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. }}&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Um neue Geräte, Dienste, o.ä. in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben. Ein Modul wird in FHEM automatisch geladen, wenn ein entsprechendes Device in FHEM definiert wird. Das Modul ermöglicht eine spezifische Kommunikation mit einem physikalischen Gerät, stellt Ergebnisse (&amp;quot;Readings&amp;quot;) und Events innerhalb von FHEM zur Verfügung und erlaubt es, das Gerät mit &amp;quot;Set&amp;quot;-/&amp;quot;Get&amp;quot;-Befehlen zu beeinflussen. Dieser Artikel soll den Einstieg in die Entwicklung eigener Module erleichtern.&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; werden Devices in FHEM basierend auf einem Modul definiert. Dieser Befehl sorgt dafür, dass ein neues Modul bei Bedarf geladen und initialisiert wird. Ein gutes Beispiel ist hierbei die zentrale Konfigurationsdatei &amp;quot;fhem.cfg&amp;quot; in der sämtliche Devices in Form von &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Statements gespeichert sind.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen der Name des Moduls und der Name der [[#X_Initialize|Initialisierungsfunktion]]  identisch sein. Das folgende Beispiel soll dies verdeutlichen:&lt;br /&gt;
&lt;br /&gt;
Ein Jeelink USB-Stick könnte beispielsweise mit dem Befehl &amp;lt;code&amp;gt;define JeeLink1 &#039;&#039;JeeLink&#039;&#039; /dev/ttyUSB0@57600&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
In fhem.pl wird der &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl verarbeitet und geprüft, ob ein Modul mit dem Namen &amp;quot;JeeLink&amp;quot; schon geladen ist. Falls nicht, wird ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (z.B. /opt/fhem/FHEM) gesucht und, falls vorhanden, anschließend geladen. &lt;br /&gt;
Danach wird die Funktion &amp;lt;code&amp;gt;&#039;&#039;JeeLink&#039;&#039;_Initialize()&amp;lt;/code&amp;gt; aufgerufen um das Modul in FHEM zu registrieren. Eine Moduldatei muss dazu eine Funktion &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039;_Initialize()&amp;lt;/code&amp;gt; enthalten. Durch den Aufruf dieser Funktion wird FHEM mitgeteilt, welche Funktionalitäten dieses Modul unterstützt und durch welche Perl-Funktionen im Modul selbst diese ausimplementiert werden.&lt;br /&gt;
&lt;br /&gt;
In der Initialisierungsfunktion des Moduls werden die Namen aller weiteren Perl-Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird für jedes Modul ein eigener Hash (genauer &amp;quot;Modul-Hash&amp;quot;) mit entsprechenden Werten gefüllt, der in fhem.pl für jedes Modul entsprechend abgelegt wird. Dadurch weiß FHEM wie dieses Modul anzusprechen ist.&lt;br /&gt;
&lt;br /&gt;
== Grundlegender Aufbau eines Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== Dateiname ===&lt;br /&gt;
&lt;br /&gt;
Ein FHEM-Modul wird als Perl-Modul mit der Dateiendung *.pm abgespeichert. Der Dateiname folgt dabei folgendem Schema:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&#039;&#039;[&#039;&#039;&#039;Schlüsselnummer&#039;&#039;&#039;]&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;_&amp;lt;/font&amp;gt;&#039;&#039;[&#039;&#039;&#039;Modulname&#039;&#039;&#039;]&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;.pm&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Schlüsselnummer&#039;&#039;&#039; - Eine zweistellige Zahl zwischen 00 - 99. Die Schlüsselnummer hat aktuell keine technische Relevanz mehr. In früheren FHEM-Versionen ist sie relevant für [[#Zweistufiges_Modell_f.C3.BCr_Module|zweistufige Module]] (Reihenfolge für [[DevelopmentModuleAPI#Dispatch|Dispatch()]] um logische Module zu prüfen). Die allgemeine Empfehlung ist hierbei eine Schlüsselnummer eines Moduls zu verwenden, welches eine ähnliche Funktionalität bietet. Die Schlüsselnummer 99 hat hierbei eine besondere Bedeutung, da alle Module mit dieser Schlüsselnummer beim Start von FHEM automatisch geladen werden, selbst, wenn sie in der Konfiguration nicht verwendet werden. Daher wird für myUtils 99 als Schlüsselnummer verwendet (99_myUtils.pm). Module mit der Schlüsselnummer 99 werden im SVN nicht akzeptiert (siehe [[SVN Nutzungsregeln]])&lt;br /&gt;
* &#039;&#039;&#039;Modulname&#039;&#039;&#039; - Der Name des Moduls wie er in FHEM bei dem Anlegen einer Gerätedefinition zu verwenden ist. Der Modulname sollte nur aus den folgenden möglichen Zeichen bestehen: Groß-/Kleinbuchstaben, Zahlen sowie Unterstrich (_)&lt;br /&gt;
&lt;br /&gt;
=== Inhaltlicher Aufbau ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul ist inhaltlich in folgende Abschnitte unterteilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
#  72_MYMODULE.pm &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
# Laden evtl. abhängiger Perl- bzw. FHEM-Hilfsmodule&lt;br /&gt;
use HttpUtils;&lt;br /&gt;
use [...]&lt;br /&gt;
&lt;br /&gt;
# FHEM Modulfunktionen&lt;br /&gt;
&lt;br /&gt;
sub MYMODULE_Initialize() {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub MYMODULE_Define() {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# Eval-Rückgabewert für erfolgreiches&lt;br /&gt;
# Laden des Moduls&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Beginn der Commandref&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=item [helper|device|command]&lt;br /&gt;
=item summary Kurzbeschreibung in Englisch was MYMODULE steuert/unterstützt&lt;br /&gt;
=item summary_DE Kurzbeschreibung in Deutsch was MYMODULE steuert/unterstützt&lt;br /&gt;
&lt;br /&gt;
=begin html&lt;br /&gt;
 Englische Commandref in HTML&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=begin html_DE&lt;br /&gt;
 Deutsche Commandref in HTML&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
# Ende der Commandref&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann hierbei von folgender Reihenfolge sprechen:&lt;br /&gt;
&lt;br /&gt;
# Perl-Code, welcher das Modul implementiert&lt;br /&gt;
# Die Zeile &amp;lt;code&amp;gt;1;&amp;lt;/code&amp;gt; nachdem der Perl-Code abgeschlossen ist. Dies dient FHEM der Erkennung, dass das Modul erfolgreich und vollständig geladen wurde. Sollte diese Zeile nicht enthalten sein, wird FHEM beim Laden des Moduls die Fehlermeldung &amp;lt;code&amp;gt;Error:Modul 72_MYMODULE deactivated&amp;lt;/code&amp;gt; in das Logfile schreiben.&lt;br /&gt;
# Commandref zur Dokumentation des Moduls. Diese Dokumentation soll dem User die möglichen Befehle/Attribute/Readings/Events vermitteln. Weitere Informationen und Hinweise findet man in den [[Guidelines zur Dokumentation]].&lt;br /&gt;
&lt;br /&gt;
== Der Hash einer Geräteinstanz ==&lt;br /&gt;
Eine Besonderheit in Perl sind [http://de.wikipedia.org/wiki/Assoziatives_Array#Perl assoziative Arrays], (nicht ganz richtig als &amp;quot;Hash&amp;quot; bezeichnet) in denen die Adressierung nicht über eine Zählvariable erfolgt, sondern über einen beliebigen String. Die internen Abläufe bei der Adressierung führen dazu, dass die Speicherung in und der Abruf aus Hashes relativ langsam ist.&lt;br /&gt;
&lt;br /&gt;
Der zentrale Speicherort für Informationen einer Geräteinstanz bei FHEM ist ein solcher Hash, der seinerseits in fhem.pl von einem globalen Hash referenziert wird. &lt;br /&gt;
&lt;br /&gt;
In fhem.pl werden alle Gerätedefinitionen in dem globalen Hash &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; abgelegt. Der Inhalt von &amp;lt;code&amp;gt;$defs{&#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039;}&amp;lt;/code&amp;gt; in fhem.pl verweist dabei auf den Hash der Geräteinstanz in Form einer Hashreferenz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben (i.d.R. als &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; bezeichnet), welche direkt von fhem.pl aufgerufen werden. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im Frontend als &amp;quot;Internals&amp;quot; angezeigt werden, sowie die Readings des Geräts. &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt; enthält den Namen der Geräteinstanz, &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt; enthält die Typbezeichnung des Geräts (Modulname)&lt;br /&gt;
&lt;br /&gt;
==Ausführung von Modulen==&lt;br /&gt;
FHEM arbeitet intern nicht parallel, sondern arbeitet alle Aufgaben seriell nacheinander kontinuierlich ab. Daher wäre es ungünstig, wenn Module Daten von einem physikalischen Gerät abfragen wollen und dabei innerhalb der selben Funktion auf die Antwort des Geräts warten. In dieser Zeit, in der FHEM auf die Antwort des Gerätes warten muss, wäre der Rest von FHEM blockiert. Da immer nur eine Aufgabe zur selben Zeit bearbeitet wird, müssen alle weiteren Aufgaben solange warten. Eine Datenkommunikation innerhalb eines Moduls sollte daher immer ohne Blockierung erfolgen. Dadurch kann FHEM die Wartezeit effizient für andere Aufgaben nutzen um bspw. anstehende Daten für andere Module zu verarbeiten. Es gibt in FHEM entsprechende Mechanismen, welche eine &amp;quot;Non-Blocking&amp;quot;-Kommunikation über verschiedene Wege (z.B. seriell, HTTP, TCP, ...) ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden in FHEM zwei zentrale Listen gepflegt, in der die Filedeskriptoren der geöffneten Kommunikatonsverbindungen gespeichert sind. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet um Filedeskriptoren auf lesbare Daten zu überprüfen. In FHEM gibt es dazu eine Liste (&amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;), in der die Filedeskriptoren sämtlicher Geräte (z.B. serielle Verbindung, TCP-Verbindung, etc.) gespeichert sind. &lt;br /&gt;
&lt;br /&gt;
In der zentralen Schleife (Main-Loop) von fhem.pl wird mit &amp;lt;code&amp;gt;select()&amp;lt;/code&amp;gt; überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion ([[#X_Read|X_Read]]) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und verarbeitet. Anschließend wird die Schleife weiter ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per &amp;lt;code&amp;gt;select()&amp;lt;/code&amp;gt; überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion ([[#X_Ready|X_Ready]]) implementieren, welche prüft, ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt, beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
Innerhalb der eigentlichen Lesefunktion (X_Read) werden dann die Daten vom zugehörigen Gerät gelesen, das nötige Protokoll implementiert um die Daten zu interpretieren und Werte in Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
Auch wenn von einem Anwender über einen Get-Befehl Daten aktiv von einem Gerät angefordert werden, sollte nicht blockierend gewartet werden. Eine asynchrone Ausgabe, sobald das Ergebnis vorliegt, ist über [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] möglich. Siehe {{Link2Forum|Topic=43771|Message=357870|LinkText=Beschreibung}} und {{Link2Forum|Topic=43771|Message=360935|LinkText=Beispiel}}. Weitere Anwendungsbeispiele finden sich im  {{Link2Forum|Topic=43052|Message=353477|LinkText=PLEX Modul}} und im überarbeiteten und nicht-blockierenden {{Link2Forum|Topic=42771|Message=348498|LinkText=SYSSTAT Modul}}.&lt;br /&gt;
&lt;br /&gt;
== Wichtige globale Variablen aus fhem.pl ==&lt;br /&gt;
&lt;br /&gt;
FHEM arbeitet mit einer Vielzahl an internen Variablen. Die nun folgenden aufgelisteten Variablen sind die wichtigsten, welche man im Rahmen der Modulprogrammierung kennen sollte:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Variable !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; || Dient der Erkennung für fhem.pl sowie den Modulen, ob FHEM den Initialisierungsvorgang abgeschlossen hat. Beim Starten von FHEM ist &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; gleich &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Erst, wenn das Einlesen der Konfiguration, sowie des State-Files (Readings) abgeschlossen ist, wird &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
Das gleiche Verfahren wird auch bei dem Befehl &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; angewandt. Während &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; ausgeführt wird (Konfiguration löschen, neu einlesen), ist &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; gleich &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dies ist insbesondere in der [[#X_Define|Define]]-Funktion eines Moduls relevant. Durch eine Prüfung auf &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; kann man erkennen, ob eine Definition von Hand (&amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; = 1) oder im Rahmen der Initialisierung (FHEM Start / Rereadcfg =&amp;gt; &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; = 0) erfolgte. Während der Initialisierung stehen bspw. die gesetzten Attribute der Definition noch nicht zur Verfügung und können daher nicht ausgewertet werden (siehe . &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; || In &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; werden sämtliche gesetzten Attribute aller Geräte gespeichert. Diese Datenstruktur wird generell durch den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl verwaltet. Hierbei wird einem Gerätenamen eine Mehrzahl an Attributnamen mit einem Wert zugeordnet. Attribut-Inhalte können über die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] ausgelesen werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; || In &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; wird jedem in FHEM existierendem Befehl die entsprechende Funktion zugewiesen, welche diesen Befehl umsetzt. Module können durch das Eintragen eines Befehlsnamen samt Funktion in &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; über die [[#X_Initialize|Initialize]]-Funktion eines Moduls einen (oder mehrere) eigene Befehle in FHEM registrieren.&lt;br /&gt;
&lt;br /&gt;
Die Struktur ist dabei wiefolgt:&lt;br /&gt;
&lt;br /&gt;
  $cmds{&#039;&#039;&amp;amp;lt;Befehlsname&amp;amp;gt;&#039;&#039;} = {  Fn  =&amp;gt; &amp;quot;&#039;&#039;&amp;amp;lt;Funktionsname&amp;amp;gt;&#039;&#039;&amp;quot;,&lt;br /&gt;
                            Hlp =&amp;gt; &amp;quot;&#039;&#039;&amp;amp;lt;Aufrufsyntax&amp;amp;gt;&#039;&#039;&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt;|| Der eigentliche Zweck von &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt; ist dem Nutzer eine Möglichkeit zum Speichern von temporären Daten im globalen Kontext zu ermöglichen. Einige Module verwenden &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt; jedoch auch um modul- &amp;amp; geräteübergreifend Daten auszutauschen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; werden sämtliche Gerätedefinitionen, bzw. die Hash-Referenzen auf diese, gespeichert. Hier ist jedem Gerätenamen eine Hash-Referenz zugeordnet.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt; sind alle geladenen Module gelistet mit ihren entsprechenden Initialisierungsdaten (Funktionsnamen, Attribut-Listen, spezielle Einstellungen, ...). Hier wird für jeden Modulname der Modul-Hash aus der [[#X_Initialize|Initialize]]-Funktion gespeichert. &lt;br /&gt;
Desweiteren legen viele Module, welche nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] hier eine Rückwärtszuordnung von Geräteadressen zu Geräte-Hash an.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; sind alle zu prüfenden Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte regelmäßig über eine Aufruf der entsprechenden [[#X_Ready|Ready]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt; sind alle geöffneten Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte, ob der geöffnete Filedeskriptor unter &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt; Daten zum Lesen bereitgestellt hat. Ist dass der Fall, wird die entsprechende [[#X_Read|Read]]-Funktion aufgerufen, um anstehende Daten durch das Modul zu verarbeiten.&lt;br /&gt;
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt durchaus viele weitere globale Variablen, die jedoch für sehr spezielle Anwendungsfälle und z.T. nur einzelne Module gedacht sind und daher hier nicht aufgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Daten, die ein Modul im Geräte-Hash speichert nennt man Internals. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese &amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt; für den Gerätenamen, welcher beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Diese Daten spielen für FHEM eine sehr wichtige Rolle, da sämtliche gerätespezifischen Daten als Internal im Gerätehash gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Falls Werte wie z.B. ein Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollten, ist eine alternative Möglichkeit die Speicherung in so genannten Attributen. Dann würde man den Define-Befehl so implementieren, dass er kein Intervall übergeben bekommt und statt dessen das Interval als Attribut über den Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
Generell werden alle Werte, welche direkt in der ersten Ebene von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; (Gerätehash) gespeichert werden auf der Detail-Seite einer Definition in der FHEMWEB Oberfläche angezeigt. Es gibt jedoch Ausnahmen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{URL}&amp;lt;/code&amp;gt; - Alle Elemente, welche als Unterelement wieder einen Hash besitzen werden nicht in FHEMWEB dargestellt. Typischerweise speichern Module Daten unter &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}&amp;lt;/code&amp;gt; interne Daten zwischen, die für den User nicht relevant sind, sondern nur der internen Verarbeitung dienen.&lt;br /&gt;
* &amp;lt;code&amp;gt;$hash-&amp;gt;{&#039;&#039;&#039;.&#039;&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;ELEMENT&amp;lt;/font&amp;gt;}&amp;lt;/code&amp;gt; - Alle Knoten, welche mit einem Punkt beginnen werden in der FHEMWEB Oberfläche nicht angezeigt. Man kann diese Daten jedoch beim Aufruf des [[List|list-Kommandos]] einsehen.&lt;br /&gt;
&lt;br /&gt;
Es gibt bereits vorbelegte Internals welche in FHEM dazu dienen definitionsbezogene Informationen wie bspw. Namen und Readings zu speichern. Dies sind im besonderen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 13em;&amp;quot; | Internal !!  Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt;  || Der Definitionsname, mit dem das Gerät angelegt wurde.  &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}&amp;lt;/code&amp;gt;  || Enthält alle aktuell vorhandenen Readings. Daten unterhalb dieses Knotens sollte man nicht direkt manipulieren. Um Readings zu Erzeugen gibt es entsprechende [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NR}&amp;lt;/code&amp;gt;  || Die Positions-Nr. der Definition innerhalb der Konfiguration. Diese dient dazu die Konfiguration in der gleichen Reihenfolge zu speichern, wie die einzelnen Geräte angelegt wurden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt;  || Der Modulname, mit welchem die Definition angelegt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{DEF}&amp;lt;/code&amp;gt;  || Sämtliche Argumente, welche beim &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl nach dem Modulnamen übergeben wurden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{CFGFN}&amp;lt;/code&amp;gt;  || Der Dateiname der Konfigurationsdatei in der diese Definition enthalten ist (sofern nicht in fhem.cfg). Dieser Wert ist nur gefüllt, wenn man mit mehreren Konfigurationsdateien arbeitet, welche dann in fhem.cfg via include-Befehl eingebunden werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt;  || Sofern das Modul Events via [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] verarbeitet enthält jede Definition eine Notify-Order als Zeichenkette bestehend aus dem Notify Order Prefix und dem Definitionsnamen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt &amp;quot;Reihenfolge für den Aufruf der Notify-Funktion beeinflussen&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt;  || Sofern das Modul Events via NotifyFn verarbeitet kann man damit die Definitionen, von denen man Events erhalten will begrenzen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt &amp;quot;Begrenzung der Aufrufe auf bestimmte Geräte&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt;  || Hier wird das zugeordnete IO-Gerät durch [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] gespeichert, welches für den Datentransport und -empfang dieses logischen Gerätes zuständig ist. Dieser Wert existiert nur bei Modulen die nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] arbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt;  || Hier werden alle Events kurzzeitig gesammelt, welche für die Eventverarbeitung anstehen. Insbesondere die [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] speichern hier alle Events zwischen um sie nach Abschluss via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] zu verarbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt;  || Wenn die Definition eine Netzwerkverbindung oder serielle Schnittstelle geöffnet hat (z.B. via [[DevIo]]), so wird der entsprechende File-Deskriptor in diesem Internal gespeichert. Damit kann FHEM alle geöffneten Filedeskriptoren der entsprechenden Definition zuordnen um bei ankommenden Daten die Definition via [[DevelopmentModuleIntro#X_Read|Read-Funktion]] damit zu versorgen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt;  || Ähnlich wie &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt;. Sofern die Definition in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; eingetragen ist und ein Fildeskriptor in diesem Internal gesetzt ist, wird bei einer auftretenden Exception bzw. Interrupt die [[DevelopmentModuleIntro#X_Except|Except]]-Funktion des entsprechenden Moduls aufgerufen um darauf zu reagieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Generell sollte man die meisten der hier genannten systemweiten Internals nicht modifizieren, da ansonsten die korrekte Funktionsweise von FHEM nicht mehr garantiert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Daten, welche von einem Gerät gelesen werden und in FHEM in einer für Menschen verständlichen Form zur Verfügung gestellt werden können, werden Readings genannt. Sie geben den Status des Gerätes wieder und erzeugen Events innerhalb von FHEM auf die andere Geräte reagieren können. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}{temperature}{VAL}&amp;lt;/code&amp;gt; für die Temperatur eines Fühlers&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}{temperature}{TIME}&amp;lt;/code&amp;gt; für den Zeitstempel der Messung&lt;br /&gt;
&lt;br /&gt;
Für den lesenden Zugriff auf Readings steht die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#ReadingsVal|ReadingsVal()]]&amp;lt;/code&amp;gt; zur Verfügung. Ein direkter Zugriff auf die Datenstruktur sollte nicht vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Readings werden im Statefile von FHEM automatisch auf der Festplatte zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen. Dadurch ist der letzte Status eines Gerätes vor einem Neustart nachvollziehbar.&lt;br /&gt;
&lt;br /&gt;
Readings, die mit einem Punkt im Namen beginnen, haben eine funktionale Besonderheit. Sie werden im FHEMWEB nicht angezeigt und können somit als &amp;quot;Permanentspeicher&amp;quot; für kleinere Daten innerhalb des Moduls genutzt werden. Um größere Datenmengen permanent zu speichern sollte man jedoch die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#setKeyValue|setKeyValue()]]&amp;lt;/code&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
Zum Setzen von Readings sollen &lt;br /&gt;
*bei Gruppen von Readings der Funktionsblock &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]&amp;lt;/code&amp;gt; (mehrfach wiederholt), &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*bei einzelnen Updates die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]&amp;lt;/code&amp;gt; &lt;br /&gt;
aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht. Events erzeugen, je nach Hardwareperformance, spürbare Last auf dem System (siehe [[DevelopmentModuleIntro#X_Notify|NotifyFn]]), das Ändern von Readings ohne dass dabei Events erzeugt werden jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Eine Sequenz zum Setzen von Readings könnte folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
readingsBulkUpdate($hash, $readingName1, $wert1 );&lt;br /&gt;
readingsBulkUpdate($hash, $readingName2, $wert2 );&lt;br /&gt;
readingsEndUpdate($hash, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Readings zu löschen, wird für die Modulprogrammierung die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsDelete|readingsDelete()]]&amp;lt;/code&amp;gt; empfohlen. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsDelete($hash, $readingsname) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Hinweis|&#039;&#039;&#039;Hintergrundinfo dazu aus dem Forum:&#039;&#039;&#039; {{Link2Forum|Topic=83069|Message=753066}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CommandDeleteReading()&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;deletereading&amp;lt;/code&amp;gt; ist eher fuer den Endbenutzer und seine userReadings gedacht, und macht bei den Modulen die unnoetige Schleife ueber [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wenn der Modulautor beim Aufruf auch &amp;lt;code&amp;gt;$cl&amp;lt;/code&amp;gt; weitergibt, und der Anwender meint, dieses Geraet auf blacklist setzen zu muessen, dann kann das Modul sein eigenes Reading nicht entfernen, und das ist kontraproduktiv.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
FHEM verfügt über einen Event-Mechanismus um Änderungen verschiedenster Art an einzelne oder alle Definitionen mitzuteilen. Jedes Modul (und damit alle Definitionen dieses Moduls) können auf Events von FHEM selber (Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;) oder von anderen Definitionen reagieren und dadurch selber aktiv werden. Ein Event wird innerhalb von FHEM als Zeichenkette behandelt.&lt;br /&gt;
&lt;br /&gt;
Events sind grundsätzlich immer definitionsbezogen. Das bedeutet, dass ein Event immer in Verbindung mit einem Definitionsnamen erzeugt wird. Jede Definition, welche ein Event verarbeitet, erhält den Definitions-Hash (&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) der auslösenden Definition.&lt;br /&gt;
&lt;br /&gt;
Events werden typischerweise bei der Erstellung von Readings implizit für jedes einzelne Reading erzeugt. Es gibt jedoch auch Events die nichts mit Readings zu tun haben um anderweitige Änderungen bekannt zu geben.&lt;br /&gt;
&lt;br /&gt;
Eigene Events können in FHEM mit der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] erzeugt werden. Um auf Events in einem Modul reagieren zu können, muss eine [[#X_Notify|Notify]]-Funktion implementiert sein. Sobald ein oder mehrere Events für eine Definition getriggert werden, prüft FHEM, welche Definitionen über Events der auslösenden Definition informiert werden möchten. Diese werden dann nacheinander in einer bestimmten Reihenfolge durch Aufruf der [[#X_Notify|Notify]]-Funktion über anstehende Events in Kenntnis gesetzt. Es obliegt dann dem jeweiligen Modul, wie es auf die Events reagiert.&lt;br /&gt;
&lt;br /&gt;
=== globale Events ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;globale Events&amp;quot; werden alle Events bezeichnet, die durch die Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; erzeugt werden. Es handelt sich hierbei um Events die Strukturänderungen in der Konfiguration, als auch systemweite Ereignisse zu FHEM selbst signalisieren.&lt;br /&gt;
&lt;br /&gt;
Hier eine kurze Zusammenfassung, welche Events durch &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; getriggert werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Allgemeine Events:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event-Text !! Beschreibung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;INITIALIZED&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Start von FHEM ist abgeschlossen. Sämtliche Definitionen und Attribute wurden aus der Konfiguration (fhem.cfg oder configDB) eingelesen, sowie sämtliche Readings sind aus dem State-File eingelesen und stehen nun voll umfänglich zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;REREADCFG&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Konfiguration wurde erneut eingelesen. Dies bedeutet, es wurden alle Definitionen/Attribute/Readings aus FHEM entfernt und durch Einlesen der Konfiguration neu angelegt. (FHEM-Befehl: &amp;quot;rereadcfg&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;SAVE&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die laufende Konfiguration soll gespeichert werden (in fhem.cfg oder configDB). Dieses Event wird &#039;&#039;&#039;VOR&#039;&#039;&#039; dem Speichern der Konfiguration getriggert. Sobald der Trigger verarbeitet wurde, beginnt das Speichern der Konfiguration. (FHEM-Befehl: &amp;quot;save&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;SHUTDOWN&amp;lt;/code&amp;gt;&#039;&#039;&#039; || FHEM wird sich beenden. (FHEM-Befehl: &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt; DELAYEDSHUTDOWN &amp;lt;/code&amp;gt;&#039;&#039;&#039; || FHEM wird sich beenden. (FHEM-Befehl: &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde ein Update erfolgreich installiert. (FHEM-Befehl: &amp;quot;update&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Definitionsbezogene Events:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event-Text !! Beschreibung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;DEFINED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde eine neue Definition mit Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; angelegt. (FHEM-Befehl: &amp;quot;define&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;DELETED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde gelöscht. (FHEM-Befehl: &amp;quot;delete&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;RENAMED &#039;&#039;&amp;lt;Alt&amp;gt;&#039;&#039; &#039;&#039;&amp;lt;Neu&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Alt&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde in den Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Neu&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; umbenannt. (FHEM-Befehl: &amp;quot;rename&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;MODIFIED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde modifiziert. (FHEM-Befehl: &amp;quot;modify&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;UNDEFINED &#039;&#039;&amp;lt;Name&amp;gt; &amp;lt;Modul&amp;gt; &amp;lt;Define-Parameter&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde eine Nachricht von einem physikalischen Modul (siehe [[#Zweistufiges Modell für Module|zweistufiges Modulkonzept]]) erhalten, für die keine passende logische Definition in FHEM existiert. Details dazu, siehe dazu Abschnitt [[#Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)|Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Begrenzung von Events ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul, welches Events verarbeitet, kann die Eventverarbeitung auf bestimmte Definitionen begrenzen. Dadurch werden nur Events an das Modul gemeldet (via [[#X_Notify|X_Notify()]]), welche von einer oder mehreren bestimmten Definitionen getriggert wurden. Dadurch werden unnötige Events nicht an das Modul gemeldet und schont somit Ressourcen.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig werden sämtliche Events ohne Begrenzung an ein Modul gemeldet, welches eine [[#X_Notify|Notify]]-Funktion implementiert hat und somit Events verarbeiten kann. Details zur Begrenzung von Events findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].&lt;br /&gt;
&lt;br /&gt;
=== Reihenfolge der Eventverarbeitung ===&lt;br /&gt;
&lt;br /&gt;
Ein getriggertes Event wird nacheinander gegen jede Definition geprüft, deren Modul eine [[#X_Notify|Notify]]-Funktion implementiert hat. Dies bedeutet, jede Definition wird nacheinander durch Aufruf der [[#X_Notify|Notify]]-Funktion mit dem Definitionshash der auslösenden Definition aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Unter bestimmten Umständen kann es erforderlich sein, in diese Reihenfolge einzugreifen. Beispielsweise wenn das eigene Modul und deren Definitionen das Event als letztes oder erstes verarbeiten müssen. Ein Beispiel bietet hierbei das Modul [[dewpoint]], welches Events vor allen anderen Modulen verarbeiten muss.&lt;br /&gt;
&lt;br /&gt;
Details, wie man die Reihenfolge der Eventverarbeitung steuern kann, findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Damit der Nutzer das Verhalten einer einzelnen Gerätedefinition zur Laufzeit individuell anpassen kann, gibt es in FHEM für jede Definition sogenannte Attribute, welche mit dem Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; gesetzt werden können.&lt;br /&gt;
Diese stehen dann dem Modul unmittelbar zur Verfügung um das Verhalten während der Ausführung zu beeinflussen. Attribute werden zusammen mit dem &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl der jeweiligen Definition beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben. Beim Neustart werden die entsprechenden Befehle ausgeführt um alle Definition inkl. Attribute wieder anzulegen. Zur Laufzeit werden Attribute in dem globalen Hash &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; mit dem Definitionsnamen als Index (&amp;lt;code&amp;gt;$attr{$name} = $value&amp;lt;/code&amp;gt;) gespeichert. Ein Attribut mit dem Namen &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; würde beispielsweise mit &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; adressiert. Generell sollte &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; nicht durch direkten Zugriff manipuliert/benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen von Attributen sollte die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Welche Attribute ein Modul unterstützt muss in der Funktion &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]&amp;lt;/code&amp;gt; durch Setzen von &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; bekannt gemacht werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Wenn beim Setzen von Attributen in einer Gerätedefinition entsprechende Werte geprüft werden sollen oder zusätzliche Funktionalitäten implementiert werden müssen, dann muss dies in der Funktion &amp;lt;code&amp;gt;[[#X_Attr|X_Attr]]&amp;lt;/code&amp;gt; (siehe unten) implementiert werden. Hier kann man bspw. einen Syntaxcheck für Attribut-Werte implementieren um ungültige Werte zurückzuweisen.&lt;br /&gt;
&lt;br /&gt;
== Modulfunktionen ==&lt;br /&gt;
&lt;br /&gt;
Damit fhem.pl ein Modul nutzen kann, muss dieses entsprechende Funktionen mit einer vorgegebenen Aufrufsyntax implementieren. Durch die Bekanntgabe dieser modulspezifischen Funktionen können Daten zwischen fhem.pl und einem Modul entsprechend ausgetauscht werden. Es gibt verschiedene Arten von Funktionen die ein Modul anbieten muss bzw. kann, je nach Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
=== Die wichtigsten Funktionen in einem Modul ===&lt;br /&gt;
&lt;br /&gt;
Folgende Funktion muss ein Modul mit dem beispielhaften Namen &amp;quot;X&amp;quot; mindestens bereitstellen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
|  [[#X_Initialize|X_Initialize]] || Initialisiert das Modul und gibt den Namen zusätzlicher Modulfunktionen bekannt, sowie modulspezifische Einstellungen. Wird direkt nach dem erfolgreichen Laden des Moduls durch fhem.pl aufgerufen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Funktionen sind die wichtigsten Funktionen, welche je nach Anwendungsfall zu implementieren sind. Es handelt sich hierbei um die wichtigsten Vertreter, welche in den meisten Modulen Verwendung finden. Nicht alle Funktionen machen jedoch in jedem Modul Sinn. Generell sollte auch hier bei jeder Funktion der Modulname vorangestellt werden um ein einheitliches Namensschema zu gewährleisten. Hier die wichtigsten Modulfunktionen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Define|X_Define]] || Wird im Rahmen des &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehls aufgerufen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Undef|X_Undef]] || Wird im Rahmen des &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;-Befehls, sowie &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;-Befehl aufgerufen. Dient zum Abbau von offenen Verbindungen, Timern, etc.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Delete|X_Delete]] || Wird im Rahmen des beim &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;-Befehls aufgerufen wenn das Gerät endgültig gelöscht wird um weiterführende Aktionen vor dem Löschen durchzuführen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Get|X_Get]] || Wird im Rahmen des &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Befehls aufgerufen um Daten vom Gerät abzufragen&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Set|X_Set]]  || Wird im Rahmen des &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;-Befehls aufgerufen um Daten an das Gerät zu senden.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Attr|X_Attr]]  || Wird im Rahmen des &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls aufgerufen um Attributwerte zu prüfen)&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Read|X_Read]]  || Wird durch FHEM aufgerufen, wenn ein gelisteter Filedeskriptor in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; Daten zum Lesen bereitstellt.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Ready|X_Ready]]  || Wird unter Windows durch FHEM aufgerufen um zyklisch einen seriellen Filedeskriptor auf lesbare Daten zu prüfen. Unter Linux dient diese Funktion dem Wiederaufbau verlorener Verbindungen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Notify|X_Notify]]  || Verarbeitet Events von anderen Geräten innerhalb von FHEM&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Rename|X_Rename]] || Wird aufgerufen, wenn ein Gerät umbenannt wird.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Shutdown|X_Shutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_DelayedShutdown | X_DelayedShutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; im Namen muss dabei auf den Namen des Moduls bzw. des definierten Gerätetyps geändert werden. Im Modul mit der Datei &amp;lt;code&amp;gt;36_JeeLink.pm&amp;lt;/code&amp;gt; beispielsweise ist der Name der Funktion &amp;lt;code&amp;gt;JeeLink_Initialize&amp;lt;/code&amp;gt;. Die Funktion wird von fhem.pl nach dem Laden des Moduls aufgerufen und bekommt eine leere Hashreferenz für den Initialisierungsvorgang übergeben. &lt;br /&gt;
&lt;br /&gt;
Dieser Hash muss nun von X_Initialize mit allen modulrelevanten Funktionsnamen gefüllt werden. Anschließend wird dieser Hash durch fhem.pl im globalen Hash &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt; gespeichert. &amp;lt;code&amp;gt;$modules{ModulName}&amp;lt;/code&amp;gt; wäre dabei der Hash für das Modul mit dem Namen &amp;lt;code&amp;gt;ModulName&amp;lt;/code&amp;gt;. Es handelt sich also nicht um den oben beschriebenen Hash der Geräteinstanzen sondern einen Hash, der für jedes Modul existiert und modulspezifische Daten wie bspw. die implementierten Modulfunktionen enthält. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DefFn}                = \&amp;amp;X_Define;&lt;br /&gt;
$hash-&amp;gt;{UndefFn}              = \&amp;amp;X_Undef;&lt;br /&gt;
$hash-&amp;gt;{DeleteFn}             = \&amp;amp;X_Delete;&lt;br /&gt;
$hash-&amp;gt;{SetFn}                = \&amp;amp;X_Set;&lt;br /&gt;
$hash-&amp;gt;{GetFn}                = \&amp;amp;X_Get;&lt;br /&gt;
$hash-&amp;gt;{AttrFn}               = \&amp;amp;X_Attr;&lt;br /&gt;
$hash-&amp;gt;{ReadFn}               = \&amp;amp;X_Read;&lt;br /&gt;
$hash-&amp;gt;{ReadyFn}              = \&amp;amp;X_Ready;&lt;br /&gt;
$hash-&amp;gt;{NotifyFn}             = \&amp;amp;X_Notify;&lt;br /&gt;
$hash-&amp;gt;{RenameFn}             = \&amp;amp;X_Rename;&lt;br /&gt;
$hash-&amp;gt;{ShutdownFn}           = \&amp;amp;X_Shutdown;&lt;br /&gt;
$hash-&amp;gt;{DelayedShutdownFn}    = \&amp;amp;X_ DelayedShutdown;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine entsprechende Funktion in FHEM bekannt zu machen muss dazu der Funktionsname, wie er im Modul als &amp;lt;code&amp;gt;sub &amp;amp;lt;&#039;&#039;Funktionsname&#039;&#039;&amp;amp;gt;() { ... }&amp;lt;/code&amp;gt; definiert ist, in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; bekanntgemacht werden. Vorzugsweise direkt wie im Beispiel als Codereferenz. Dabei sollten die entsprechenden Funktionsnamen immer den Modulnamen (in diesem Beispiel &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;) als Präfix verwenden, wenn diese im Package &amp;quot;main&amp;quot; veröffentlicht werden.&lt;br /&gt;
Auf diese Weise können sämtliche modulspezifisch implementierten Funktionen wie &amp;lt;code&amp;gt;X_Read&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X_Parse&amp;lt;/code&amp;gt; etc. durch Zuweisung an &amp;lt;code&amp;gt;$hash-&amp;gt;{ReadFn}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;$hash-&amp;gt;{ParseFn}&amp;lt;/code&amp;gt; usw. bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sollten die vom Modul unterstützten Attribute definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{AttrList} =&lt;br /&gt;
  &amp;quot;do_not_notify:1,0 &amp;quot; . &lt;br /&gt;
  &amp;quot;header &amp;quot; .&lt;br /&gt;
  $readingFnAttributes;  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Auflistung aller unterstützten modulspezifischen Attribute erfolgt in Form einer durch Leerzeichen getrennten Liste in &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt;. Es gibt in FHEM globale Attribute, die in allen Gerätedefinitionen verfügbar sind und nur modulspezifische Attribute die jedes Modul via &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; über die eigene Initialize-Funktion setzt.  In fhem.pl werden dann die entsprechenden Attributwerte beim Aufruf eines &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls in die globale Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt;, z.B. &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; für das Attribut &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; gespeichert. Falls im Modul weitere Aktionen oder Prüfungen beim Setzen eines Attributs nötig sind, dann kann wie im Beispiel oben die [[#X_Attr|Attr]]-Funktion implementiert und in der Initialize-Funktion bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$readingFnAttributes&amp;lt;/code&amp;gt;, die im obigen Beispiel an die Liste der unterstützten Attribute angefügt wird, definiert Attributnamen, die dann zusätzlich gemacht werden, wenn das Modul zum Setzen von Readings die Funktionen &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]&amp;lt;/code&amp;gt; verwendet. In diesen Funktionen werden Attribute wie &amp;lt;code&amp;gt;event-min-interval&amp;lt;/code&amp;gt; oder auch &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; ausgewertet. Für Details hierzu siehe commandref zu {{Link2CmdRef|Anker=readingFnAttributes|Label=readingFnAttributes}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt; [[DevelopmentModuleAPI#parseParams|parseParams()]]&amp;lt;/code&amp;gt; unterstützt Modul-Autoren beim Parsen von Übergabeparametern, welche bei &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; Kommandos an die entsprechenden Modulfunktionen übergeben werden. Dadurch lassen sich auf einfache Weise insbesondere komplexe Parameter (wie bspw. Perl-Ausdrücke) sehr einfach parsen.&lt;br /&gt;
&lt;br /&gt;
Diese Zusatzfunktion kann man in der Initialize-Funktion einfach über folgenden Parameter für [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion modulweit aktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sobald es gesetzt ist wird automatisch durch fhem.pl &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#parseParams|parseParams()]]&amp;lt;/code&amp;gt; aufgerufen und die an die [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion übergebenen Parameter ändern sich wie weiter unten in den jeweiligen Funktionen beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Define-Funktion eines Moduls wird von FHEM aufgerufen wenn der Define-Befehl für ein Geräte ausgeführt wird und das Modul bereits geladen und mit der Initialize-Funktion initialisiert ist. Sie ist typischerweise dazu da, die übergebenen Parameter zu prüfen und an geeigneter Stelle zu speichern sowie einen Kommunikationsweg zum Gerät zu öffnen (z.B. TCP-Verbindung, USB-Schnittstelle o.ä.) oder einen [[#Pollen_von_Geräten|Status-Timer]] zu starten.&lt;br /&gt;
Sie beginnt typischerweise mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	my @a = split( &amp;quot;[ \t][ \t]*&amp;quot;, $def );&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den die im &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl übergebenen Parameter. Welche bzw. wie viele Parameter &lt;br /&gt;
akzeptiert werden und welcher Syntax diese entsprechen müssen ist Sache dieser Funktion. Im obigen Beispiel wird die Argumentzeile &amp;lt;code&amp;gt;$def&amp;lt;/code&amp;gt; in ein Array aufgeteilt (durch Leerzeichen/Tabulator getrennt) und so können die vom Modul bzw. der Define-Funktion erwarteten Werte über das Array der Reihe nach verarbeitet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $name   = $a[0];&lt;br /&gt;
my $module = $a[1];&lt;br /&gt;
my $url    = $a[2];&lt;br /&gt;
my $inter  = 300;&lt;br /&gt;
&lt;br /&gt;
if(int(@a) == 4) { &lt;br /&gt;
	$inter = $a[3]; &lt;br /&gt;
	if ($inter &amp;lt; 5) {&lt;br /&gt;
		return &amp;quot;interval too small, please use something &amp;gt; 5s, default is 300 seconds&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit die übergebenen Werte auch anderen Funktionen zur Verfügung stehen und an die jeweilige Geräteinstanz gebunden sind, werden die Werte typischerweise als Internals im Hash der Geräteinstanz gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{url} 		= $url;&lt;br /&gt;
$hash-&amp;gt;{Interval}	= $inter;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald alle Parameter korrekt verarbeitet wurden, wird in der Regel die erste Verbindung zum Gerät aufgebaut. Je nach Art des Geräts kann das eine permanente Datenverbindung sein (z.B. serielle Schnittstelle oder TCP-Verbindung) oder das Starten eines regelmäßigen Timers, der zyklisch den Status z.B. via [[HttpUtils|HTTP]] ausliest.&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Define-Funktion Syntax-Probleme der Übergabeparameter festgestellt werden oder es kann bspw. keine Verbindung aufgebaut werden, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn alle Übergabeparameter akzeptiert werden, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Sobald eine Define-Funktion eine Fehlermeldung zurückmeldet, wird der define-Befehl durch FHEM zurückgewiesen und der User erhält die Fehlermeldung, welche die Define-Funktion produziert hat, als Ausgabe zurück.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;u&amp;gt;Verfügbarkeit von Attributen&amp;lt;/u&amp;gt; =====&lt;br /&gt;
Während die Define-Funktion ausgeführt wird, sollte man nicht davon ausgehen, dass alle vom Nutzer konfigurierten Attribute via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verfügbar sind. Attribute stehen in der Define-Funktion nur dann zur Verfügung, wenn FHEM sich nicht in der Initialisierungsphase befindet (globale Variable &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; ist wahr; der Nutzer hat die Gerätedefinition modifiziert). Daher sollte man weiterführende Funktion, welche auf gesetzte Attribute angewiesen sind, nur dann in der Define-Funktion starten, wenn &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; zutrifft.&lt;br /&gt;
&lt;br /&gt;
Andernfalls sollte man den Aufruf in der Notify-Funktion durchführen sobald &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt; getriggert wurde:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	X_FunctionWhoNeedsAttr($hash) if($init_done);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
	my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
	my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
 &lt;br /&gt;
	return &amp;quot;&amp;quot; if(IsDisabled($ownName)); # Return without any further action if the module is disabled&lt;br /&gt;
 &lt;br /&gt;
	my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
	my $events = deviceEvents($dev_hash, 1);&lt;br /&gt;
&lt;br /&gt;
	if($devName eq &amp;quot;global&amp;quot; &amp;amp;&amp;amp; grep(m/^INITIALIZED|REREADCFG$/, @{$events}))&lt;br /&gt;
	{&lt;br /&gt;
		 X_FunctionWhoNeedsAttr($hash);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die Modulfunktion X_FunctionWhoNeedsAttr() nach dem Start erst aufgerufen, wenn alle Attribute aus der Konfiguration geladen wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Aufteilen und Parsen von &amp;lt;code&amp;gt;$def&amp;lt;/code&amp;gt; lässt sich die Funktion [[DevelopmentModuleAPI#parseParams|parseParams()]] verwenden um die einzelnen Argumente einfach zu parsen. Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird parseParams() automatisch aufgerufen und X_Define() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
==== X_Undef ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Undef ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Undef-Funktion wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird oder bei der Abarbeitung des Befehls &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu einliest. Entsprechend müssen in der Funktion typische Aufräumarbeiten durchgeführt werden wie das saubere Schließen von Verbindungen oder das Entfernen von internen Timern, sofern diese im Modul zum Pollen verwendet wurden (siehe Abschnitt [[#Pollen_von_Geräten|Pollen von Geräten]]). &lt;br /&gt;
&lt;br /&gt;
Zugewiesene Variablen im Hash der Geräteinstanz, Internals oder Readings müssen hier nicht gelöscht werden. In fhem.pl werden die entsprechenden Strukturen beim Löschen der Geräteinstanz ohnehin vollständig gelöscht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Undef($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name) = @_;       &lt;br /&gt;
	DevIo_CloseDev($hash);         &lt;br /&gt;
	RemoveInternalTimer($hash);    &lt;br /&gt;
	return undef;                  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Undef-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn die Undef-Funktion erfolgreich durchgeführt wurde, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht bzw. neu angelegt. Sollte die Undef-Funktion jedoch eine Fehlermeldung zurückgeben, wird der entsprechende Vorgang (&amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;) für dieses Gerät abgebrochen. Es bleibt dann unverändert in FHEM bestehen.&lt;br /&gt;
&lt;br /&gt;
==== X_Delete ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Delete ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Delete-Funktion ist das Gegenstück zur Funktion [[#X_Define|X_Define]] und wird aufgerufen wenn ein Gerät mit dem Befehl &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Gerät in FHEM gelöscht wird, wird zuerst die Funktion [[#X_Undef|X_Undef]] aufgerufen um offene Verbindungen zu schließen, anschließend wird die Funktion X_Delete aufgerufen. Diese dient eher zum Aufräumen von dauerhaften Daten, welche durch das Modul evtl. für dieses Gerät spezifisch erstellt worden sind. Es geht hier also eher darum, alle Spuren sowohl im laufenden FHEM-Prozess, als auch dauerhafte Daten bspw. im physikalischen Gerät zu löschen die mit dieser Gerätedefinition zu tun haben.&lt;br /&gt;
&lt;br /&gt;
Dies kann z.B. folgendes sein:&lt;br /&gt;
&lt;br /&gt;
* Löschen von Dateien im Dateisystem die während der Nutzung dieses Geräts angelegt worden sind.&lt;br /&gt;
* Lösen von evtl. Pairings mit dem physikalischen Gerät &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Delete($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name ) = @_;       &lt;br /&gt;
&lt;br /&gt;
	# Löschen von Geräte-assoziiertem Temp-File&lt;br /&gt;
	unlink($attr{global}{modpath}.&amp;quot;/FHEM/FhemUtils/$name.tmp&amp;quot;;)&lt;br /&gt;
&lt;br /&gt;
	return undef;&lt;br /&gt;
}    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Delete-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur die Delete-Funktion erfolgreich durchgeführt wurde, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht. Sollte die Delete-Funktion eine Fehlermeldung zurückgeben, wird der Löschvorgang abgebrochen und das Gerät bleibt weiter in FHEM bestehen.&lt;br /&gt;
&lt;br /&gt;
==== X_Get ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get ($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $opt, @args ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Get-Funktion wird aufgerufen wenn der FHEM-Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; für eine Definition dieses Moduls ausgeführt wird. Mit &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; werden typischerweise Werte von einem Gerät abgefragt. In vielen Modulen wird auf diese Weise auch der Zugriff auf generierte Readings ermöglicht. Der Get-Funktion wird dabei der Definitions-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;, der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;, sowie die Aufrufparameter &amp;lt;code&amp;gt;$opt&amp;lt;/code&amp;gt; plus optional weiterer Parameter &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; übergeben. Als Rückgabewert &amp;lt;code&amp;gt;$result&amp;lt;/code&amp;gt; wird das Ergebnis des entsprechenden Befehls in Form einer Zeichenkette zurückgegeben. Der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; hat hierbei keine besondere Bedeutung und wird behandelt wie eine leere Zeichenkette &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $opt, @args ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;get $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($opt));&lt;br /&gt;
&lt;br /&gt;
	if($opt eq &amp;quot;status&amp;quot;) &lt;br /&gt;
	{&lt;br /&gt;
	   ...&lt;br /&gt;
	}&lt;br /&gt;
	elsif($opt eq &amp;quot;power&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   ...&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of status power [...]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine unbekannte Option an die Get-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Get-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf &amp;lt;code&amp;gt;get &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;&amp;lt;NAME&amp;gt;&#039;&#039;&amp;lt;/font&amp;gt; &amp;lt;u&amp;gt;&#039;&#039;&#039;?&#039;&#039;&#039;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;, welche durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;unknown&#039;&#039;&#039; argument &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Parameter]&amp;lt;/font&amp;gt;&#039;&#039; &#039;&#039;&#039;choose one of&#039;&#039;&#039; &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Liste möglicher Optionen]&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Get-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort &amp;quot;unknown&amp;quot; vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt &amp;quot;choose one of&amp;quot; mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;return &amp;quot;unknown argument $opt choose one of status temperature humidity&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden als mögliche Optionen für einen Get-Befehl folgende Parameter angegeben:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde in folgenden, mögliche Get-Befehle für einen User resultieren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im weiteren Verlauf der Get-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert direkt abfragen und diesen als Return-Wert der Get-Funktion zurückgeben. Vielfach werden aber auch die vorhandenen Readings zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Get() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
==== X_Set ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set ($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
	return ($error, $skip_trigger);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Set-Funktion ist das Gegenteil zur [[#X_Get|Get]]-Funktion. Sie ist dafür gedacht, Daten zum physischen Gerät zu schicken, bzw. entsprechende Aktionen im Gerät selber auszulösen. Ein Set-Befehl dient daher der direkten Steuerung des physikalischen Gerätes in dem es bspw. Zustände verändert (wie &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;). Der Set-Funktion wird dabei der Definitions-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;, der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;, sowie die Aufrufparameter &amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; und optional weitere Argumente &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; übergeben. Als Rückgabewert &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; kann eine Fehlermeldung in Form Zeichenkette zurückgegeben werden. Der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; bedeutet hierbei, dass der Set-Befehl erfolgreich durchgeführt wurde. Eine Set-Funktion gibt daher nur im Fehlerfall eine Rückmeldung mit einer entsprechenden Fehlermeldung. Der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; wird als &amp;quot;erfolgreich&amp;quot; interpretiert. &lt;br /&gt;
&lt;br /&gt;
Standardmäßig wird jeder Set-Befehl, welcher erfolgreich ausgeführt wurde (&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;), als Event getriggert um dies bspw. in einem FileLog festzuhalten. Dieses Verhalten kann optional unterbunden werden indem der optionale zweite Rückgabewert &amp;lt;code&amp;gt;$skip_trigger&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gesetzt wird. Damit wird das Generieren eines Events für das erfolgreich ausgeführte Set-Kommando unterbunden. Falls nicht gesetzt, wird ein Event erzeugt (&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; mit sämtlichen &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Rückmeldungen (Fehler) von set-Befehlen sämtlicher Module, die im Rahmen der Ausführung eines getriggerten [[Notify]] auftreten, werden im FHEM Logfile festgehalten.&lt;br /&gt;
&lt;br /&gt;
Falls nur interne Daten, die ausschließlich für das Modul relevant sind, gesetzt werden müssen, so sollte statt Set die [[#X_Attr|Attr]]-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht, da sie nur zu Steuerungszwecken im laufenden Betrieb von FHEM dienen.&lt;br /&gt;
 &lt;br /&gt;
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch in der Regel weitere zusätzliche Parameter (&amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;) übergeben um Zustände zu setzen/ändern. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;set $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($cmd));&lt;br /&gt;
&lt;br /&gt;
	if($cmd eq &amp;quot;status&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   if($args[0] eq &amp;quot;up&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   elsif($args[0] eq &amp;quot;down&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   else&lt;br /&gt;
	   {&lt;br /&gt;
	      return &amp;quot;Unknown value $args[0] for $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	   }   &lt;br /&gt;
	}&lt;br /&gt;
	elsif($cmd eq &amp;quot;power&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   if($args[0] eq &amp;quot;on&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   elsif($args[0] eq &amp;quot;off&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }  &lt;br /&gt;
	   else&lt;br /&gt;
	   {&lt;br /&gt;
	      return &amp;quot;Unknown value $args[0] for $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	   }       &lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;Unknown argument $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine unbekannte Option an die Set-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Set-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf &amp;lt;code&amp;gt;set &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;&amp;lt;NAME&amp;gt;&#039;&#039;&amp;lt;/font&amp;gt; &amp;lt;u&amp;gt;&#039;&#039;&#039;?&#039;&#039;&#039;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;, welcher durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;unknown&#039;&#039;&#039; argument &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Parameter]&amp;lt;/font&amp;gt;&#039;&#039; &#039;&#039;&#039;choose one of&#039;&#039;&#039; &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Liste möglicher Optionen]&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Set-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort &amp;quot;unknown&amp;quot; vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt &amp;quot;choose one of&amp;quot; mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;return &amp;quot;unknown argument $cmd choose one of status power&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden als mögliche Optionen für einen Set-Befehl folgende Parameter angegeben:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;power&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde in folgenden, mögliche Set-Befehle für einen User resultieren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; power&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von SetExtensions.pm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dem Nutzer zusätzlich zu den Set-Befehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; auch weiterführende Befehle wie &amp;lt;code&amp;gt;on-for-timer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;on-till&amp;lt;/code&amp;gt;, usw. anbieten möchte, obwohl die zu steuernde Hardware solche Kommandos nicht unterstützt, kann man dies über das Hilfsmodul SetExtensions.pm realisieren.&lt;br /&gt;
&lt;br /&gt;
Das Hilfsmodul SetExtensions.pm bietet weiterführende Set-Kommandos basierend auf den Befehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; an. Dabei werden durch interne Timer bzw. eigens angelegten [[at]]-Definitionen diese Befehle durch FHEM selber umgesetzt. Je nach ausgeführtem Befehl wird der &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;- bzw. &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl dann durch FHEM zum richtigen Zeitpunkt ausgeführt. Vorausgesetzt das Modul unterstützt in der Set-Funktion die Befehle &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;, so werden durch den Einsatz von SetExtensions.pm folgende Befehle zusätzlich unterstützt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Set-Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-for-timer &#039;&#039;&amp;amp;lt;Dauer&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-for-timer 120&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-Befehl ein und nach der angegebenen Dauer in Sekunden via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-for-timer &#039;&#039;&amp;amp;lt;Dauer&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-for-timer 120&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl aus und nach der angegebenen Dauer in Sekunden via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; wieder ein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till 16:30&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-Befehl ein und zum angegebenen Zeitpunkt via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till 16:30&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl aus und zum angegebenen Zeitpunkt via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; wieder ein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till-overnight &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till-overnight 01:00&amp;lt;/code&amp;gt; || Ähnlich wie &amp;lt;code&amp;gt;on-till&amp;lt;/code&amp;gt;. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till-overnight &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till-overnight 01:00&amp;lt;/code&amp;gt; || Ähnlich wie &amp;lt;code&amp;gt;off-till&amp;lt;/code&amp;gt;. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;blink &#039;&#039;&amp;amp;lt;Anzahl&amp;amp;gt; &amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;blink 3 1&amp;lt;/code&amp;gt; || Schaltet das Gerät via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; für &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; Sekunden ein und anschließend via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus. Nach &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; Sekunden wird das ganze wiederholt, solange bis die angegebene Anzahl erreicht ist.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;intervals &#039;&#039;&amp;amp;lt;Start&amp;amp;gt;-&amp;amp;lt;Ende&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Start&amp;amp;gt;-&amp;amp;lt;Ende&amp;amp;gt;&#039;&#039; ...&amp;lt;/code&amp;gt; || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;intervals 07:00-08:00 16:30-18:00&amp;lt;/code&amp;gt; || Schaltet das Gerät innerhalb der übergebenen Zeiträumen via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; ein. Sobald die aktuelle Zeit ausserhalb dieser Zeiträume liegt, wird das Gerät via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder ausgeschaltet. Es können dabei beliebig viele Zeiträume angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt;  || Sofern der aktuelle Status &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; ist, wird das Gerät via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; ausgeschaltet. Andernfalls wird es via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; eingeschaltet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine kurze Beschreibung zu den möglichen Befehlen durch SetExtensions.pm gibt es auch in der commandref zum {{Link2CmdRef|Anker=set|Label=set-Befehl}}.&lt;br /&gt;
&lt;br /&gt;
Um SetExtensions.pm in der Set-Funktion nutzen zu können müssen folgende Aktionen durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
# Laden von SetExtensions.pm via &amp;lt;code&amp;gt;use SetExtensions;&amp;lt;/code&amp;gt; am Anfang des Moduls&lt;br /&gt;
# Aufruf und Rückgabe der Funktion [[DevelopmentModuleAPI#SetExtensions|SetExtensions()]] sofern die Set-Funktion mit dem übergebenen Befehl nichts anfangen kann.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use SetExtensions;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
	my $cmdList = &amp;quot;on off&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;set $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($cmd));&lt;br /&gt;
&lt;br /&gt;
	if($cmd eq &amp;quot;on&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		# Gerät einschalten...&lt;br /&gt;
	}&lt;br /&gt;
	elsif($cmd eq &amp;quot;off&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		# Gerät ausschalten...&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else # wenn der übergebene Befehl nicht durch X_Set() verarbeitet werden kann, Weitergabe an SetExtensions()&lt;br /&gt;
	{&lt;br /&gt;
		return SetExtensions($hash, $cmdList, $name, $cmd, @args);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte der übergebene Set-Befehl auch für SetExtensions unbekannt sein (bspw. &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; ?&amp;lt;/code&amp;gt;), so generiert SetExtensions() eine entsprechende Usage-Meldung, welche innerhalb der Set-Funktion an FHEM zurückgegeben werden muss.&lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Beschreibung zu der Funktion SetExtensions() gibt es in der  [[DevelopmentModuleAPI#SetExtensions|API-Referenz]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Set() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von FHEMWEB-Widgets&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das GUI-Modul [[FHEMWEB]] kann für die einzelnen Set-Optionen, die das Modul versteht, automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht der GUI kann der Anwender dann die jeweiligen Werte komfortabel auswählen. Dafür muss die Set-Funktion, wenn sie mit der Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; aufgerufen wird, nicht nur einen Text mit  &amp;lt;code&amp;gt;&amp;quot;Unknown ... choose one of ...&amp;quot;&amp;lt;/code&amp;gt; zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt entsprechende Zusatzinformationen anhängen.&lt;br /&gt;
Meist prüft man in den Modulen gar nicht auf die Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; sondern gibt generell bei unbekannten Optionen diesen Text zurück. Das Modul FHEMWEB ermittelt die Syntax eines Gerätes jedoch immer mit dem Befehl:&lt;br /&gt;
 set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; ?&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
	return &amp;quot;Unknown argument $cmd, choose one of status:up,down power:on,off on:noArg off:noArg&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Kommata getrennte Werte ergeben eine Drop-Down Liste, mit der der User die Werte auswählen kann&lt;br /&gt;
&amp;lt;pre&amp;gt;timer:30,120,300&lt;br /&gt;
mode:verbose,ultra,relaxed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Doppelpunkt zum Kommando angegeben, so wird eine Eingabezeile angezeigt, die die freie Eingabe eines Wertes erlaubt.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch die Eingabe-/Auswahlmöglichkeiten durch Widgets vereinfachen. Dazu gibt man hinter dem Doppelpunkt einen Widgetnamen und widgetspezifische Parameter an. Es existieren mehrere solcher Widgets in FHEMWEB. Die gebräuchlichsten sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zusatz !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;noArg&#039;&#039;&#039; || &amp;lt;code&amp;gt;reset:noArg&amp;lt;/code&amp;gt;|| Es werden keine weiteren Argumente mehr benötigt. In so einem Fall wird bei der Auswahl keine Textbox oder ähnliches angezeigt, da keine weiteren Argumente für diesen Befehl notwendig sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;slider&#039;&#039;&#039;,&amp;lt;min&amp;gt;,&amp;lt;step&amp;gt;,&amp;lt;max&amp;gt; || &amp;lt;code&amp;gt;dim:slider,0,1,100&amp;lt;/code&amp;gt;|| Es wird ein Schieberegler angezeigt um den Parameter auszuwählen. Dabei werden als Zusatzparameter Minimum, Schrittweite und Maximum angegeben.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;colorpicker&#039;&#039;&#039; || &amp;lt;code&amp;gt;rgb:colorpicker,RGB&amp;lt;/code&amp;gt;|| Es wird ein Colorpicker angezeigt, der dem Anwender die Auswahl einer Farbe ermöglicht. Die genaue Parametersyntax kann man dem Artikel zum  [[Color#Colorpicker|Colorpicker]] entnehmen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;multiple&#039;&#039;&#039; || &amp;lt;code&amp;gt;group:multiple,Telefon,Multimedia,Licht,Heizung&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte durch klicken auswählen kann. Optional kann man in einem Freitext eigene Werte ergänzen. dieser Dialog wird bspw. bei der Raum-Auswahl (Attribut &amp;quot;room&amp;quot;) oder der Gruppen-Auswahl (Attribut &amp;quot;group&amp;quot;) in FHEMWEB genutzt. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sortable&#039;&#039;&#039; || &amp;lt;code&amp;gt;command:sortable,monday,tuesday,...&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte auswählen und sortieren kann. Man kann dabei Werte durch Klicken auswählen und durch Drag&#039;n&#039;Drop sortieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt noch weitere solcher Widgets. Eine genaue Auflistung dazu findet sich in der {{Link2CmdRef|Anker=widgetOverride}} unter widgetOverride zu FHEMWEB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Damit in einer Eingabe bereits der aktuelle Wert vorbelegt bzw. in einer Auswahlliste der aktuelle Wert vorselektiert ist, muss es im Modul bzw. Gerät ein Reading mit dem gleichen Namen wie die Set-Option geben. Der Wert des gleichnamigen Readings wird dann als Vorbelegung / Vorselektion verwendet. &lt;br /&gt;
* Der User kann sich in der Raumübersicht nach wie vor via [[WebCmd|webCmd]] eine entsprechende Steuerung anlegen.&lt;br /&gt;
&lt;br /&gt;
==== X_Attr ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Attr($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $cmd, $name, $attrName, $attrValue  ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion dient der Prüfung von Attributen, welche über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl gesetzt werden können. Sobald versucht wird, ein Attribut für ein Gerät zu setzen, wird vorher die Attr-Funktion des entsprechenden Moduls aufgerufen um zu prüfen, ob das Attribut aus Sicht des Moduls korrekt ist.&lt;br /&gt;
Liegt ein Problem mit dem Attribut bzw. dem Wert vor, so muss die Funktion eine aussagekräftige Fehlermeldung zurückgeben, welche dem User angezeigt wird.&lt;br /&gt;
Sofern das übergebene Attribut samt Inhalt korrekt ist, gibt die Attr-Funktion den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurück. Erst dann wird das Attribut in der globalen Datenstruktur &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; gespeichert und ist somit erst aktiv.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Attr($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $cmd, $name, $aName, $aValue ) = @_;&lt;br /&gt;
    &lt;br /&gt;
  	# $cmd  - Vorgangsart - kann die Werte &amp;quot;del&amp;quot; (löschen) oder &amp;quot;set&amp;quot; (setzen) annehmen&lt;br /&gt;
	# $name - Gerätename&lt;br /&gt;
	# $aName/$aValue sind Attribut-Name und Attribut-Wert&lt;br /&gt;
    &lt;br /&gt;
	if ($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
		if ($aName eq &amp;quot;Regex&amp;quot;) {&lt;br /&gt;
			eval { qr/$aValue/ };&lt;br /&gt;
			if ($@) {&lt;br /&gt;
				Log3 $name, 3, &amp;quot;X ($name) - Invalid regex in attr $name $aName $aValue: $@&amp;quot;;&lt;br /&gt;
				return &amp;quot;Invalid Regex $aValue: $@&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist es möglich auch übergebene Attributwerte zu verändern bzw. zu korrigieren, indem man im Parameterarray &amp;lt;code&amp;gt;@_&amp;lt;/code&amp;gt; den ursprünglichen Wert anpasst. Dies erfolgt im Beispiel über die Modifikation des Wertes mit Index 3 (entspricht dem 4. Element) im Parameterarray, also &amp;lt;code&amp;gt;$_[3]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Da das Attribut zum Zeitpunkt des Aufrufs der Attr-Funktion noch nicht gespeichert ist, wird der neue Wert zu diesem Zeitpunkt noch nicht via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] zurückgegeben. Erst, wenn die Attr-Funktion mit &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; beendet ist, wird der neue Wert in FHEM gespeichert und steht dann via AttrVal() zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie normalerweise keine Werte dort speichern muss, sondern lediglich das Attribut auf Korrektheit prüfen muss.&lt;br /&gt;
Im obigen Beispiel wird für ein Attribut mit Namen &amp;quot;Regex&amp;quot; geprüft ob der reguläre Ausdruck fehlerhaft ist. Sofern dieser OK ist, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben und fhem.pl speichert den Wert des Attributs in &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Attributnamen mit Platzhaltern&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man Attribute in der [[#X_Initialize|Initialize]]-Funktion mit Platzhaltern definiert (Wildcard-Attribute) wie z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
      &amp;quot;reading[0-9]*Name &amp;quot; .&lt;br /&gt;
    # usw.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken in der Web-Oberfläche, da FHEMWEB nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muss solche Attribute manuell über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl eingeben.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch in der Attr-Funktion neu gesetzte Ausprägungen von Wildcard-Attributen an die gerätespezifische userattr-Variable anfügen. Dann können bereits gesetzte Attribute in FHEMWEB durch Klicken ausgewählt und geändert werden.&lt;br /&gt;
Dazu reicht ein Aufruf der Funktion [[DevelopmentModuleAPI#addToDevAttrList|addToDevAttrList()]]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
    addToDevAttrList($name, $aName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== X_Read ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Read ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die X_Read-Funktion wird aufgerufen, wenn ein dem Gerät zugeordneter Filedeskriptor (serielle Schnittstelle, TCP-Verbindung, ...) Daten zum Lesen bereitgestellt hat. Die Daten müssen nun eingelesen und interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Serial-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion [[DevIo#DevIo_SimpleRead()|DevIo_SimpleRead()]] gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann.&lt;br /&gt;
Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten in einem eigenen Puffer (idealerweise in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) zwischenspeichern (siehe auch [[DevIo#Hinweis bei der Datenverarbeitung (Buffering)|DevIo]]). Im Beispiel ist dies &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{BUFFER}&amp;lt;/code&amp;gt; an den die aktuell gelesenen Daten angehängt werden, bis die folgende Prüfung ein für das jeweilige Protokoll vollständige Frame erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Read($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	&lt;br /&gt;
	# einlesen der bereitstehenden Daten&lt;br /&gt;
	my $buf = DevIo_SimpleRead($hash);		&lt;br /&gt;
	return &amp;quot;&amp;quot; if ( !defined($buf) );&lt;br /&gt;
	Log3 $name, 5, &amp;quot;X ($name) - received data: &amp;quot;.$buf;    &lt;br /&gt;
&lt;br /&gt;
	# Daten in Hex konvertieren und an den Puffer anhängen&lt;br /&gt;
	$hash-&amp;gt;{helper}{BUFFER} .= unpack (&#039;H*&#039;, $buf);	&lt;br /&gt;
	Log3 $name, 5, &amp;quot;X ($name) - current buffer content: &amp;quot;.$hash-&amp;gt;{helper}{BUFFER};&lt;br /&gt;
&lt;br /&gt;
	# prüfen, ob im Buffer ein vollständiger Frame zur Verarbeitung vorhanden ist.&lt;br /&gt;
	if ($hash-&amp;gt;{helper}{BUFFER} =~ &amp;quot;ff1002(.{4})(.*)1003(.{4})ff(.*)&amp;quot;) {&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zu lesenden Nutzdaten können dann je nach Protokoll des Geräts beispielsweise an einer festgelegten Stelle im Frame (dann in &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{BUFFER}&amp;lt;/code&amp;gt;) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und via [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] in Readings gespeichert werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert der Read-Funktion wird nicht geprüft und hat daher keinerlei Bedeutung.&lt;br /&gt;
&lt;br /&gt;
==== X_Ready ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Ready ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
    &lt;br /&gt;
	return $success;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird im Main-Loop aufgerufen falls das Modul in der globalen Liste &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; existiert. Diese Funktion hat, je nachdem auf welchem OS FHEM ausgeführt wird, unterschiedliche Aufgaben:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;UNIX-artiges Betriebssystem:&#039;&#039;&#039; prüfen, ob eine Verbindung nach einem Verbindungsabbruch wieder aufgebaut werden kann. Sobald der Verbindungsaufbau erfolgreich war, muss die Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. &amp;quot;1&amp;quot;) und den eigenen Eintrag entsprechend aus &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; löschen.&lt;br /&gt;
* &#039;&#039;&#039;Windows-Betriebssystem:&#039;&#039;&#039; prüfen, ob lesbare Daten für ein serielles Device (via COM1, COM2, ...) vorliegen. Sofern lesbare Daten vorliegen, muss Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. &amp;quot;1&amp;quot;). Zusätzlich dazu muss die Funktion, wie bei UNIX-artigen Betriebssystem, ebenfalls bei einem Verbindungsabbruch einen neuen Verbindungsversuch initiieren. Der Eintrag in &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; bleibt solange erhalten, bis die Verbindung seitens FHEM beendet wird.&lt;br /&gt;
&lt;br /&gt;
Der Windows-spezifische Teil zur Datenprüfung ist dabei nur zu implementieren, wenn das Modul über eine serielle Verbindung kommuniziert.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung des Moduls [[DevIo]] wird dem Modulentwickler der Umgang mit &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; abgenommen, da DevIo sich selbst um die entsprechenden Einträge kümmert und diese selbstständig wieder entfernt.&lt;br /&gt;
&lt;br /&gt;
In der Regel sieht eine Ready-Funktion immer gleich aus.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Ready($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
      &lt;br /&gt;
	# Versuch eines Verbindungsaufbaus, sofern die Verbindung beendet ist.&lt;br /&gt;
	return DevIo_OpenDev($hash, 1, undef ) if ( $hash-&amp;gt;{STATE} eq &amp;quot;disconnected&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	# This is relevant for Windows/USB only&lt;br /&gt;
	if(defined($hash-&amp;gt;{USBDev})) {&lt;br /&gt;
		my $po = $hash-&amp;gt;{USBDev};&lt;br /&gt;
		my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po-&amp;gt;status;&lt;br /&gt;
		return ( $InBytes &amp;gt; 0 );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Notify ====&lt;br /&gt;
&lt;br /&gt;
Die X_Notify-Funktion wird aus der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] in fhem.pl heraus aufgerufen sobald ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind dabei das [[FileLog]]-Modul oder das [[notify]]-Modul.&lt;br /&gt;
&lt;br /&gt;
Die Notify-Funktion bekommt dafür zwei Hash-Referenzen übergeben: den Hash des eigenen Geräts und den Hash des Geräts, das die Events erzeugt hat. &lt;br /&gt;
Über den Hash des eigenen Geräts kann die Notify-Funktion beispielsweise auf die Internals oder Attribute des eigenen Geräts zugreifen.&lt;br /&gt;
Über den Hash des Gerätes und der [[DevelopmentModuleAPI#deviceEvents|deviceEvents()]]-Funktion kann man auf die generierten Events zugreifen. Über den zweiten Parameter dieser Routine lässt sich bestimmen ob für das Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; ein &#039;normales&#039; Event (d.h. in der form &amp;lt;code&amp;gt;state: &amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;) erzeugen soll (Wert: 1) oder ob z.b. aus Gründen der Rückwärtskompatibilität ein Event ohne &amp;lt;code&amp;gt;state: &amp;lt;/code&amp;gt; erzeugt werden soll. Falls dem Anwender die Wahl des verwendeten Formats überlassen werden soll ist hierzu das {{Link2CmdRef|Anker=addStateEvent|Lang=de|Label=addStateEvent-Attribut}} vorzusehen.&lt;br /&gt;
&lt;br /&gt;
Der direkte Zugriff auf &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; ist nicht mehr zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
  my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
&lt;br /&gt;
  return &amp;quot;&amp;quot; if(IsDisabled($ownName)); # Return without any further action if the module is disabled&lt;br /&gt;
&lt;br /&gt;
  my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
&lt;br /&gt;
  my $events = deviceEvents($dev_hash,1);&lt;br /&gt;
  return if( !$events );&lt;br /&gt;
&lt;br /&gt;
  foreach my $event (@{$events}) {&lt;br /&gt;
    $event = &amp;quot;&amp;quot; if(!defined($event));&lt;br /&gt;
&lt;br /&gt;
    # Examples:&lt;br /&gt;
    # $event = &amp;quot;readingname: value&amp;quot; &lt;br /&gt;
    # or&lt;br /&gt;
    # $event = &amp;quot;INITIALIZED&amp;quot; (for $devName equal &amp;quot;global&amp;quot;)&lt;br /&gt;
    #&lt;br /&gt;
    # processing $event with further code&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Begrenzung der Aufrufe auf bestimmte Geräte&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Notify-Funktion für jedes definierte Gerät mit all seinen Events aufgerufen wird, muss sie in einer Schleife jedesmal prüfen und entscheiden, ob es mit dem jeweiligen Event etwas anfangen kann. Ein Gerät, das die Notify-Funktion implementiert, sieht dafür typischerweise einen regulären Ausdruck vor, welcher für die Filterung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Wenn man nur gezielt von bestimmten Definitionen Events erhalten will, kann man diese auch in Form einer {{Link2CmdRef|Lang=de|Anker=devspec|Label=devspec}} in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; angeben. Bspw. kann man in der Define-Funktion diesen Wert setzen. Dadurch wird die Notify-Funktion nur aufgerufen wenn eine der Definitionen, auf welche die devspec passt, ein Event erzeugt hat. Ein typischer Fall ist die Begrenzung von Events auf &amp;quot;global&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
in der Define-Funktion:&lt;br /&gt;
&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,Definition_.*&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,Definition_A,Definition_B&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,TYPE=CUL_HM&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies schont insbesondere bei grossen Installationen Ressourcen, da die Notify-Funktion nicht sämtliche Events, sondern nur noch Events der gewünschten Definitionen erhält. Dadurch erfolgen deutlich weniger Aufrufe der Notify-Funktion, was Systemressourcen schont. Statt den Filter &#039;&#039;NOTIFYDEV&#039;&#039; direkt zu setzen, kann auch [[DevelopmentModuleAPI#setNotifyDev|setNotifyDev()]] aufgerufen werden. Letzteres ist v.a. dann zu empfehlen, wenn Änderungen zur Laufzeit erfolgen sollen.&lt;br /&gt;
&lt;br /&gt;
Sofern in der [[#X_Define|Define-Funktion]] eine Regexp als Argument übergeben wird, die ähnlich wie beim Modul [[notify]] auf Events wie &amp;lt;code&amp;gt;&amp;amp;lt;Definitionsname&amp;amp;gt;&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;&amp;amp;lt;Definitionsname&amp;amp;gt;:&amp;amp;lt;Event&amp;amp;gt;&amp;lt;/code&amp;gt; reagiert, so sollte man in der Define-Funktion die Funktion [[DevelopmentModuleAPI#notifyRegexpChanged|notifyRegexpChanged()]] verwenden. Diese versucht einen passenden Eintrag für &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; basierend auf der übergebenen Regexp zu setzen, sofern dies möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Reihenfolge für den Aufruf der Notify-Funktion beeinflussen&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald ein Event ausgelöst wurde, stellt sich FHEM eine Liste aller relevanten Geräte-Hashes zusammen, welche via Notify-Funktion prüfen müssen, ob das Event relevant ist. Dabei wird die Liste nach &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; sortiert. Diese enthält ein Order-Präfix in Form einer Ganzzahl, sowie den Namen der Definition (Bsp: &amp;lt;code&amp;gt;&#039;&#039;&#039;50&#039;&#039;&#039;-Lampe_Wohnzimmer&amp;lt;/code&amp;gt;). Dadurch kann man jedoch nicht sicherstellen, dass Events von bestimmten Modulen zuerst verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn das eigene Modul bei der Eventverarbeitung gegenüber den anderen Modulen eine bestimmte Reihenfolge einhalten muss, kann man in der [[#X_Initialize|Initialize]]-Funktion durch Setzen von &amp;lt;code&amp;gt;$hash-&amp;gt;{NotifyOrderPrefix}&amp;lt;/code&amp;gt; diese Reihenfolge beeinflussen. Standardmäßig werden Module immer mit einem Order-Präfix von &amp;quot;50-&amp;quot; in FHEM registriert. Durch die Veränderung dieses Präfixes kann man das eigene Modul in der Reihenfolge gegenüber anderen Modulen bei der Eventverarbeitung beeinflussen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	$hash-&amp;gt;{NotifyOrderPrefix} = &amp;quot;45-&amp;quot;  # Alle Definitionen des Moduls X werden bei der Eventverarbeitung zuerst geprüft&lt;br /&gt;
	&lt;br /&gt;
	# oder...&lt;br /&gt;
	&lt;br /&gt;
	$hash-&amp;gt;{NotifyOrderPrefix} = &amp;quot;55-&amp;quot;  # Alle Definitionen des Moduls X werden bei der Eventverarbeitung als letztes geprüft&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Da dieses Präfix bei eventverarbeitenden Definitionen in &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; dem Definitionsnamen vorangestellt wird bewirkt es bei einer normalen aufsteigenden Sortierung nach &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; eine veränderte Reihenfolge. Alle Module die in der Initialize-Funktion nicht &amp;lt;code&amp;gt;$hash-&amp;gt;{NotifyOrderPrefix}&amp;lt;/code&amp;gt; explizit setzen, werden mit &amp;quot;50-&amp;quot; als Standardwert vorbelegt.&lt;br /&gt;
&lt;br /&gt;
==== X_Rename ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Rename($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $new_name, $old_name) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Rename-Funktion wird ausgeführt, nachdem ein Gerät umbenannt wurde. Auf diese Weise kann ein Modul auf eine Namensänderung reagieren, wenn das Gerät &amp;lt;code&amp;gt;$old_name&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;$new_name&amp;lt;/code&amp;gt; umbenannt wurde. Ein typischer Fall ist das Umsetzen der Namensänderungen bei Daten die mittels [[DevelopmentModuleAPI#setKeyValue|setKeyValue()]] gespeichert wurden. Hierbei müssen die Daten, welche unter dem alten Namen gespeichert sind, auf den neuen Namen geändert werden.&lt;br /&gt;
&lt;br /&gt;
Der Rename-Funktion wird lediglich der alte, sowie der neue Gerätename übergeben. Der Rückgabewert wird nicht ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Rename($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $new_name, $old_name ) = @_;&lt;br /&gt;
&lt;br /&gt;
	my $old_index = &amp;quot;Module_X_&amp;quot;.$old_name.&amp;quot;_data&amp;quot;;&lt;br /&gt;
	my $new_index = &amp;quot;Module_X_&amp;quot;.$new_name.&amp;quot;_data&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	my ($err, $old_pwd) = getKeyValue($old_index);&lt;br /&gt;
	return undef unless(defined($old_pwd));&lt;br /&gt;
&lt;br /&gt;
	setKeyValue($new_index, $old_pwd);&lt;br /&gt;
	setKeyValue($old_index, undef);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_DelayedShutdown ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DelayedShutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $delay_needed;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit der X_DelayedShutdown Funktion kann eine Definition das Stoppen von FHEM verzögern um asynchron hinter sich aufzuräumen. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.), welcher mehrfache Requests/Responses benötigt. Als Übergabeparameter wird der Geräte-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; bereitgestellt. Je nach Rückgabewert &amp;lt;code&amp;gt;$delay_needed&amp;lt;/code&amp;gt; wird der Stopp von FHEM verzögert. Ist ein verzögerter Stopp von FHEM notwendig, darf der Rückgabewert in diesem Fall nicht &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; sein.&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zur [[#X_Shutdown|Shutdown]]-Funktion steht vor einem bevorstehenden Stopp von FHEM für einen User-konfigurierbaren Zeitraum (global-Attribut: &amp;lt;code&amp;gt;maxShutdownDelay&amp;lt;/code&amp;gt; / Standard: 10 Sekunden) weiterhin die asynchrone FHEM Infrastruktur ([[DevIo]]/[[#X_Read|Read]]-Funktion und [[DevelopmentModuleAPI#InternalTimer|InternalTimer]]) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Sobald alle nötigen Maßnahmen erledigt sind, muss der Abschluss mit [[DevelopmentModuleAPI#CancelDelayedShutdown|CancelDelayedShutdown(&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;)]] an FHEM zurückgemeldet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DelayedShutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	# Aufräumen starten&lt;br /&gt;
	&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Shutdown ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Shutdown ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit der X_Shutdown Funktion kann ein Modul Aktionen durchführen bevor FHEM gestoppt wird. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.). Nach der Ausführung der Shutdown-Fuktion wird FHEM sofort beendet. Falls vor dem Herunterfahren von FHEM asynchrone Kommunikation (via [[DevIo]]/[[#X_Read|X_Read]]) notwendig ist um eine vorhandene Verbindung sauber zu beenden, sollte man [[#X_DelayedShutdownFn|X_DelayedShutdownFn]] verwenden.&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter wird der Geräte-Hash bereitgestellt. Der Rückgabewert einer Shutdown-Funktion wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Shutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	# Verbindung schließen&lt;br /&gt;
	DevIo_CloseDev($hash);&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funktionen für zweistufiges Modulkonzept ===&lt;br /&gt;
&lt;br /&gt;
Für das [[#Zweistufiges_Modell_für_Module|zweistufige Modulkonzept]] gibt es weiterhin:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Parse|X_Parse]] || Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] vom physischen Modul zum logischen Modul zwecks der Verarbeitung.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Write|X_Write]]|| Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|IOWrite()]] vom logischen zum physischen Modul um diese an die Hardware weiterzureichen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Fingerprint|X_Fingerprint]] || Rückgabe eines &amp;quot;Fingerabdrucks&amp;quot; einer Nachricht. Dient der Erkennung von Duplikaten im Rahmen von [[DevelopmentModuleAPI#Dispatch|Dispatch()]]. Kann im physischen, als auch logischen Modul benutzt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für das zweistufige Modulkonzept muss in einem logischen Modul eine [[#X_Parse|Parse]]-Funktion im Modul-Hash registriert werden. In einem physikalischen Modul muss eine [[#X_Write|Write]]-Funktion registriert sein. Diese dienen dem Datenaustausch in beide Richtungen und werden von dem jeweils anderen Modul indirekt aufgerufen.&lt;br /&gt;
&lt;br /&gt;
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{ParseFn}       = &amp;quot;X_Parse&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{WriteFn}       = &amp;quot;X_Write&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{FingerprintFn} = &amp;quot;X_Fingerprint&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Parse ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen &amp;quot;X&amp;quot; ein &#039;&#039;&#039;logisches Modul&#039;&#039;&#039; im Sinne des zweistufigen Modulkonzepts ist, also Daten mit einem übergeordneten, physikalischen Modul austauscht.}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Parse ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_hash, $message) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $found;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_Parse wird aufgerufen, sobald von dem IO-Gerät &amp;lt;code&amp;gt;$io_hash&amp;lt;/code&amp;gt; eine Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] zur Verarbeitung angefragt wird. Die Parse-Funktion muss dann prüfen, zu welcher Gerätedefinition diese Nachricht gehört und diese entsprechend verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise enthält eine Nachricht immer eine Komponente durch welche sich die Nachricht einem Gerät zuordnen lässt (z.B. Adresse, ID-Nummer, ...). Eine solche Identifikation sollte man im Rahmen der [[#X_Define|Define]]-Funktion im logischen Modul an geeigneter Stelle speichern, um in der Parse-Funktion eine einfache Zuordnung von Adresse/ID einer Nachricht zur entsprechenden Gerätedefinition zu haben. Dazu wird in der Regel im Modul-Hash im modulspezifischen Bereich eine Liste &amp;lt;code&amp;gt;defptr&amp;lt;/code&amp;gt; (Definition Pointer) geführt, welche jede eindeutige Adresse/ID dem entsprechenden Geräte-Hash zuordnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Define ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def) = @_;&lt;br /&gt;
	my @a = split(&amp;quot;[ \t][ \t]*&amp;quot;, $def);&lt;br /&gt;
	my $name = $a[0];&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# erstes Argument ist die eindeutige Geräteadresse&lt;br /&gt;
	my $address = $a[1];&lt;br /&gt;
&lt;br /&gt;
	# Adresse rückwärts dem Hash zuordnen (für ParseFn)&lt;br /&gt;
	$modules{X}{defptr}{$address} = $hash;&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Basis dieses Definition Pointers kann die Parse-Funktion nun sehr einfach prüfen, ob für die empfangene Nachricht bereits eine entsprechende Gerätedefinition existiert. Sofern diese existiert, kann die Nachricht entsprechend verarbeitet werden. Sollte jedoch keine passende Gerätedefinition zu der empfangenen Nachricht existieren, so muss die Parse-Funktion den Gerätenamen &amp;quot;UNDEFINED&amp;quot; zusammen mit den Argumenten für einen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl zurückgeben, welcher ein passendes Gerät in FHEM anlegen würde (durch [[autocreate]]).&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Parse ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_hash, $message) = @_;&lt;br /&gt;
	&lt;br /&gt;
	# Die Stellen 10-15 enthalten die eindeutige Identifikation des Geräts&lt;br /&gt;
	my $address = substr($message, 10, 5); &lt;br /&gt;
&lt;br /&gt;
	# wenn bereits eine Gerätedefinition existiert (via Definition Pointer aus Define-Funktion)&lt;br /&gt;
	if(my $hash = $modules{X}{defptr}{$address}) &lt;br /&gt;
	{&lt;br /&gt;
		...  # Nachricht für $hash verarbeiten&lt;br /&gt;
		&lt;br /&gt;
		# Rückgabe des Gerätenamens, für welches die Nachricht bestimmt ist.&lt;br /&gt;
		return $hash-&amp;gt;{NAME}; &lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		# Keine Gerätedefinition verfügbar&lt;br /&gt;
		# Daher Vorschlag define-Befehl: &amp;lt;NAME&amp;gt; &amp;lt;MODULNAME&amp;gt; &amp;lt;ADDRESSE&amp;gt;&lt;br /&gt;
		return &amp;quot;UNDEFINED X_&amp;quot;.$address.&amp;quot; X $address&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Write ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen &amp;quot;X&amp;quot; ein &#039;&#039;&#039;physisches Modul&#039;&#039;&#039; im Sinne des zweistufigen Modulkonzepts ist, also Daten mit untergeordneten logischen Modulen austauscht. }}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Write ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @arguments) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Write-Funktion wird durch die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] aufgerufen, sobald eine logische Gerätedefinition Daten per IO-Gerät an die Hardware übertragen möchte. Dazu kümmert sich die Write-Funktion um die Übertragung der Nachricht in geeigneter Form an die verbundene Hardware. Als Argumente wird der Hash des physischen Gerätes übertragen, sowie alle weiteren Argumente, die das logische Modul beim Aufruf von IOWrite() mitgegeben hat. Im Normalfall ist das ein Skalar mit der zu sendenden Nachricht in Textform. Es kann aber auch sein, dass weitere Daten zum Versand notwendig sind (evtl. Schlüssel, Session-Key, ...). Daher ist die Parametersyntax einer zu schreibenden Nachricht via IOWrite-/Write-Funktion zwischen logischem und physikalischem Modul abzustimmen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Write ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $message, $address) = @_;&lt;br /&gt;
	&lt;br /&gt;
	DevIo_SimpleWrite($hash, $address.$message, 2);&lt;br /&gt;
&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Fingerprint ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Fingerprint($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_name, $msg ) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return ( $io_name, $fingerprint );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fingerprint-Funktion dient der Erkennung von Duplikaten empfangener Nachrichten. Diese Funktion kann dabei sowohl im physischen, als auch im logischen Modul implementiert sein - je nachdem auf welcher Ebene man für eine Nachricht einen Fingerprint bilden kann. &lt;br /&gt;
&lt;br /&gt;
Als Parameter wird der Name des IO-Geräts &amp;lt;code&amp;gt;$io_name&amp;lt;/code&amp;gt; übergeben, sowie die Nachricht &amp;lt;code&amp;gt;$msg&amp;lt;/code&amp;gt;, welche empfangen wurde. Nun muss aus dieser Nachricht ein eindeutiger Fingerprint gebildet werden. Dies bedeutet, dass alle variablen Inhalte, die aufgrund des Empfangs dieser Nachricht über unterschiedliche IO-Geräte enthalten sein können, entfernt werden müssen. Dies können bspw. Empfangsadressen von IO-Geräten sein oder Session-ID&#039;s die in der Nachricht enthalten sind. Alle Fingerprints sämtlicher Nachrichten, die innerhalb der letzten 500 Millisekunden (konfigurierbar via &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; Attribut &amp;lt;code&amp;gt;dupTimeout&amp;lt;/code&amp;gt;) empfangen wurden, werden gegen diesen generierten Fingerprint getestet. Sollte innerhalb dieser Zeit bereits eine Nachricht mit diesem Fingerprint verarbeitet worden sein, so wird sie als Duplikat erkannt und nicht weiter verarbeitet. In diesem Fall gibt [[DevelopmentModuleAPI#Dispatch|Dispatch()]] den Namen der Gerätedefinition zurück, welche eine Nachricht mit dem selben Fingerprint bereits verarbeitet hat. Es erfolgt dann kein Aufruf der [[#X_Parse|Parse]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Fingerprint($$)&lt;br /&gt;
{&lt;br /&gt;
  my ( $io_name, $msg ) = @_;&lt;br /&gt;
&lt;br /&gt;
  substr( $msg, 2, 2, &amp;quot;--&amp;quot; ); # entferne Empfangsadresse&lt;br /&gt;
  substr( $msg, 4, 1, &amp;quot;-&amp;quot; );  # entferne Hop-Count&lt;br /&gt;
&lt;br /&gt;
  return ( $io_name, $msg );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird zuerst, sofern implementiert, die Fingerprint-Funktion des physischen Moduls aufgerufen. Sollte sich hierdurch kein Duplikat erkennen lassen, wird die Fingerprint-Funktion jedes möglichen geladenen logischen Moduls aufgerufen, sofern implementiert. &lt;br /&gt;
&lt;br /&gt;
Sollte sowohl im physischen, als auch im logischen Modul keine Fingerprint-Funktion implementiert sein, so wird keinerlei Duplikatserkennung durchgeführt.&lt;br /&gt;
&lt;br /&gt;
=== FHEMWEB-spezifische Funktionen ===&lt;br /&gt;
&lt;br /&gt;
FHEMWEB bietet Modul-Autoren die Möglichkeit an durch spezielle Funktionsaufrufe in Modulen, eigene HTML-Inhalte zu verwenden. Dadurch können in Verbindung mit zusätzlichem JavaScript komplexe Dialoge/Inhalte/Steuermöglichkeiten dargestellt werden. &lt;br /&gt;
&lt;br /&gt;
Eine genaue Auflistung aller FHEMWEB-spezifischen Funktionsaufrufe gibt es in dem separaten Artikel [[DevelopmentFHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
=== sonstige Funktionen ===&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden weitere Funktionen behandelt die zum Teil aus FHEM, aber auch aus anderen Modulen aufgerufen werden. Sie sind dabei nur in speziellen Anwendungsfällen relevant. Hier eine Auflistung aller sonstigen Modulfunktionen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Funktionsname !! class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_DbLog_split|X_DbLog_split]] || Wird durch das Modul 93_DbLog.pm aufgerufen. Dient dem korrekten Split eines moduleigenen Events in Name/Wert/Einheit für die Nutzung einer Datenbank.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Except|X_Except]]|| Wird aufgerufen, sobald ein ein geöffneter Filedescriptor in [[#Wichtige_globale_Variablen_aus_fhem.pl|&amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;]], der unter &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt; im Geräte-Hash gesetzt ist, einen Interrupt bzw. Exception auslöst.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Copy|X_Copy]]|| Wird durch das Modul 98_copy.pm aufgerufen im Rahmen des &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt;-Befehls sobald ein Gerät kopiert wurde.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_State|X_State]]|| Wird aufgerufen im Rahmen des &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt;-Befehls bevor der Status einer Gerätedefinition bzw. eines zugehörigen Readings gesetzt wird.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_AsyncOutput|X_AsyncOutput]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht die asynchrone Ausgabe von Daten via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an einen einzelnen verbundenen Client.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_ActivateInform|X_ActivateInform]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht das Aktivieren des inform-Mechanismus zum Senden von Events für einen einzelnen verbundenen Client.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Authorize|X_Authorize]]|| Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authorized|Authorized()]] um eine gewünschte Vorgangs-Art zu autorisieren.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Authenticate|X_Authenticate]]||  Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authenticate|Authenticate()]] um eine Authentifizierung zu prüfen und ggf. zu genehmigen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DbLog_splitFn} = &amp;quot;X_DbLog_split&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ExceptFn} = &amp;quot;X_Except&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{CopyFn} = &amp;quot;X_Copy&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AsyncOutputFn} = &amp;quot;X_AsyncOutput&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ActivateInformFn} = &amp;quot;X_ActivateInform&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{StateFn} = &amp;quot;X_State&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AuthorizeFn} = &amp;quot;X_Authorize&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AuthenticateFn} = &amp;quot;X_Authenticate&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
==== X_DbLog_split ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DbLog_split ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $event, $device_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
    &lt;br /&gt;
	return  ( $reading, $value, $unit );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die DbLog_split-Funktion wird durch das Modul [[DbLog]] aufgerufen, sofern der Nutzer DbLog benutzt. Sofern diese Funktion implementiert ist, kann der Modul-Autor das Auftrennen von Events in den Reading-Namen, -Wert und der Einheit selbst steuern. Andernfalls nimmt DbLog diese Auftrennung selber mittels Trennung durch Leerzeichen sowie vordefinierten Regeln zu verschiedenen Modulen vor. Je nachdem, welche Readings man in seinem Modul implementiert, passt diese standardmäßige Trennung jedoch nicht immer.&lt;br /&gt;
&lt;br /&gt;
Der Funktion werden folgende Eingangsparameter übergeben:&lt;br /&gt;
# Das generierte Event (Bsp: &amp;lt;code&amp;gt;temperature: 20.5 °C&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Der Name des Geräts, welche das Event erzeugt hat (Bsp: &amp;lt;code&amp;gt;Temperatursensor_Wohnzimmer&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es ist nicht möglich in der DbLog_split-Funktion auf die verarbeitende DbLog-Definition zu referenzieren.&lt;br /&gt;
&lt;br /&gt;
Als Rückgabewerte muss die Funktion folgende Werte bereitstellen:&lt;br /&gt;
# Name des Readings (Bsp: &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Wert des Readings (Bsp: &amp;lt;code&amp;gt;20.5&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Einheit des Readings (Bsp: &amp;lt;code&amp;gt;°C&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DbLog_splitFn($$)&lt;br /&gt;
{&lt;br /&gt;
	my ($event, $device) = @_;&lt;br /&gt;
	my ($reading, $value, $unit);&lt;br /&gt;
        my $devhash = $defs{$device}&lt;br /&gt;
&lt;br /&gt;
	if($event =~ m/temperature/) {&lt;br /&gt;
	   $reading = &#039;temperature&#039;;&lt;br /&gt;
	   $value = substr($event,12,4);&lt;br /&gt;
	   $unit = &#039;°C&#039;;&lt;br /&gt;
	}   &lt;br /&gt;
        &lt;br /&gt;
        return ($reading, $value, $unit);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Except ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Except ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_Except-Funktion wird durch fhem.pl aufgerufen, wenn die Gerätedefinition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; aufgeführt ist und der Filedeskriptor in &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt; eine Exception bzw. Interrupt auslöst. &lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use IO::File;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
sub X_Except ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	# Filehandle aus Filedescriptor erstellen&lt;br /&gt;
	my $filehandle = IO::File-&amp;gt;new_from_fd($hash-&amp;gt;{EXCEPT_FD}, &#039;r&#039;);&lt;br /&gt;
	seek($filehandle,0,0);	&lt;br /&gt;
&lt;br /&gt;
	# aktuellen Inhalt auslesen&lt;br /&gt;
	my $current_value = $filehandle-&amp;gt;getline;&lt;br /&gt;
&lt;br /&gt;
	if($current_value eq &amp;quot;1&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		...&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		...&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Copy ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Copy ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $old_name, $new_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_Copy-Funktion wird durch das Modul [[copy]] aufgerufen nachdem ein Nutzer eine Gerätedefinition über den Befehl &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; kopiert hat. Dazu werden als Funktionsparameter die Definitionsnamen der alten und neuen Gerätedefinition übergeben. Es dient dazu zusätzliche Daten aus der zu kopierenden Gerätedefinition in die neue Definition zu übernehmen. Der Befehl &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; überträgt lediglich &amp;lt;code&amp;gt;$hash-&amp;gt;{DEF}&amp;lt;/code&amp;gt; in die neue Definition sowie sämtliche gesetzte Attribute. Weitere Daten müssen dann durch die X_Copy-Funktion übertragen werden. &lt;br /&gt;
&lt;br /&gt;
Die X_Copy-Funktion wird erst nach dem erfolgtem Kopiervorgang aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Copy ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $old_name, $new_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	my $old_hash = $defs{$old_name};&lt;br /&gt;
	my $new_hash = $defs{$new_name};&lt;br /&gt;
&lt;br /&gt;
	# copy also temporary session key&lt;br /&gt;
	$new_hash-&amp;gt;{helper}{SESSION_KEY} = $old_hash-&amp;gt;{helper}{SESSION_KEY};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_AsyncOutput ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_AsyncOutput ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $client_hash, $text ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_AsyncOutput wird durch [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] von anderen Modulen aufgerufen. Es erlaubt diesen anderen Modulen die Ausgabe von asynchronen Befehlsergebnissen &amp;lt;code&amp;gt;$text&amp;lt;/code&amp;gt; zuvor ausgeführter set-/get-Befehle an den entsprechenden Client (identifiziert durch den Client-Hash &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; der temporären Definition) zurückzugeben. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Client einen set-/get-Befehl ausführt, wird der Client-Hash bei der Ausführung dieser Befehle an die jeweiligen Module übermittelt. Sobald ein Befehl ausgeführt wird, der seine Ausgabe asynchron ausführen möchte und die Client-Verbindung des Server-Moduls dies unterstützt (&amp;lt;code&amp;gt;$client_hash-&amp;gt;{canAsyncOutput}&amp;lt;/code&amp;gt; ist gesetzt), merkt sich das befehlsausführende Modul den Client-Hash und gibt das Ergebnis des Befehls zu späterer Zeit via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an den ursprünglichen Client zurück. Die Funktion X_AsyncOutput des Server-Moduls kümmert sich darum das Ergebnis dem entsprechenden Client in der notwendigen Form zuzustellen.&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert von X_AsyncOutput() wird als Rückgabewert für asyncOutput() verwendet. Man kann hier im Fehlerfall eine Fehlermeldung angeben und im Erfolgsfall &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;. Der Rückgabewert wird aber aktuell nicht ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==== X_ActivateInform====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_ActivateInform($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $client_hash, $arg ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_ActivateInform wird aktuell nur durch den [[update]]-Befehl aufgerufen, sofern ein Client eines Frontend-Moduls diesen Befehl aufgerufen hat um den Inform-Mechanismus (Senden von Events) zu aktivieren. Dadurch wird im Falle von [[update]] die umgehende Anzeige der Logmeldungen für den ausführenden Client aktiviert. In [[FHEMWEB]] geschieht das über den Event-Monitor, bei telnet mit der direkten Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Da diese Funktion aktuell nur speziell für den update-Befehl implementiert ist, kann man aktuell keine genaue Angaben zu den möglichen Werten von &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; geben. Dieser Parameter dient dazu genauer zu spezifizieren was exakt an Events an den entsprechenden Client &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; zu senden ist. Aktuell wird dazu die Parametersyntax des inform-Befehls verwendet (on|off|log|raw|timer|status).&lt;br /&gt;
&lt;br /&gt;
==== X_State ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_State($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $time, $readingName, $value ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_State-Funktion wird durch fhem.pl aufgerufen, sobald über den Befehl &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; versucht wird ein Wert für ein Reading oder den Status (&amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt;) einer Gerätedefinition zu setzen. Dieser Befehl wird primär beim Starten von FHEM aufgerufen sobald das State-File eingelesen wird. Je nachdem, ob im gegebenen Fall ein Reading oder der Definitionsstatus gesetzt wird, haben die Übergabeparameter verschiedene Werte:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Funktionsparameter!! Wert beim Setzen eines Readings !! Wert beim Setzen eines Definitionsstatus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | Die Hashreferenz der betreffenden Gerätedefinition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$time&amp;lt;/code&amp;gt;|| Der Zeitstempel auf welchen das Reading &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt; gesetzt werden soll. Das Ergebnis entspricht dem Rückgabewert der Funktion || Der aktuelle Zeitstempel zum jetzigen Zeitpunkt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt;|| Der Name des Readings, welches auf einen neuen Wert gesetzt werden soll. || Statischer Wert &amp;quot;STATE&amp;quot; um anzuzeigen, dass es sich um den Definitionsstatus handelt, welcher gesetzt werden soll (&amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; || Den Wert, welchen das Reading &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt; annehmen soll. || Den Wert, welchen die Gerätedefinition als Status annehmen soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn via &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; ein Reading gesetzt wird, kann die X_State-Funktion das Setzen dieses Readings durch die Rückgabe einer aussagekräftigen Fehlermeldung unterbinden. Sofern &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben wird, wird das entsprechende Reading auf den übergebenen Status gesetzt.&lt;br /&gt;
&lt;br /&gt;
Wenn via &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; der Definitionsstatus gesetzt wird, wird die X_State-Funktion erst nach dem Setzen des Status aufgerufen. Man kann dabei zwar eine Fehlermeldung zurückgeben, der Status wird aber dennoch übernommen. Die Fehlermeldung wird lediglich dem Nutzer angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_State($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $time, $readingName, $value ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return undef if($readingName &amp;quot;STATE&amp;quot; || $value ne &amp;quot;inactive&amp;quot;);&lt;br /&gt;
	readingsSingleUpdate($hash, &amp;quot;state&amp;quot;, &amp;quot;inactive&amp;quot;, 1);&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Authorize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Authorize($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $client_hash, $type, $arg ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $authorized;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Authorize-Funktion wird von fhem.pl aufgerufen um zu erfragen, ob ein bestimmter Client &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; die Aktion &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; ausführen darf. Auf diese Weise können Module Einfluss nehmen, welcher User welche Funktionen in FHEM nutzen darf. Wenn ein Client eine Aktion ausführen möchte, werden alle Module, die eine Authorize-Funktion implementiert haben, gefragt, ob diese Aktion ausgeführt werden darf. Als Rückgabewert wird das Ergebnis der Überprüfung zurückgegeben, wobei &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (unbekannt / nicht zuständig), &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (erlaubt) oder &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (verboten) zurückgegeben werden können.&lt;br /&gt;
&lt;br /&gt;
Es gibt aktuell folgende &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; Kombinationen, mit denen die Authorize-Funktion aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! $type !! $arg !! Überschrift&lt;br /&gt;
|- &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$type&#039;&#039;&#039; = &amp;quot;cmd&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Befehlsausführung&#039;&#039;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;set Lampe on&amp;quot;&amp;lt;/code&amp;gt; || Jeglicher FHEM-Befehl, der ausgeführt werden soll, wird in &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; hinterlegt, sodass innerhalb einer Authorize-Funktion der Befehl genauer geparst werden kann um zu entscheiden, ob dieser Befehl erlaubt ist, oder nicht.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;perl&amp;quot;&amp;lt;/code&amp;gt; || Ausführen von Perl-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;{ReadingsVal(&amp;quot;Lampe&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;off&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;shell&amp;quot;&amp;lt;/code&amp;gt; || Ausführen von Shell-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;&amp;quot;/opt/fhem/myScript.sh&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$type&#039;&#039;&#039; = &amp;quot;devicename&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sichtbarkeit von Geräten/Definitionen&#039;&#039; &lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;Licht_Wohnzimmer&amp;quot;&amp;lt;/code&amp;gt; || Sichtbarkeit des jeweiligen Gerät/Definition in FHEM. Dies bedeutet konkret die Auffindbarkeit im &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;-Befehl, sowie der Suche via [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wird eine solche Anfrage durch die Authorize-Funktion abgelehnt, ist das entsprechende Gerät bzw. Definition für den jeweiligen Client nicht sichtbar.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== X_Authenticate ====&lt;br /&gt;
{{Link2Forum|Topic=72757|Message=644098}}&lt;br /&gt;
&lt;br /&gt;
== Bereitstellen eines eigenen Befehls (Befehlsmodul) ==&lt;br /&gt;
&lt;br /&gt;
Ein Modul kann primär einen neuen FHEM-Befehl bereitstellen. Man spricht in so einem Fall nicht von einem Gerätemodul, sondern einem Befehlsmodul. Ein solches Befehlsmodul stellt nur einen einzelnen Befehl bereit, der dem Modulnamen entsprechen muss. Nur, wenn der Modulname dem Befehlsname entspricht, kann FHEM das Modul beim ersten Ausführen dieses unbekannten Befehls finden und nachladen.&lt;br /&gt;
&lt;br /&gt;
Der entsprechende Befehl wird dazu in der [[#X_Initialize|Initialize]]-Funktion im globalen Hash &amp;lt;code&amp;gt;[[DevelopmentModuleIntro#Wichtige_globale_Variablen_aus_fhem.pl|%cmds]]&amp;lt;/code&amp;gt; registriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($$) {&lt;br /&gt;
&lt;br /&gt;
    $cmds{X} = { Fn           =&amp;gt; &amp;quot;CommandX&amp;quot;,&lt;br /&gt;
                 Hlp          =&amp;gt; &amp;quot;&amp;lt;argument1&amp;gt; [optional_argument2], print something very useful&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
                 # optionaler Filter für Clientmodule als regulärer Ausdruck&lt;br /&gt;
                 ClientFilter =&amp;gt; &amp;quot;FHEMWEB&amp;quot;&lt;br /&gt;
                };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird der neue Befehl &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; in FHEM registriert. Die Funktion mit dem Namen &amp;lt;code&amp;gt;CommandX&amp;lt;/code&amp;gt; setzt diesen Befehl innerhalb des Moduls um. Desweiteren wird eine kurze Aufrufsyntax mitgegeben, welche beim Aufruf des &amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt;-Befehls dem Nutzer angezeigt wird um als Gedankenstütze zu dienen. Optional kann man mittels &amp;lt;code&amp;gt;ClientFilter&amp;lt;/code&amp;gt; (regulärer Ausdruck für Modulnamen) die Ausführbarkeit nur auf bestimmte Client-Module (wie FHEMWEB oder telnet) beschränken. &lt;br /&gt;
&lt;br /&gt;
Nun muss noch die Funktion &amp;lt;code&amp;gt;CommandX&amp;lt;/code&amp;gt; im Rahmen des Moduls implementiert werden, welche den Befehl &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; umsetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
sub CommandX($$)&lt;br /&gt;
{&lt;br /&gt;
 	my ($client_hash, $arguments) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $output;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden der Befehlsfunktion zwei Parameter übergeben. Zuerst die Hash-Referenz des aufrufenden Clients (sofern manuell ausgeführt, ansonsten &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;) zwecks Rechteprüfung via [[allowed|allowed-Definitionen]]. Anschließend folgen die Aufrufparameter als zusammenhängende Zeichenkette. Die Trennung der einzelnen Argumente obligt der Funktion (bspw. via [[DevelopmentModuleAPI#parseParams|parseParams()]]). Als Funktionsrückgabewert wird eine Ausgabemeldung erwartet, die dem Nutzer angezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
== Pollen von Geräten ==&lt;br /&gt;
Wenn Geräte von sich aus keine Informationen senden sondern abgefragt werden müssen, kann man im Modul die Funktion [[DevelopmentModuleAPI#InternalTimer|InternalTimer()]] verwenden um einen Funktionsaufruf zu einem späteren Zeitpunkt durchführen zu können. Man übergibt dabei den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, sowie den zu übergebenden Parameter. Als zu übergebender Parameter wird üblicherweise der Hash der betroffenen Geräteinstanz verwendet. Damit hat die aufgerufene Funktion Zugriff auf alle wichtigen Daten der Geräteinstanz. Eventuell zusätzlich benötigte Werte können einfach als weitere Internals über den Hash zugänglich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise könnte man für das Abfragen eines Geräts in der [[#X_Define|Define]]-Funktion den Timer folgendermaßen setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
InternalTimer(gettimeofday()+2, &amp;quot;X_GetUpdate&amp;quot;, $hash);	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch in der [[#X_Notify|Notify]]-Funktion auf das Event &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt; reagieren und erst dort, den Timer anstoßen, sobald die Konfiguration komplett eingelesen wurde. Dies ist insbesondere notwendig, wenn man sicherstellen will, dass alle Attribute aus der Konfiguration gesetzt sind, sobald man einen Status-Update initiiert.&lt;br /&gt;
&lt;br /&gt;
In der Funktion &amp;lt;code&amp;gt;X_GetUpdate&amp;lt;/code&amp;gt; selbst wird dann der Timer neu gesetzt, so dass nach einem Intervall die Funktion erneut aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_GetUpdate($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	Log3 $name, 4, &amp;quot;X: GetUpdate called ...&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# neuen Timer starten in einem konfigurierten Interval.&lt;br /&gt;
	InternalTimer(gettimeofday()+$hash-&amp;gt;{Interval}, &amp;quot;X_GetUpdate&amp;quot;, $hash);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innerhalb der Funktion kann man nun das Gerät abfragen und die abgefragten Werte in Readings speichern. Falls das Abfragen der Werte jedoch zu einer Verzögerung und damit zu einer Blockade von FHEM führen kann, ist es möglich, in der GetUpdate-Funktion nur die Aufforderung zum Senden bestimmter Daten an das angeschlossene Gerät zu senden und dann das Lesen über die oben beschriebene [[#X_Read|Read]]-Funktion zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Beschreibung der Timer-Funktion gibt es [[DevelopmentModuleAPI#Timer|hier im Wiki]]&lt;br /&gt;
&lt;br /&gt;
== Logging / Debugging ==&lt;br /&gt;
Um Innerhalb eines Moduls eine Log-Meldung in die FHEM-Logdatei zu schreiben, wird die Funktion [[DevelopmentModuleAPI#Log3|Log3()]] aufgerufen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log3 $name, 3, &amp;quot;X ($name) - Problem erkannt ...&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine genaue Beschreibung zu der Funktion inkl. Aufrufparameter findet man [[DevelopmentModuleAPI#Log3|hier]]. Es ist generell ratsam in der Logmeldung sowohl den Namen des eigenen Moduls zu schreiben, sowie den Namen des Geräts, welche diese Logmeldung produziert, da die Meldung, so wie sie ist, direkt in das Logfile wandert und es für User ohne diese Informationen schwierig ist, die Meldungen korrekt zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Log3() verwendet den Namen der Geräteinstanz um das &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;-Attribut zu prüfen. In der Regel wird bei Modulfunktionen jedoch immer nur der Gerätehash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; übergeben. Um den Namen der Definition zu ermitteln ist es daher notwendig sich diesen aus dem Hash extrahieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für eine einzelne Geräteinstanz das Verbose-Level zu erhöhen, ohne gleich für das gesamte FHEM den globalen Verbose-Level zu erhöhen und damit alle Meldungen zu erzeugen, kann man den Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;NAME&amp;gt; verbose&amp;lt;/code&amp;gt; verwenden. Beispielsweise &amp;lt;code&amp;gt;attr Lichtschalter_Wohnzimmer verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logmeldungen sollten je nach Art und Wichtigkeit für den Nutzer in unterschiedlichen Loglevels erzeugt werden. Es gibt insgesamt 5 Stufen in denen geloggt werden kann. Standardmäßig steht der systemweite Loglevel (&amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;-Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;) auf der Stufe 3. Die Bedeutung der jeweiligen Stufen ist in der {{Link2CmdRef|Lang=de|Anker=verbose}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
Während der Entwicklung eines Moduls kann man für eigene Debug-Zwecke auch die Funktion [[DevelopmentModuleAPI#Debug|Debug()]] verwenden um schnell und einfach Debug-Ausgaben in das Log zu schreiben. Diese sollten in der endgültigen Fassung jedoch nicht mehr vorhanden sein. Sie dienen ausschließlich zum Debugging während der Entwicklung.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Beschreibung der Log-Funktion gibt es [[DevelopmentModuleAPI#Logging|hier im Wiki]].&lt;br /&gt;
&lt;br /&gt;
== Zweistufiges Modell für Module ==&lt;br /&gt;
[[Datei:Zweistufiges Modulkonzept.jpg|mini|rechts|Schematische Darstellung am Beispiel CUL]]&lt;br /&gt;
Es gibt viele Geräte, welche die Kommunikation mit weiteren Geräten mit tlw. unterschiedlichen Protokollen ermöglichen. Das typischste Beispiel bietet hier der [[CUL]], welcher via Funk mit verschiedenen Protokollen weitere Geräte ansprechen kann (z.B. Aktoren, Sensoren, ...). Hier bildet ein Gerät eine Brücke durch die weitere Geräte in FHEM zugänglich gemacht werden können. Dabei werden über einen Kommunikationsweg (z.B. serielle Schnittstelle, TCP, ...) beliebig viele Geräte gesteuert. Typische Beispiele dazu sind:&lt;br /&gt;
&lt;br /&gt;
* [[CUL]]: stellt Geräte mit verschiedenen Kommunikationsprotokollen via Funk bereit (u.a. [[FS20]], [[HomeMatic]], [[Funk-Heizkörperregler_Kurz-Bedienungsanleitung_FHT|FHT]], [[MAX]], ...)&lt;br /&gt;
* [[HMLAN]]: stellt HomeMatic Geräte via Funk bereit&lt;br /&gt;
* [[MAX#MAXLAN|MAXLAN]]: stellt [[MAX|MAX!]] Geräte via Funk bereit&lt;br /&gt;
* [[PanStamp#panStick.2FShield|panStamp]]: stellt weitere panStamp Geräte via Funk bereit&lt;br /&gt;
&lt;br /&gt;
Dabei wird die Kommunikation in 2 Stufen unterteilt:&lt;br /&gt;
* physisches Modul - z.B. 00_CUL.pm - zuständig für die physikalische Kommunikation mit der Hardware. Empfangene Daten müssen einem logischen Modul zugeordnet werden.&lt;br /&gt;
* logische Modul(e) - z.B. 10_FS20.pm - interpretiert protokollspezifische Nachrichten. Sendet protokollspezifische Daten über das physische Modul an die Hardware.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;physisches Modul&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das physische Modul öffnet die Datenverbindung zum Gerät (z.B. CUL) und verarbeitet sämtliche Daten. Es kümmert sich um den Erhalt der Verbindung (bsp. durch Keep-Alives) und konfiguriert das Gerät so, dass eine Kommunikation mit allen weiteren Geräten möglich ist (bsp. Frequenz, Modulation, Kanal, etc.).&lt;br /&gt;
&lt;br /&gt;
Empfangene Nutzdaten werden als Zeichenkette über die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] an logische Module weitergegeben.&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt eine [[#Die_Match-Liste|Match-Liste]] bereit, anhand FHEM die Nachricht einem Modul zuordnen kann, sofern dieses noch nicht geladen sein sollte. Die Match-Liste enthält eine Liste von regulären Ausdrücken und ordnet diese einem Modul zu. Wenn eine Nachricht auf einen solchen regulären Ausdruck passt und das Modul noch nicht geladen ist, lädt FHEM dieses automatisch nach, zwecks Verarbeitung der Nachricht. &lt;br /&gt;
&lt;br /&gt;
Anhand einer bereitgestellten [[#Die_Client-Liste|Client-Liste]] (Auflistung von logischen Modulen) kann FHEM feststellen, welche logischen Module mit dem physischen Modul kommunizieren können. Nur die hier aufgelisteten, logischen Module werden beim Aufruf von [[DevelopmentModuleAPI#Dispatch|Dispatch()]] angesprochen.&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt eine [[#X_Write|Write]]-Funktion zur Verfügung, über die logische Module Daten in beliebiger Form an die Hardware übertragen können. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;logisches Modul&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das logische Modul interpretiert die via Dispatch() übergebene Nachricht (Zeichenkette) durch eine bereitgestellte [[#X_Parse|Parse]]-Funktion und erzeugt entsprechende Readings/Events. Es stellt über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;-/&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Kommandos Steuerungsmöglichkeiten dem Nutzer zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Es stellt FHEM einen [[#Der_Match-Ausdruck|Match-Ausdruck]] (regulärer Ausdruck) zur Verfügung anhand [[DevelopmentModuleAPI#Dispatch|Dispatch()]] ermitteln kann, ob die Nachricht durch das logische Modul verarbeitet werden kann. Nur Nachrichten, welche auf diesen Ausdruck passen, werden an das logische Modul weitergegeben (Aufruf [[#X_Parse|Parse]]-Funktion).&lt;br /&gt;
&lt;br /&gt;
=== Die Client-Liste ===&lt;br /&gt;
&lt;br /&gt;
Die Client-Liste ist eine Auflistung von Modulnamen (genauer: regulären Ausdrücken die auf Modulnamen passen) die in einem physischen Modul gesetzt ist. Damit wird definiert, mit welchen logischen Modulen das physikalische Modul  kommunizieren kann. &lt;br /&gt;
&lt;br /&gt;
Eine Client-Liste ist eine Zeichenkette, welche aus allen logischen Modulnamen besteht. Die einzelnen Namen werden durch einen Doppelpunkt getrennt. Anstatt kompletter Modulnamen können auch reguläre Ausdrücke verwendet werden, die auf mehrere Modulnamen passen (z.B. &amp;lt;code&amp;gt;CUL_.*&amp;lt;/code&amp;gt; um die logischen Module CUL_HM, CUL_MAX, etc. zu verwenden).&lt;br /&gt;
&lt;br /&gt;
Bsp.: Die Client-Liste von dem Modul CUL lautet daher wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FS20:FHT.*:KS300:USF1000:BS:HMS:CUL_EM:CUL_WS:CUL_FHTTK:CUL_HOERMANN:ESA2000:CUL_IR:CUL_TX:Revolt:IT:UNIRoll:SOMFY:STACKABLE_CC:CUL_RFR:CUL_TCM97001:CUL_REDIRECT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle hier aufgelisteten Module können über das Modul CUL Daten empfangen bzw. senden.&lt;br /&gt;
&lt;br /&gt;
Die Client-Liste hat generell folgende Funktion:&lt;br /&gt;
* Die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur Module, welche in der Client-Liste enthalten sind, ob diese die Nachricht verarbeiten können (Prüfung via [[#Der Match-Ausdruck|Match-Ausdruck]])&lt;br /&gt;
* Die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] prüft anhand sämtlicher Client-Listen in FHEM, welches IO-Gerät für ein logisches Gerät nutzbar ist.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise wird die Client-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{Clients} = &amp;quot;FS20:KS300:FHT.*&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann die Client-Liste jedoch auch pro physikalisches Gerät setzen. Eine gesetzte Client-Liste in einem Gerät hat immer Vorrang vor der Liste im Modul-Hash. Eine gerätespezifische Client-Liste wird dann verwendet, wenn bspw. ein Gerät je nach Konfiguration nur bestimmte logische Module bedienen kann. Bspw. kann ein CUL je nach RF-Einstellungen FS20, uvm. oder nur HomeMatic bedienen. In einem solchen Fall wird die Client-Liste im Geräte-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{Clients} = &amp;quot;CUL_HM&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
	# ggf.&lt;br /&gt;
	$hash-&amp;gt;{ClientsKeepOrder} = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In vielen Modulen, welche nach dem zweistufigem Konzept arbeiten, beginnt und endet die Client-Liste mit einem Doppelpunkt. Dies ist ein historisches Überbleibsel, da der Prüfmechanismus die Client-Liste früher auf das Vorhandensein von &amp;lt;code&amp;gt;&#039;&#039;&#039;&amp;lt;u&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt;&amp;lt;/u&amp;gt;&#039;&#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039;&#039;&amp;lt;u&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt;&amp;lt;/u&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt; prüfte. Dies ist nun nicht mehr notwendig. Die einzelnen Modulnamen müssen lediglich durch einen Doppelpunkt getrennt werden.&lt;br /&gt;
&lt;br /&gt;
Wird das Internal &amp;quot;ClientsKeepOrder&amp;quot; auf 1 gesetzt, können in &amp;quot;Clients&amp;quot; keine regulären Ausdrücke mehr angegeben werden. Dies hat einen erheblichen Einfluss, auf die Verarbeitungsdauer und sollte in Betracht gezogen werden.&lt;br /&gt;
&lt;br /&gt;
=== Die Match-Liste ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Sämtliche regulären Ausdrücke in der Match-Liste werden &amp;quot;case insensitive&amp;quot; überprüft. Das bedeutet, dass Groß-/Kleinschreibung nicht berücksichtigt wird.&lt;br /&gt;
&lt;br /&gt;
Um dennoch in einem regulären Ausdruck auf Groß-/Kleinschreibung zu prüfen, kann man dieses mit dem Modifizierer &amp;lt;code&amp;gt;(?-i)&amp;lt;/code&amp;gt; wieder aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my %matchListFHEMduino = (&lt;br /&gt;
    ....&lt;br /&gt;
    &amp;quot;5:FHEMduino_PT2262&amp;quot;   =&amp;gt; &amp;quot;^(?-i)IR.*\$&amp;quot;,&lt;br /&gt;
    ....&lt;br /&gt;
    &amp;quot;13:IT&amp;quot;                =&amp;gt; &amp;quot;^(?-i)i......\$&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe dazu Forumsbeitrag: {{Link2Forum|Topic=33422}}&lt;br /&gt;
}}&lt;br /&gt;
Die Match-Liste ordnet eine Nachrichtensyntax (regulärer Ausdruck) einem Modulnamen zu und wird in einem physikalischen Modul gesetzt. Sollte eine Nachricht vom physikalischen Gerät empfangen werden, die durch kein geladenes Modul verarbeitet werden kann ([[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur alle bisher geladenen Module aus der [[#Die Client-Liste|Client-Liste]]), so wird über die Match-Liste geprüft, welches Modul diese Nachricht verarbeiten kann. Dieses Modul wird anschließend geladen und die Nachricht durch dieses direkt durch Aufruf der [[#X_Parse|Parse]]-Funktion verarbeitet. In dieser Liste findet mittels regulärem Ausdruck eine Zuordnung der Nachrichtenstruktur zum verarbeitenden logischen Modul statt.&lt;br /&gt;
&lt;br /&gt;
Diese Liste wird ausschließlich in der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion verwendet. Sollte keine passendes Modul, welches bereits geladen ist, zur Verarbeitung einer Nachricht gefunden werden, so wird mithilfe der Match-Liste aufgrund der vorliegenden Nachricht das entsprechende Modul ermittelt. Dieses Modul wird dann direkt geladen und die Nachricht wird via [[#X_Parse|Parse]]-Funktion verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Die Match-Liste ist eine Zuordnung von einem Sortierpräfix + Modulname zu einem regulären Ausdruck:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;1:FS20&amp;quot;  =&amp;gt; &amp;quot;^81..(04|0c)..0101a001&amp;quot;,&lt;br /&gt;
    &amp;quot;2:KS300&amp;quot; =&amp;gt; &amp;quot;^810d04..4027a001&amp;quot;,&lt;br /&gt;
    &amp;quot;3:FHT&amp;quot;   =&amp;gt; &amp;quot;^81..(04|09|0d)..(0909a001|83098301|c409c401)..&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Sortierpräfix (&amp;lt;code&amp;gt;&amp;lt;u&amp;gt;1:&amp;lt;/u&amp;gt;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;FS20&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) dient als Sortierhilfe um so die Reihenfolge der Prüfung festzulegen. Bei der Prüfung wird die Match-Liste mittels sort() nach dem Schlüssel (Sortierpräfix + Modulname) sortiert und die regulären Ausdrücke werden dann nacheinander getestet. Daher sollten die präzisesten Ausdrücke immer zuerst getestet werden, sofern es weniger präzise Ausdrücke in der Match-Liste gibt. Dabei ist zu beachten, dass der Sortierpräfix nicht nach numerischen Regeln sortiert wird, sondern zeichenbasierend.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise wird die Match-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
   my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
   $hash-&amp;gt;{MatchList} = { &amp;quot;1:FS20&amp;quot;      =&amp;gt; &amp;quot;^81..(04|0c)..0101a001&amp;quot;,&lt;br /&gt;
                          &amp;quot;2:KS300&amp;quot;     =&amp;gt; &amp;quot;^810d04..4027a001&amp;quot;,&lt;br /&gt;
                          &amp;quot;3:FHT&amp;quot;       =&amp;gt; &amp;quot;^81..(04|09|0d)..(0909a001|83098301|c409c401)..&amp;quot; };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann die Match-Liste, ähnlich wie bei der Client-Liste, auch pro physikalisches Gerät setzen. Dabei hat auch hier die Match-Liste eines Gerätes immer Vorrang vor der Match-Liste aus dem Modul-Hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
   my ($hash, $def) = @_;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
   $hash-&amp;gt;{MatchList} = { &amp;quot;1:CUL_HM&amp;quot; =&amp;gt; &amp;quot;^A....................&amp;quot; };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Der Match-Ausdruck ===&lt;br /&gt;
&lt;br /&gt;
Ein Match-Ausdruck wird in einem logischen Modul gesetzt und dient der Prüfung, ob eine Nachricht durch das eigene Modul via [[#X_Parse|Parse]]-Funktion verarbeitet werden kann. Es handelt sich hierbei um einen einzelnen regulären Ausdruck, den FHEM innerhalb der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion prüft. Nur wenn eine Nachricht via Dispatch() auf diesen Audruck matcht, wird die Parse-Funktion des eigenen Moduls aufgerufen um die Nachricht zu verarbeiten. &lt;br /&gt;
&lt;br /&gt;
Der Hintergrund, warum man den Aufruf mit einem solchen Ausdruck vorher abprüft, liegt in der Möglichkeit, dass ein physikalisches Modul mehrere unterschiedliche logische Module ansprechen kann. So kann FHEM jedes geladene Modul durch diesen Match-Ausdruck prüfen, ob es diese Nachricht verarbeiten kann. Erst, wenn alle geladenen Module, aufgrund einer Prüfung des Ausdrucks, die Nachricht nicht verarbeiten können, wird via [[#Die_Match-Liste|Match-Liste]] ermittelt, welches Modul geladen werden muss um die Nachricht zu verarbeiten. &lt;br /&gt;
&lt;br /&gt;
Der Match-Ausdruck wird in der [[#X_Initialize|Initialize]]-Funktion zur Verfügung gestellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# Dieses Modul verarbeitet FS20 Nachrichten&lt;br /&gt;
	$hash-&amp;gt;{Match} = &amp;quot;^81..(04|0c)..0101a001&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Die vollständige Implementierung ===&lt;br /&gt;
&lt;br /&gt;
Hier nun eine Zusammenfassung beim zweistufigen Modulkonzept in der jeweiligen Stufe implementiert werden muss, damit die Kommunikation funktioniert.&lt;br /&gt;
&lt;br /&gt;
==== physisches Modul ====&lt;br /&gt;
&lt;br /&gt;
Das physische Modul, welches als Kommunikationsbrücke zwischen der Hardware und logischen Modulen fungieren wird, sollte mindestens folgende Funktionen implementieren:&lt;br /&gt;
&lt;br /&gt;
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.&lt;br /&gt;
* [[#X_Define|Define]]-Funktion - Zum öffnen der Datenverbindung zur Hardware (IP-Adresse/serielle Schnittstelle/...).&lt;br /&gt;
* [[#X_Read|Read]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.&lt;br /&gt;
* [[#X_Read|Ready]]-Funktion - Zum Wiederaufbau der Verbindung bei Verbindungsabbruch, bzw. Prüfung auf lesbare Daten bei serieller Schnittstelle unter Windows.&lt;br /&gt;
* [[#X_Write|Write]]-Funktion - Zum Senden von Daten, welche logische Module via [[DevelopmentModuleAPI#IOWrite|IOWrite()]] an die Hardware übertragen möchten.&lt;br /&gt;
* [[#X_Undef|Undef]]-Funktion - Schließen der Verbindung zur Hardware beim Löschen via &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [[#X_Shutdown|Shutdown]]-Funktion - Schließen der Verbindung zur Hardware beim Stopp von FHEM via &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [[#X_DelayedShutdown | DelayedShutdown]]-Funktion - Verzögertes beenden zum Schließen der Verbindung zur Hardware beim Stopp von FHEM via &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:&lt;br /&gt;
&lt;br /&gt;
* [[#Die_Client-Liste|Client-Liste]] - Auflistung aller logischen Module, die über dieses Modul kommunizieren können&lt;br /&gt;
* [[#Die_Match-Liste|Match-Liste]] - Zuordnung von Nachrichtensyntax zu Modul zwecks Autoload-Funktionalität.&lt;br /&gt;
&lt;br /&gt;
==== logisches Modul ====&lt;br /&gt;
&lt;br /&gt;
Das logische Modul, bildet ein einzelnes Gerät ab, über das mit einem physikalisches Modul kommuniziert werden kann. Es sollte mindestens folgende Funktionen implementieren:&lt;br /&gt;
&lt;br /&gt;
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.&lt;br /&gt;
* [[#X_Define|Define]]-Funktion - Speichern des Definition Pointers (siehe [[#X_Parse|Parse-Funktion]])&lt;br /&gt;
* [[#X_Parse|Parse]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.&lt;br /&gt;
* [[#X_Undef|Undef]]-Funktion - Löschen des Definition Pointers beim Löschen via &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:&lt;br /&gt;
&lt;br /&gt;
* [[#Der_Match-Ausdruck|Match-Ausdruck]] - Prüfausdruck, ob eine Nachricht durch dieses Modul verarbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von der Hardware bis zu den logischen Modulen ===&lt;br /&gt;
&lt;br /&gt;
Die Gerätedefinition des physischen Moduls öffnet eine Verbindung zur Hardware (z.B. via [[DevIo]]). Die [[#X_Read|Read]]-Funktion wird bei anstehenden Daten aus der Hauptschleife von fhem.pl aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Die Read-Funktion stellt dabei sicher, dass die Daten&lt;br /&gt;
* komplett (in der Regel über einen internen Puffer in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) und&lt;br /&gt;
* korrekt (z.B. via Prüfung mittels regulärem Ausdruck)&lt;br /&gt;
sind und ruft die globale Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] mit einer kompletten Nachricht auf.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() prüft alle geladenen Module aus der [[#Die_Client-Liste|Client-Liste]] des physikalischen Moduls nach möglichen logischen Modulen zur Verarbeitung. Alle zum Zeitpunkt geladenen Module, die in der Client-Liste aufgeführt sind, werden über den [[#Der_Match-Ausdruck|Match-Ausdruck]] geprüft, ob sie mit der Nachricht etwas anfangen können. Sollte bei einem logischen Modul der Match-Ausdruck passen, so wird die entsprechende [[#X_Parse|Parse]]-Funktion des logischen Moduls aufgerufen. Sofern keine passendes Modul gefunden wurde, um die Nachricht zu verarbeiten, wird in der [[#Die_Match-Liste|Match-Liste]] im Geräte- bzw. Modul-Hash der physischen Gerätedefinition nach dem passenden Modul gesucht. Sollte es darin ein Modul geben, was diese Art von Nachricht verarbeiten kann, so wird versucht dieses Modul zu laden um nun die Nachricht via Parse-Funktion zu verarbeiten. Es erfolgt in diesem Fall keine Vorprüfung durch den Match-Ausdruck.&lt;br /&gt;
&lt;br /&gt;
Durch Dispatch() wird nun die [[#X_Parse|Parse]]-Funktion des gefundenen logischen Moduls aufgerufen. Diese&lt;br /&gt;
* interpretiert die übergebene Nachricht,&lt;br /&gt;
* versucht eine existierende Gerätedefinition in FHEM zu finden (z.B. mittels Definition Pointer), für welche die Nachricht addressiert ist,&lt;br /&gt;
* setzt alle [[#Readings|Readings]] für die gefundene Gerätedefinition via [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen,&lt;br /&gt;
* gibt den Namen der logischen Definition zurück, welche die Nachricht verarbeitet hat.&lt;br /&gt;
&lt;br /&gt;
Sollte keine passende Gerätedefinition für die entsprechende Nachricht existieren (Adresse/ID/Kanal/...), wird der Gerätename &amp;quot;UNDEFINED&amp;quot; inkl. einem passenden &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Statement zurückgegeben, um die Definition durch [[autocreate]] erzeugen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Es findet während der Verarbeitung einer Nachricht durch Dispatch()/Parse-Funktion keine sofortige Eventverarbeitung (via [[DevelopmentModuleAPI#Dispatch|DoTrigger()]]) statt, wenn die [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen verwendet werden.&lt;br /&gt;
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() triggert das Event-Handling für das von der Parse-Funktion zurückgegebene logische Device selbstständig nach Abschluss der Parse-Funktion.&lt;br /&gt;
&lt;br /&gt;
Optional führt die Funktion Dispatch() eine Überprüfung auf Nachrichtenduplikate beim Einsatz von mehreren IO-Geräten durch. Dazu wird eine implementierte [[#X_Fingerprint|Fingerprint]]-Funktion im physischen oder logischen Modul benötigt. Sollte der Fingerprint einer Nachricht innerhalb einer bestimmten Zeit (globales Attribut &amp;lt;code&amp;gt;dupTimeout&amp;lt;/code&amp;gt;, standardmäßig 500ms) bereits empfangen worden sein, so wird die Nachricht verworfen. Dies ist insbesondere bei funkbasierter Hardware notwendig, wenn mehrere Empfänger die selbe Nachricht empfangen.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von den logischen Modulen bis zur Hardware ===&lt;br /&gt;
&lt;br /&gt;
Um von einem logischen Modul eine Nachricht an die Hardware senden zu können, muss zunächst im logischen Gerät ein passenden IO-Gerät ausgewählt sein. Dazu muss die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] ein entsprechendes IO-Gerät auswählen und in &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt; setzen. Dieser Aufruf wird üblicherweise in der [[#X_Define|Define]]-Funktion des logischen Moduls ausgeführt. Erst, wenn ein IO-Gerät ausgewählt wurde, können Daten über das physikalische Gerät an die Hardware übermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten ruft das logische Modul die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] samt Daten auf. Diese ruft für das entsprechende IO-Gerät die [[#X_Write|Write]]-Funktion auf und übergibt die Daten zum Schreiben an das physikalische Modul. Die Write-Funktion kümmert sich nun um die Übertragung der Daten an die Hardware. &lt;br /&gt;
&lt;br /&gt;
Keine direkten Zugriffe zwischen dem logischen und dem physischen Gerät gibt (d.h. keine direkten Aufrufe von Funktionen, kein direktes Überprüfen von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;-Inhalten, ...), so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie bei der [[RFR_CUL|RFR]]-Funktionalität) oder mittels [[FHEM2FHEM]] im RAW-Modus zwei FHEM-Installationen verbunden werden und die logischen Geräte können dennoch kommunizieren.&lt;br /&gt;
&lt;br /&gt;
=== Automatisches Anlegen von logischen Gerätedefinitionen (autocreate) ===&lt;br /&gt;
&lt;br /&gt;
Das logische Modul kann im Rahmen der [[#X_Parse|Parse]]-Funktion eine neue Gerätedefinition anlegen, sofern eine passende Definition nicht existieren sollte. Die Parse-Funktion gibt generell den Namen der logischen Gerätedefinition zurück, für welche die Nachricht verarbeitet wurde. Sollte keine passende Definition gefunden werden, so muss die Parse-Funktion folgenden Rückgabewert liefern (zusammenhängende Zeichenkette):&lt;br /&gt;
&lt;br /&gt;
 UNDEFINED &#039;&#039;&amp;amp;lt;Namensvorschlag&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Define-Parameter...&amp;amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sollte also bspw. im Rahmen der Parse-Funktion zu Modul X eine Nachricht nicht einer existierenden Gerätedefinition zugeordnet werden können, so muss ein Namensvorschlag erstellt werden der eine eindeutige Komponente wie bspw. eine Adresse/ID/Kanal-Nr enthält. In der Regel wird hier immer der Modulname zusammen mit der eindeutigen Komponente, durch einen Unterstrich getrennt, verwendet (Bsp: &amp;lt;code&amp;gt;X_4834&amp;lt;/code&amp;gt;). Der Modulname ist in der Regel immer der, des eigenen Moduls. In besonderen Fällen kann man hier auch einen abweichenden Modulnamen angeben. Dies wird bspw. bei den [[PanStamp#FHEM-Module.2FDevice_Definition_Files|SWAP-Modulen]] eingesetzt. Als Define-Parameter müssen alle notwendigen Parameter angegeben werden, die beim Aufruf des &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehls notwendig sind, damit eine neu angelegte Gerätedefinition Nachrichten zu dieser eindeutigen Adresse Daten verarbeitet. Dazu muss mind. die eindeutige Adresse mitgegeben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel für FS20:&lt;br /&gt;
&lt;br /&gt;
 UNDEFINED FS20_0ae42f8 FS20 0ae42 f8&lt;br /&gt;
&lt;br /&gt;
Sobald [[DevelopmentModuleAPI#Dispatch|Dispatch()]] einen solchen Rückgabewert von einer [[#X_Parse|Parse]]-Funktion erhält, wird diese Zeichenkette so wie sie ist via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] als Event für die Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; getriggert.&lt;br /&gt;
&lt;br /&gt;
Sofern der Nutzer das Modul [[autocreate]] verwendet (definiert hat), kümmert sich dieses nun um das Anlegen einer entsprechenden Gerätedefinition. Es lauscht dabei auf generierte Events der Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; via [[#X_Notify|Notify]]-Funktion. Der Nutzer kann dabei das Verhalten von autocreate durch entsprechende Parameter beeinflussen.&lt;br /&gt;
&lt;br /&gt;
Das Modul, für welches autocreate eine neue Definition anlegen möchte, kann das Verhalten durch entsprechende Parameter im Modul-Hash beeinflussen. Dabei gilt, dass gesetzte Attribute durch den Nutzer generell Vorrang haben. Die entsprechenden Parameter werden dabei im Rahmen der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	$hash-&amp;gt;{AutoCreate} = {&amp;quot;X_.*&amp;quot;  =&amp;gt; { ATTR   =&amp;gt; &amp;quot;event-on-change-reading:.* event-min-interval:.*:300&amp;quot;,&lt;br /&gt;
	                                    FILTER =&amp;gt; &amp;quot;%NAME&amp;quot;,&lt;br /&gt;
	                                    GPLOT  =&amp;gt; &amp;quot;temp4hum4:Temp/Hum,&amp;quot;,&lt;br /&gt;
	                                    autocreateThreshold =&amp;gt; &amp;quot;2:140&amp;quot;&lt;br /&gt;
					  }&lt;br /&gt;
	                      };&lt;br /&gt;
			    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei wird unterhalb von &amp;lt;code&amp;gt;$hash-&amp;gt;{AutoCreate}&amp;lt;/code&amp;gt; eine Liste angelegt, wo einem regulären Ausdruck für einen anzulegenden Definitionsnamen entsprechende Optionen zugeordnet werden. Sobald durch autocreate eine Gerätedefintion angelegt wird, auf den ein hier gelisteter Ausdruck matcht, so werden die zugeordneten Optionen berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
Hier eine Auflistung aller möglichen Optionen und ihrer Bedeutung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Optionsname !! Beispiel !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;ATTR&amp;lt;/code&amp;gt;|| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&amp;quot;event-on-change-reading:.* event-min-interval:.*:300&amp;quot;&amp;lt;/code&amp;gt; || Eine Auflistung von Attributen, die nach dem Anlegen einer Definition zusätzlich gesetzt werden. Es handelt sich hierbei um eine Leerzeichen-separierte Liste von Doppelpunkt-getrennten Tupels mit Attributname und -wert.&lt;br /&gt;
&lt;br /&gt;
Für das dargestellte Beispiel bedeutet dies, dass nach dem Anlegen der Definition folgende FHEM-Befehle zusätzlich ausgeführt werden:&lt;br /&gt;
&lt;br /&gt;
 attr &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; event-on-change-reading .*&lt;br /&gt;
 attr &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; event-min-interval .*:300&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&amp;quot;%NAME&amp;quot;&amp;lt;/code&amp;gt;|| Sofern in der autocreate-Definiton das Attribut &amp;lt;code&amp;gt;filelog&amp;lt;/code&amp;gt; entsprechend durch den Nutzer gesetzt ist, wird eine zugehörige FileLog-Definition angelegt. Diese Option setzt den dabei benutzten Filter-Regexp, der beim Anlegen der FileLog-Definition gesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Dabei werden folgende Platzhalter durch die entsprechenden Werte der neu angelegten Gerätedefinition ersetzt:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;%NAME&amp;lt;/code&amp;gt; - wird ersetzt durch den Definitionsnamen&lt;br /&gt;
* &amp;lt;code&amp;gt;%TYPE&amp;lt;/code&amp;gt; - wird ersetzt durch den Modulnamen&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&amp;quot;temp4hum4:Temp/Hum,&amp;quot;&amp;lt;/code&amp;gt; || Sofern eine FileLog-Definition angelegt wurde, kann man weiterführend dazu eine passende SVG-Definition erzeugen um Daten aus dem erzeugten FileLog zu visualisieren. Ein typischer Fall sind hierbei Temperatursensoren, wo es sinnvoll sein kann, einen passenden SVG-Plot mit Temperatur/Luftfeuchtigkeit direkt anzulegen.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich hierbei um eine kommaseparierte Auflistung von gplot-Dateinamen und optionalen Label-Texten durch einen Doppelpunkt getrennt. Im genannten Beispiel entspricht &amp;lt;code&amp;gt;temp4hum4&amp;lt;/code&amp;gt; der zu verwendenden GnuPlot-Datei und &amp;lt;code&amp;gt;Temp/Hum&amp;lt;/code&amp;gt; dem zu verwendenden Label ([[SVG]] Attribut &amp;lt;code&amp;gt;label&amp;lt;/code&amp;gt;). Das Label wird auch durch FileLog verwendet als Link-Text zum entsprechenden SVG Plot. Alternativ kann auch nur die entsprechende GnuPlot-Datei anegeben werden ohne Label. Für jede angegebene GnuPlot-Datei wird anschließend eine entsprechende SVG-Definition erzeugt mit der vorher erzeugten FileLog-Definition als Datenquelle.&lt;br /&gt;
&lt;br /&gt;
Der gesamte Inhalt der &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt;-Option wird beim Anlegen einer FileLog-Definition dem Attribut &amp;lt;code&amp;gt;logtype&amp;lt;/code&amp;gt; als Wert plus dem Text &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; zugewiesen. Daher muss der Inhalt der Option &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; immer mit einem Komma enden. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&amp;quot;2:10&amp;quot;&amp;lt;/code&amp;gt; || Definiert, wie viele Aufrufe (im Bsp: &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;) von autocreate innerhalb welcher Zeit (im Bsp: &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; Sek.) stattfinden müssen, bevor die Gerätedefinition tatsächlich durch autocreate angelegt wird. Dadurch kann das ungewollte Anlegen von Geräten verhindert werden die tatsächlich nicht in Echt existieren. Aufgrund von Funkstörungen kann es durchaus zum ungewollten Anlegen einer Definition kommen. Diese Funktion lässt eine Definition erst zu wenn innerhalb einer vorgegeben Zeit eine Mindestzahl an Nachrichten eintrifft.&lt;br /&gt;
&lt;br /&gt;
Die erste Zahl stellt dabei die Mindestanzahl an Nachrichten dar. Die Zweite Zahl stellt die Zeit in Sekunden dar, in der die Mindestanzahl an Nachrichten erreicht werden muss um eine entsprechende Gerätedefinition anzulegen. &lt;br /&gt;
&lt;br /&gt;
Sofern diese Option nicht gesetzt ist, wird standardmäßig &amp;lt;code&amp;gt;2:60&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
Diese Option kann durch den Anwender über das Attribut &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; übersteuert werden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;noAutocreatedFilelog&amp;lt;/code&amp;gt;|| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;|| Flag. Sofern gesetzt, wird keine FileLog- und ggf. SVG-Definition erzeugt. Selbst wenn der Nutzer durch entsprechende Attribute das Anlegen wünscht. Diese Option ist sinnvoll für Module bzw. Geräte die keine Readings erzeugen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Die Wahl der vorangestellten Nummer für den Dateinamen eines neuen Moduls hat keine Bedeutung mehr, es sei denn die Nummer ist 99. Module, die mit 99_ beginnen, werden von FHEM automatisch geladen. Module mit einer anderen Nummer nur wenn ein &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl dafür sorgt, dass das Modul geladen wird.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Modul Initialisierungsdaten benötigt, sollten diese im Modul selbst enthalten sein. Eine zusätzliche Datei oder sogar ein Unterverzeichnis mit mehreren Dateien ist bei FHEM nicht üblich und sollte bei Modulen, die mit FHEM ausgeliefert werden nur in Rücksprache mit Rudolf König angelegt werden, da sie sonst bei einem Update nicht verteilt werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
Wenn man weitere Details wissen möchte, ist ein erster sinnvoller Schritt ein Blick in die Datei fhem.pl. Dort sieht man im Perl-Code wie die Module aufgerufen werden, was vorher passiert und was danach. Am Anfang der Datei (ca. ab Zeile 130) findet man beispielsweise eine Liste der globalen Variablen, die den Modulen zur Verfügung stehen sowie Details zu den wichtigen Hashes %modules und %defs. Wer mit Perl noch nicht so gut klar kommt, dem hilft eventuell ein Blick auf die Perldoc Website[http://perldoc.perl.org/] oder in das Perl-Buch seiner Wahl. Auch die FHEM {{Link2CmdRef}} sollte nicht unterschätzt werden. Es stehen oft mehr interessante Details auch für Modulentwickler darin als man zunächst vermuten könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hello World&amp;quot; Beispiel ==&lt;br /&gt;
&lt;br /&gt;
98_Hello.pm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
package main;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my %Hello_gets = (&lt;br /&gt;
	&amp;quot;whatyouwant&amp;quot;	=&amp;gt; &amp;quot;can&#039;t&amp;quot;,&lt;br /&gt;
	&amp;quot;whatyouneed&amp;quot;	=&amp;gt; &amp;quot;try sometimes&amp;quot;,&lt;br /&gt;
	&amp;quot;satisfaction&amp;quot;  =&amp;gt; &amp;quot;no&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
sub Hello_Initialize {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{DefFn}      = \&amp;amp;Hello_Define;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn}    = \&amp;amp;Hello_Undef;&lt;br /&gt;
    $hash-&amp;gt;{SetFn}      = \&amp;amp;Hello_Set;&lt;br /&gt;
    $hash-&amp;gt;{GetFn}      = \&amp;amp;Hello_Get;&lt;br /&gt;
    $hash-&amp;gt;{AttrFn}     = \&amp;amp;Hello_Attr;&lt;br /&gt;
    $hash-&amp;gt;{ReadFn}     = \&amp;amp;Hello_Read;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
          &amp;quot;formal:yes,no &amp;quot;&lt;br /&gt;
        . $readingFnAttributes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Define {&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    my @param = split(&#039;[ \t]+&#039;, $def);&lt;br /&gt;
    &lt;br /&gt;
    if(int(@param) &amp;lt; 3) {&lt;br /&gt;
        return &amp;quot;too few parameters: define &amp;lt;name&amp;gt; Hello &amp;lt;greet&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    $hash-&amp;gt;{name}  = $param[0];&lt;br /&gt;
    $hash-&amp;gt;{greet} = $param[2];&lt;br /&gt;
    &lt;br /&gt;
    return ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Undef {&lt;br /&gt;
    my ($hash, $arg) = @_; &lt;br /&gt;
    # nothing to do&lt;br /&gt;
    return ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Get {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;get Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	if(!$Hello_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if($attr{$name}{formal} eq &#039;yes&#039;) {&lt;br /&gt;
	    return $Hello_gets{$opt}.&#039;, sir&#039;;&lt;br /&gt;
    }&lt;br /&gt;
	return $Hello_gets{$opt};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Set {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;set Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @param);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($Hello_gets{$opt})) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
    $hash-&amp;gt;{STATE} = $Hello_gets{$opt} = $value;&lt;br /&gt;
    &lt;br /&gt;
	return &amp;quot;$opt set to $value. Try to get it.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub Hello_Attr {&lt;br /&gt;
	my ($cmd,$name,$attr_name,$attr_value) = @_;&lt;br /&gt;
	if($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
        if($attr_name eq &amp;quot;formal&amp;quot;) {&lt;br /&gt;
			if($attr_value !~ /^yes|no$/) {&lt;br /&gt;
			    my $err = &amp;quot;Invalid argument $attr_value to $attr_name. Must be yes or no.&amp;quot;;&lt;br /&gt;
			    Log 3, &amp;quot;Hello: &amp;quot;.$err;&lt;br /&gt;
			    return $err;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
		    return &amp;quot;Unknown attr $attr_name&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=begin html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a name=&amp;quot;Hello&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Hello&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;i&amp;gt;Hello&amp;lt;/i&amp;gt; implements the classical &amp;quot;Hello World&amp;quot; as a starting point for module development. &lt;br /&gt;
    You may want to copy 98_Hello.pm to start implementing a module of your very own. See &lt;br /&gt;
    &amp;lt;a href=&amp;quot;http://wiki.fhem.de/wiki/DevelopmentModuleIntro&amp;quot;&amp;gt;DevelopmentModuleIntro&amp;lt;/a&amp;gt; for an &lt;br /&gt;
    in-depth instruction to your first module.&lt;br /&gt;
    &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Hellodefine&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Define&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; Hello &amp;amp;lt;greet&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Example: &amp;lt;code&amp;gt;define HELLO Hello TurnUrRadioOn&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        The &amp;quot;greet&amp;quot; parameter has no further meaning, it just demonstrates&lt;br /&gt;
        how to set a so called &amp;quot;Internal&amp;quot; value. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#define&amp;quot;&amp;gt;commandref#define&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the define command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloset&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Set&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;set &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;set&amp;lt;/i&amp;gt; any value to any of the following options. They&#039;re just there to &lt;br /&gt;
        &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; them. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#set&amp;quot;&amp;gt;commandref#set&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the set command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Options:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;satisfaction&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;no&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouwant&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;can&#039;t&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouneed&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;try sometimes&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloget&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Get&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;get &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; the value of any of the options described in &lt;br /&gt;
        &amp;lt;a href=&amp;quot;#Helloset&amp;quot;&amp;gt;paragraph &amp;quot;Set&amp;quot; above&amp;lt;/a&amp;gt;. See &lt;br /&gt;
        &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#get&amp;quot;&amp;gt;commandref#get&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the get command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a name=&amp;quot;Helloattr&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Attributes&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;attr &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;attribute&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#attr&amp;quot;&amp;gt;commandref#attr&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the attr command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Attributes:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;formal&amp;lt;/i&amp;gt; no|yes&amp;lt;br&amp;gt;&lt;br /&gt;
                When you set formal to &amp;quot;yes&amp;quot;, all output of &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; will be in a&lt;br /&gt;
                more formal language. Default is &amp;quot;no&amp;quot;.&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der HTML-Code zwischen den Tags &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt; dient zur Generierung der commandref.html. Der HTML-Inhalt wird automatisch beim Verteilen des Moduls im Rahmen des Update-Mechanismus aus jedem Modul extrahiert und daraus die Commandref in verschiedenen Sprachen erstellt. Eine detaillierte Beschreibung wie ein Commandref-Abschnitt in einem Modul definiert wird, siehe: [[Guidelines zur Dokumentation]]&lt;br /&gt;
&lt;br /&gt;
==== Entwicklungsumgebung ====&lt;br /&gt;
Eine vorbereite Entwicklungsumgebung steht in Github in Form eines Vorlagen Repository bereit: &lt;br /&gt;
&lt;br /&gt;
Es beinhaltet eine CI/CD Pipeline um das eigene Modul automatisiert zu testen: https://github.com/fhem/mod_template&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=37912</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=37912"/>
		<updated>2023-01-04T18:09:49Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Initalize Funktion überarbeitet (coderefs anstelle von Funktionsnamen)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. }}&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Um neue Geräte, Dienste, o.ä. in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben. Ein Modul wird in FHEM automatisch geladen, wenn ein entsprechendes Device in FHEM definiert wird. Das Modul ermöglicht eine spezifische Kommunikation mit einem physikalischen Gerät, stellt Ergebnisse (&amp;quot;Readings&amp;quot;) und Events innerhalb von FHEM zur Verfügung und erlaubt es, das Gerät mit &amp;quot;Set&amp;quot;-/&amp;quot;Get&amp;quot;-Befehlen zu beeinflussen. Dieser Artikel soll den Einstieg in die Entwicklung eigener Module erleichtern.&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; werden Devices in FHEM basierend auf einem Modul definiert. Dieser Befehl sorgt dafür, dass ein neues Modul bei Bedarf geladen und initialisiert wird. Ein gutes Beispiel ist hierbei die zentrale Konfigurationsdatei &amp;quot;fhem.cfg&amp;quot; in der sämtliche Devices in Form von &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Statements gespeichert sind.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen der Name des Moduls und der Name der [[#X_Initialize|Initialisierungsfunktion]]  identisch sein. Das folgende Beispiel soll dies verdeutlichen:&lt;br /&gt;
&lt;br /&gt;
Ein Jeelink USB-Stick könnte beispielsweise mit dem Befehl &amp;lt;code&amp;gt;define JeeLink1 &#039;&#039;JeeLink&#039;&#039; /dev/ttyUSB0@57600&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
In fhem.pl wird der &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl verarbeitet und geprüft, ob ein Modul mit dem Namen &amp;quot;JeeLink&amp;quot; schon geladen ist. Falls nicht, wird ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (z.B. /opt/fhem/FHEM) gesucht und, falls vorhanden, anschließend geladen. &lt;br /&gt;
Danach wird die Funktion &amp;lt;code&amp;gt;&#039;&#039;JeeLink&#039;&#039;_Initialize()&amp;lt;/code&amp;gt; aufgerufen um das Modul in FHEM zu registrieren. Eine Moduldatei muss dazu eine Funktion &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039;_Initialize()&amp;lt;/code&amp;gt; enthalten. Durch den Aufruf dieser Funktion wird FHEM mitgeteilt, welche Funktionalitäten dieses Modul unterstützt und durch welche Perl-Funktionen im Modul selbst diese ausimplementiert werden.&lt;br /&gt;
&lt;br /&gt;
In der Initialisierungsfunktion des Moduls werden die Namen aller weiteren Perl-Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird für jedes Modul ein eigener Hash (genauer &amp;quot;Modul-Hash&amp;quot;) mit entsprechenden Werten gefüllt, der in fhem.pl für jedes Modul entsprechend abgelegt wird. Dadurch weiß FHEM wie dieses Modul anzusprechen ist.&lt;br /&gt;
&lt;br /&gt;
== Grundlegender Aufbau eines Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== Dateiname ===&lt;br /&gt;
&lt;br /&gt;
Ein FHEM-Modul wird als Perl-Modul mit der Dateiendung *.pm abgespeichert. Der Dateiname folgt dabei folgendem Schema:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&#039;&#039;[&#039;&#039;&#039;Schlüsselnummer&#039;&#039;&#039;]&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;_&amp;lt;/font&amp;gt;&#039;&#039;[&#039;&#039;&#039;Modulname&#039;&#039;&#039;]&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;.pm&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Schlüsselnummer&#039;&#039;&#039; - Eine zweistellige Zahl zwischen 00 - 99. Die Schlüsselnummer hat aktuell keine technische Relevanz mehr. In früheren FHEM-Versionen ist sie relevant für [[#Zweistufiges_Modell_f.C3.BCr_Module|zweistufige Module]] (Reihenfolge für [[DevelopmentModuleAPI#Dispatch|Dispatch()]] um logische Module zu prüfen). Die allgemeine Empfehlung ist hierbei eine Schlüsselnummer eines Moduls zu verwenden, welches eine ähnliche Funktionalität bietet. Die Schlüsselnummer 99 hat hierbei eine besondere Bedeutung, da alle Module mit dieser Schlüsselnummer beim Start von FHEM automatisch geladen werden, selbst, wenn sie in der Konfiguration nicht verwendet werden. Daher wird für myUtils 99 als Schlüsselnummer verwendet (99_myUtils.pm). Module mit der Schlüsselnummer 99 werden im SVN nicht akzeptiert (siehe [[SVN Nutzungsregeln]])&lt;br /&gt;
* &#039;&#039;&#039;Modulname&#039;&#039;&#039; - Der Name des Moduls wie er in FHEM bei dem Anlegen einer Gerätedefinition zu verwenden ist. Der Modulname sollte nur aus den folgenden möglichen Zeichen bestehen: Groß-/Kleinbuchstaben, Zahlen sowie Unterstrich (_)&lt;br /&gt;
&lt;br /&gt;
=== Inhaltlicher Aufbau ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul ist inhaltlich in folgende Abschnitte unterteilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
#  72_MYMODULE.pm &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
# Laden evtl. abhängiger Perl- bzw. FHEM-Hilfsmodule&lt;br /&gt;
use HttpUtils;&lt;br /&gt;
use [...]&lt;br /&gt;
&lt;br /&gt;
# FHEM Modulfunktionen&lt;br /&gt;
&lt;br /&gt;
sub MYMODULE_Initialize() {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub MYMODULE_Define() {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# Eval-Rückgabewert für erfolgreiches&lt;br /&gt;
# Laden des Moduls&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Beginn der Commandref&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=item [helper|device|command]&lt;br /&gt;
=item summary Kurzbeschreibung in Englisch was MYMODULE steuert/unterstützt&lt;br /&gt;
=item summary_DE Kurzbeschreibung in Deutsch was MYMODULE steuert/unterstützt&lt;br /&gt;
&lt;br /&gt;
=begin html&lt;br /&gt;
 Englische Commandref in HTML&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=begin html_DE&lt;br /&gt;
 Deutsche Commandref in HTML&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
# Ende der Commandref&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann hierbei von folgender Reihenfolge sprechen:&lt;br /&gt;
&lt;br /&gt;
# Perl-Code, welcher das Modul implementiert&lt;br /&gt;
# Die Zeile &amp;lt;code&amp;gt;1;&amp;lt;/code&amp;gt; nachdem der Perl-Code abgeschlossen ist. Dies dient FHEM der Erkennung, dass das Modul erfolgreich und vollständig geladen wurde. Sollte diese Zeile nicht enthalten sein, wird FHEM beim Laden des Moduls die Fehlermeldung &amp;lt;code&amp;gt;Error:Modul 72_MYMODULE deactivated&amp;lt;/code&amp;gt; in das Logfile schreiben.&lt;br /&gt;
# Commandref zur Dokumentation des Moduls. Diese Dokumentation soll dem User die möglichen Befehle/Attribute/Readings/Events vermitteln. Weitere Informationen und Hinweise findet man in den [[Guidelines zur Dokumentation]].&lt;br /&gt;
&lt;br /&gt;
== Der Hash einer Geräteinstanz ==&lt;br /&gt;
Eine Besonderheit in Perl sind [http://de.wikipedia.org/wiki/Assoziatives_Array#Perl assoziative Arrays], (nicht ganz richtig als &amp;quot;Hash&amp;quot; bezeichnet) in denen die Adressierung nicht über eine Zählvariable erfolgt, sondern über einen beliebigen String. Die internen Abläufe bei der Adressierung führen dazu, dass die Speicherung in und der Abruf aus Hashes relativ langsam ist.&lt;br /&gt;
&lt;br /&gt;
Der zentrale Speicherort für Informationen einer Geräteinstanz bei FHEM ist ein solcher Hash, der seinerseits in fhem.pl von einem globalen Hash referenziert wird. &lt;br /&gt;
&lt;br /&gt;
In fhem.pl werden alle Gerätedefinitionen in dem globalen Hash &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; abgelegt. Der Inhalt von &amp;lt;code&amp;gt;$defs{&#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039;}&amp;lt;/code&amp;gt; in fhem.pl verweist dabei auf den Hash der Geräteinstanz in Form einer Hashreferenz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben (i.d.R. als &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; bezeichnet), welche direkt von fhem.pl aufgerufen werden. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im Frontend als &amp;quot;Internals&amp;quot; angezeigt werden, sowie die Readings des Geräts. &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt; enthält den Namen der Geräteinstanz, &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt; enthält die Typbezeichnung des Geräts (Modulname)&lt;br /&gt;
&lt;br /&gt;
==Ausführung von Modulen==&lt;br /&gt;
FHEM arbeitet intern nicht parallel, sondern arbeitet alle Aufgaben seriell nacheinander kontinuierlich ab. Daher wäre es ungünstig, wenn Module Daten von einem physikalischen Gerät abfragen wollen und dabei innerhalb der selben Funktion auf die Antwort des Geräts warten. In dieser Zeit, in der FHEM auf die Antwort des Gerätes warten muss, wäre der Rest von FHEM blockiert. Da immer nur eine Aufgabe zur selben Zeit bearbeitet wird, müssen alle weiteren Aufgaben solange warten. Eine Datenkommunikation innerhalb eines Moduls sollte daher immer ohne Blockierung erfolgen. Dadurch kann FHEM die Wartezeit effizient für andere Aufgaben nutzen um bspw. anstehende Daten für andere Module zu verarbeiten. Es gibt in FHEM entsprechende Mechanismen, welche eine &amp;quot;Non-Blocking&amp;quot;-Kommunikation über verschiedene Wege (z.B. seriell, HTTP, TCP, ...) ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden in FHEM zwei zentrale Listen gepflegt, in der die Filedeskriptoren der geöffneten Kommunikatonsverbindungen gespeichert sind. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet um Filedeskriptoren auf lesbare Daten zu überprüfen. In FHEM gibt es dazu eine Liste (&amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;), in der die Filedeskriptoren sämtlicher Geräte (z.B. serielle Verbindung, TCP-Verbindung, etc.) gespeichert sind. &lt;br /&gt;
&lt;br /&gt;
In der zentralen Schleife (Main-Loop) von fhem.pl wird mit &amp;lt;code&amp;gt;select()&amp;lt;/code&amp;gt; überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion ([[#X_Read|X_Read]]) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und verarbeitet. Anschließend wird die Schleife weiter ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per &amp;lt;code&amp;gt;select()&amp;lt;/code&amp;gt; überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion ([[#X_Ready|X_Ready]]) implementieren, welche prüft, ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt, beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
Innerhalb der eigentlichen Lesefunktion (X_Read) werden dann die Daten vom zugehörigen Gerät gelesen, das nötige Protokoll implementiert um die Daten zu interpretieren und Werte in Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
Auch wenn von einem Anwender über einen Get-Befehl Daten aktiv von einem Gerät angefordert werden, sollte nicht blockierend gewartet werden. Eine asynchrone Ausgabe, sobald das Ergebnis vorliegt, ist über [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] möglich. Siehe {{Link2Forum|Topic=43771|Message=357870|LinkText=Beschreibung}} und {{Link2Forum|Topic=43771|Message=360935|LinkText=Beispiel}}. Weitere Anwendungsbeispiele finden sich im  {{Link2Forum|Topic=43052|Message=353477|LinkText=PLEX Modul}} und im überarbeiteten und nicht-blockierenden {{Link2Forum|Topic=42771|Message=348498|LinkText=SYSSTAT Modul}}.&lt;br /&gt;
&lt;br /&gt;
== Wichtige globale Variablen aus fhem.pl ==&lt;br /&gt;
&lt;br /&gt;
FHEM arbeitet mit einer Vielzahl an internen Variablen. Die nun folgenden aufgelisteten Variablen sind die wichtigsten, welche man im Rahmen der Modulprogrammierung kennen sollte:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Variable !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; || Dient der Erkennung für fhem.pl sowie den Modulen, ob FHEM den Initialisierungsvorgang abgeschlossen hat. Beim Starten von FHEM ist &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; gleich &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Erst, wenn das Einlesen der Konfiguration, sowie des State-Files (Readings) abgeschlossen ist, wird &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
Das gleiche Verfahren wird auch bei dem Befehl &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; angewandt. Während &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; ausgeführt wird (Konfiguration löschen, neu einlesen), ist &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; gleich &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dies ist insbesondere in der [[#X_Define|Define]]-Funktion eines Moduls relevant. Durch eine Prüfung auf &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; kann man erkennen, ob eine Definition von Hand (&amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; = 1) oder im Rahmen der Initialisierung (FHEM Start / Rereadcfg =&amp;gt; &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; = 0) erfolgte. Während der Initialisierung stehen bspw. die gesetzten Attribute der Definition noch nicht zur Verfügung und können daher nicht ausgewertet werden (siehe . &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; || In &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; werden sämtliche gesetzten Attribute aller Geräte gespeichert. Diese Datenstruktur wird generell durch den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl verwaltet. Hierbei wird einem Gerätenamen eine Mehrzahl an Attributnamen mit einem Wert zugeordnet. Attribut-Inhalte können über die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] ausgelesen werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; || In &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; wird jedem in FHEM existierendem Befehl die entsprechende Funktion zugewiesen, welche diesen Befehl umsetzt. Module können durch das Eintragen eines Befehlsnamen samt Funktion in &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; über die [[#X_Initialize|Initialize]]-Funktion eines Moduls einen (oder mehrere) eigene Befehle in FHEM registrieren.&lt;br /&gt;
&lt;br /&gt;
Die Struktur ist dabei wiefolgt:&lt;br /&gt;
&lt;br /&gt;
  $cmds{&#039;&#039;&amp;amp;lt;Befehlsname&amp;amp;gt;&#039;&#039;} = {  Fn  =&amp;gt; &amp;quot;&#039;&#039;&amp;amp;lt;Funktionsname&amp;amp;gt;&#039;&#039;&amp;quot;,&lt;br /&gt;
                            Hlp =&amp;gt; &amp;quot;&#039;&#039;&amp;amp;lt;Aufrufsyntax&amp;amp;gt;&#039;&#039;&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt;|| Der eigentliche Zweck von &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt; ist dem Nutzer eine Möglichkeit zum Speichern von temporären Daten im globalen Kontext zu ermöglichen. Einige Module verwenden &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt; jedoch auch um modul- &amp;amp; geräteübergreifend Daten auszutauschen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; werden sämtliche Gerätedefinitionen, bzw. die Hash-Referenzen auf diese, gespeichert. Hier ist jedem Gerätenamen eine Hash-Referenz zugeordnet.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt; sind alle geladenen Module gelistet mit ihren entsprechenden Initialisierungsdaten (Funktionsnamen, Attribut-Listen, spezielle Einstellungen, ...). Hier wird für jeden Modulname der Modul-Hash aus der [[#X_Initialize|Initialize]]-Funktion gespeichert. &lt;br /&gt;
Desweiteren legen viele Module, welche nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] hier eine Rückwärtszuordnung von Geräteadressen zu Geräte-Hash an.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; sind alle zu prüfenden Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte regelmäßig über eine Aufruf der entsprechenden [[#X_Ready|Ready]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt; sind alle geöffneten Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte, ob der geöffnete Filedeskriptor unter &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt; Daten zum Lesen bereitgestellt hat. Ist dass der Fall, wird die entsprechende [[#X_Read|Read]]-Funktion aufgerufen, um anstehende Daten durch das Modul zu verarbeiten.&lt;br /&gt;
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt durchaus viele weitere globale Variablen, die jedoch für sehr spezielle Anwendungsfälle und z.T. nur einzelne Module gedacht sind und daher hier nicht aufgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Daten, die ein Modul im Geräte-Hash speichert nennt man Internals. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese &amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt; für den Gerätenamen, welcher beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Diese Daten spielen für FHEM eine sehr wichtige Rolle, da sämtliche gerätespezifischen Daten als Internal im Gerätehash gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Falls Werte wie z.B. ein Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollten, ist eine alternative Möglichkeit die Speicherung in so genannten Attributen. Dann würde man den Define-Befehl so implementieren, dass er kein Intervall übergeben bekommt und statt dessen das Interval als Attribut über den Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
Generell werden alle Werte, welche direkt in der ersten Ebene von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; (Gerätehash) gespeichert werden auf der Detail-Seite einer Definition in der FHEMWEB Oberfläche angezeigt. Es gibt jedoch Ausnahmen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{URL}&amp;lt;/code&amp;gt; - Alle Elemente, welche als Unterelement wieder einen Hash besitzen werden nicht in FHEMWEB dargestellt. Typischerweise speichern Module Daten unter &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}&amp;lt;/code&amp;gt; interne Daten zwischen, die für den User nicht relevant sind, sondern nur der internen Verarbeitung dienen.&lt;br /&gt;
* &amp;lt;code&amp;gt;$hash-&amp;gt;{&#039;&#039;&#039;.&#039;&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;ELEMENT&amp;lt;/font&amp;gt;}&amp;lt;/code&amp;gt; - Alle Knoten, welche mit einem Punkt beginnen werden in der FHEMWEB Oberfläche nicht angezeigt. Man kann diese Daten jedoch beim Aufruf des [[List|list-Kommandos]] einsehen.&lt;br /&gt;
&lt;br /&gt;
Es gibt bereits vorbelegte Internals welche in FHEM dazu dienen definitionsbezogene Informationen wie bspw. Namen und Readings zu speichern. Dies sind im besonderen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 13em;&amp;quot; | Internal !!  Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt;  || Der Definitionsname, mit dem das Gerät angelegt wurde.  &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}&amp;lt;/code&amp;gt;  || Enthält alle aktuell vorhandenen Readings. Daten unterhalb dieses Knotens sollte man nicht direkt manipulieren. Um Readings zu Erzeugen gibt es entsprechende [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NR}&amp;lt;/code&amp;gt;  || Die Positions-Nr. der Definition innerhalb der Konfiguration. Diese dient dazu die Konfiguration in der gleichen Reihenfolge zu speichern, wie die einzelnen Geräte angelegt wurden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt;  || Der Modulname, mit welchem die Definition angelegt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{DEF}&amp;lt;/code&amp;gt;  || Sämtliche Argumente, welche beim &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl nach dem Modulnamen übergeben wurden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{CFGFN}&amp;lt;/code&amp;gt;  || Der Dateiname der Konfigurationsdatei in der diese Definition enthalten ist (sofern nicht in fhem.cfg). Dieser Wert ist nur gefüllt, wenn man mit mehreren Konfigurationsdateien arbeitet, welche dann in fhem.cfg via include-Befehl eingebunden werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt;  || Sofern das Modul Events via [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] verarbeitet enthält jede Definition eine Notify-Order als Zeichenkette bestehend aus dem Notify Order Prefix und dem Definitionsnamen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt &amp;quot;Reihenfolge für den Aufruf der Notify-Funktion beeinflussen&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt;  || Sofern das Modul Events via NotifyFn verarbeitet kann man damit die Definitionen, von denen man Events erhalten will begrenzen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt &amp;quot;Begrenzung der Aufrufe auf bestimmte Geräte&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt;  || Hier wird das zugeordnete IO-Gerät durch [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] gespeichert, welches für den Datentransport und -empfang dieses logischen Gerätes zuständig ist. Dieser Wert existiert nur bei Modulen die nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] arbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt;  || Hier werden alle Events kurzzeitig gesammelt, welche für die Eventverarbeitung anstehen. Insbesondere die [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] speichern hier alle Events zwischen um sie nach Abschluss via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] zu verarbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt;  || Wenn die Definition eine Netzwerkverbindung oder serielle Schnittstelle geöffnet hat (z.B. via [[DevIo]]), so wird der entsprechende File-Deskriptor in diesem Internal gespeichert. Damit kann FHEM alle geöffneten Filedeskriptoren der entsprechenden Definition zuordnen um bei ankommenden Daten die Definition via [[DevelopmentModuleIntro#X_Read|Read-Funktion]] damit zu versorgen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt;  || Ähnlich wie &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt;. Sofern die Definition in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; eingetragen ist und ein Fildeskriptor in diesem Internal gesetzt ist, wird bei einer auftretenden Exception bzw. Interrupt die [[DevelopmentModuleIntro#X_Except|Except]]-Funktion des entsprechenden Moduls aufgerufen um darauf zu reagieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Generell sollte man die meisten der hier genannten systemweiten Internals nicht modifizieren, da ansonsten die korrekte Funktionsweise von FHEM nicht mehr garantiert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Daten, welche von einem Gerät gelesen werden und in FHEM in einer für Menschen verständlichen Form zur Verfügung gestellt werden können, werden Readings genannt. Sie geben den Status des Gerätes wieder und erzeugen Events innerhalb von FHEM auf die andere Geräte reagieren können. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}{temperature}{VAL}&amp;lt;/code&amp;gt; für die Temperatur eines Fühlers&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}{temperature}{TIME}&amp;lt;/code&amp;gt; für den Zeitstempel der Messung&lt;br /&gt;
&lt;br /&gt;
Für den lesenden Zugriff auf Readings steht die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#ReadingsVal|ReadingsVal()]]&amp;lt;/code&amp;gt; zur Verfügung. Ein direkter Zugriff auf die Datenstruktur sollte nicht vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Readings werden im Statefile von FHEM automatisch auf der Festplatte zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen. Dadurch ist der letzte Status eines Gerätes vor einem Neustart nachvollziehbar.&lt;br /&gt;
&lt;br /&gt;
Readings, die mit einem Punkt im Namen beginnen, haben eine funktionale Besonderheit. Sie werden im FHEMWEB nicht angezeigt und können somit als &amp;quot;Permanentspeicher&amp;quot; für kleinere Daten innerhalb des Moduls genutzt werden. Um größere Datenmengen permanent zu speichern sollte man jedoch die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#setKeyValue|setKeyValue()]]&amp;lt;/code&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
Zum Setzen von Readings sollen &lt;br /&gt;
*bei Gruppen von Readings der Funktionsblock &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]&amp;lt;/code&amp;gt; (mehrfach wiederholt), &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*bei einzelnen Updates die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]&amp;lt;/code&amp;gt; &lt;br /&gt;
aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht. Events erzeugen, je nach Hardwareperformance, spürbare Last auf dem System (siehe [[DevelopmentModuleIntro#X_Notify|NotifyFn]]), das Ändern von Readings ohne dass dabei Events erzeugt werden jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Eine Sequenz zum Setzen von Readings könnte folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
readingsBulkUpdate($hash, $readingName1, $wert1 );&lt;br /&gt;
readingsBulkUpdate($hash, $readingName2, $wert2 );&lt;br /&gt;
readingsEndUpdate($hash, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Readings zu löschen, wird für die Modulprogrammierung die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsDelete|readingsDelete()]]&amp;lt;/code&amp;gt; empfohlen. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsDelete($hash, $readingsname) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Hinweis|&#039;&#039;&#039;Hintergrundinfo dazu aus dem Forum:&#039;&#039;&#039; {{Link2Forum|Topic=83069|Message=753066}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CommandDeleteReading()&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;deletereading&amp;lt;/code&amp;gt; ist eher fuer den Endbenutzer und seine userReadings gedacht, und macht bei den Modulen die unnoetige Schleife ueber [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wenn der Modulautor beim Aufruf auch &amp;lt;code&amp;gt;$cl&amp;lt;/code&amp;gt; weitergibt, und der Anwender meint, dieses Geraet auf blacklist setzen zu muessen, dann kann das Modul sein eigenes Reading nicht entfernen, und das ist kontraproduktiv.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
FHEM verfügt über einen Event-Mechanismus um Änderungen verschiedenster Art an einzelne oder alle Definitionen mitzuteilen. Jedes Modul (und damit alle Definitionen dieses Moduls) können auf Events von FHEM selber (Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;) oder von anderen Definitionen reagieren und dadurch selber aktiv werden. Ein Event wird innerhalb von FHEM als Zeichenkette behandelt.&lt;br /&gt;
&lt;br /&gt;
Events sind grundsätzlich immer definitionsbezogen. Das bedeutet, dass ein Event immer in Verbindung mit einem Definitionsnamen erzeugt wird. Jede Definition, welche ein Event verarbeitet, erhält den Definitions-Hash (&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) der auslösenden Definition.&lt;br /&gt;
&lt;br /&gt;
Events werden typischerweise bei der Erstellung von Readings implizit für jedes einzelne Reading erzeugt. Es gibt jedoch auch Events die nichts mit Readings zu tun haben um anderweitige Änderungen bekannt zu geben.&lt;br /&gt;
&lt;br /&gt;
Eigene Events können in FHEM mit der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] erzeugt werden. Um auf Events in einem Modul reagieren zu können, muss eine [[#X_Notify|Notify]]-Funktion implementiert sein. Sobald ein oder mehrere Events für eine Definition getriggert werden, prüft FHEM, welche Definitionen über Events der auslösenden Definition informiert werden möchten. Diese werden dann nacheinander in einer bestimmten Reihenfolge durch Aufruf der [[#X_Notify|Notify]]-Funktion über anstehende Events in Kenntnis gesetzt. Es obliegt dann dem jeweiligen Modul, wie es auf die Events reagiert.&lt;br /&gt;
&lt;br /&gt;
=== globale Events ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;globale Events&amp;quot; werden alle Events bezeichnet, die durch die Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; erzeugt werden. Es handelt sich hierbei um Events die Strukturänderungen in der Konfiguration, als auch systemweite Ereignisse zu FHEM selbst signalisieren.&lt;br /&gt;
&lt;br /&gt;
Hier eine kurze Zusammenfassung, welche Events durch &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; getriggert werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Allgemeine Events:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event-Text !! Beschreibung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;INITIALIZED&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Start von FHEM ist abgeschlossen. Sämtliche Definitionen und Attribute wurden aus der Konfiguration (fhem.cfg oder configDB) eingelesen, sowie sämtliche Readings sind aus dem State-File eingelesen und stehen nun voll umfänglich zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;REREADCFG&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Konfiguration wurde erneut eingelesen. Dies bedeutet, es wurden alle Definitionen/Attribute/Readings aus FHEM entfernt und durch Einlesen der Konfiguration neu angelegt. (FHEM-Befehl: &amp;quot;rereadcfg&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;SAVE&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die laufende Konfiguration soll gespeichert werden (in fhem.cfg oder configDB). Dieses Event wird &#039;&#039;&#039;VOR&#039;&#039;&#039; dem Speichern der Konfiguration getriggert. Sobald der Trigger verarbeitet wurde, beginnt das Speichern der Konfiguration. (FHEM-Befehl: &amp;quot;save&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;SHUTDOWN&amp;lt;/code&amp;gt;&#039;&#039;&#039; || FHEM wird sich beenden. (FHEM-Befehl: &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt; DELAYEDSHUTDOWN &amp;lt;/code&amp;gt;&#039;&#039;&#039; || FHEM wird sich beenden. (FHEM-Befehl: &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde ein Update erfolgreich installiert. (FHEM-Befehl: &amp;quot;update&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Definitionsbezogene Events:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event-Text !! Beschreibung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;DEFINED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde eine neue Definition mit Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; angelegt. (FHEM-Befehl: &amp;quot;define&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;DELETED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde gelöscht. (FHEM-Befehl: &amp;quot;delete&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;RENAMED &#039;&#039;&amp;lt;Alt&amp;gt;&#039;&#039; &#039;&#039;&amp;lt;Neu&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Alt&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde in den Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Neu&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; umbenannt. (FHEM-Befehl: &amp;quot;rename&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;MODIFIED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde modifiziert. (FHEM-Befehl: &amp;quot;modify&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;UNDEFINED &#039;&#039;&amp;lt;Name&amp;gt; &amp;lt;Modul&amp;gt; &amp;lt;Define-Parameter&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde eine Nachricht von einem physikalischen Modul (siehe [[#Zweistufiges Modell für Module|zweistufiges Modulkonzept]]) erhalten, für die keine passende logische Definition in FHEM existiert. Details dazu, siehe dazu Abschnitt [[#Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)|Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Begrenzung von Events ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul, welches Events verarbeitet, kann die Eventverarbeitung auf bestimmte Definitionen begrenzen. Dadurch werden nur Events an das Modul gemeldet (via [[#X_Notify|X_Notify()]]), welche von einer oder mehreren bestimmten Definitionen getriggert wurden. Dadurch werden unnötige Events nicht an das Modul gemeldet und schont somit Ressourcen.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig werden sämtliche Events ohne Begrenzung an ein Modul gemeldet, welches eine [[#X_Notify|Notify]]-Funktion implementiert hat und somit Events verarbeiten kann. Details zur Begrenzung von Events findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].&lt;br /&gt;
&lt;br /&gt;
=== Reihenfolge der Eventverarbeitung ===&lt;br /&gt;
&lt;br /&gt;
Ein getriggertes Event wird nacheinander gegen jede Definition geprüft, deren Modul eine [[#X_Notify|Notify]]-Funktion implementiert hat. Dies bedeutet, jede Definition wird nacheinander durch Aufruf der [[#X_Notify|Notify]]-Funktion mit dem Definitionshash der auslösenden Definition aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Unter bestimmten Umständen kann es erforderlich sein, in diese Reihenfolge einzugreifen. Beispielsweise wenn das eigene Modul und deren Definitionen das Event als letztes oder erstes verarbeiten müssen. Ein Beispiel bietet hierbei das Modul [[dewpoint]], welches Events vor allen anderen Modulen verarbeiten muss.&lt;br /&gt;
&lt;br /&gt;
Details, wie man die Reihenfolge der Eventverarbeitung steuern kann, findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Damit der Nutzer das Verhalten einer einzelnen Gerätedefinition zur Laufzeit individuell anpassen kann, gibt es in FHEM für jede Definition sogenannte Attribute, welche mit dem Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; gesetzt werden können.&lt;br /&gt;
Diese stehen dann dem Modul unmittelbar zur Verfügung um das Verhalten während der Ausführung zu beeinflussen. Attribute werden zusammen mit dem &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl der jeweiligen Definition beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben. Beim Neustart werden die entsprechenden Befehle ausgeführt um alle Definition inkl. Attribute wieder anzulegen. Zur Laufzeit werden Attribute in dem globalen Hash &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; mit dem Definitionsnamen als Index (&amp;lt;code&amp;gt;$attr{$name} = $value&amp;lt;/code&amp;gt;) gespeichert. Ein Attribut mit dem Namen &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; würde beispielsweise mit &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; adressiert. Generell sollte &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; nicht durch direkten Zugriff manipuliert/benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen von Attributen sollte die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Welche Attribute ein Modul unterstützt muss in der Funktion &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]&amp;lt;/code&amp;gt; durch Setzen von &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; bekannt gemacht werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Wenn beim Setzen von Attributen in einer Gerätedefinition entsprechende Werte geprüft werden sollen oder zusätzliche Funktionalitäten implementiert werden müssen, dann muss dies in der Funktion &amp;lt;code&amp;gt;[[#X_Attr|X_Attr]]&amp;lt;/code&amp;gt; (siehe unten) implementiert werden. Hier kann man bspw. einen Syntaxcheck für Attribut-Werte implementieren um ungültige Werte zurückzuweisen.&lt;br /&gt;
&lt;br /&gt;
== Modulfunktionen ==&lt;br /&gt;
&lt;br /&gt;
Damit fhem.pl ein Modul nutzen kann, muss dieses entsprechende Funktionen mit einer vorgegebenen Aufrufsyntax implementieren. Durch die Bekanntgabe dieser modulspezifischen Funktionen können Daten zwischen fhem.pl und einem Modul entsprechend ausgetauscht werden. Es gibt verschiedene Arten von Funktionen die ein Modul anbieten muss bzw. kann, je nach Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
=== Die wichtigsten Funktionen in einem Modul ===&lt;br /&gt;
&lt;br /&gt;
Folgende Funktion muss ein Modul mit dem beispielhaften Namen &amp;quot;X&amp;quot; mindestens bereitstellen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
|  [[#X_Initialize|X_Initialize]] || Initialisiert das Modul und gibt den Namen zusätzlicher Modulfunktionen bekannt, sowie modulspezifische Einstellungen. Wird direkt nach dem erfolgreichen Laden des Moduls durch fhem.pl aufgerufen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Funktionen sind die wichtigsten Funktionen, welche je nach Anwendungsfall zu implementieren sind. Es handelt sich hierbei um die wichtigsten Vertreter, welche in den meisten Modulen Verwendung finden. Nicht alle Funktionen machen jedoch in jedem Modul Sinn. Generell sollte auch hier bei jeder Funktion der Modulname vorangestellt werden um ein einheitliches Namensschema zu gewährleisten. Hier die wichtigsten Modulfunktionen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Define|X_Define]] || Wird im Rahmen des &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehls aufgerufen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Undef|X_Undef]] || Wird im Rahmen des &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;-Befehls, sowie &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;-Befehl aufgerufen. Dient zum Abbau von offenen Verbindungen, Timern, etc.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Delete|X_Delete]] || Wird im Rahmen des beim &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;-Befehls aufgerufen wenn das Gerät endgültig gelöscht wird um weiterführende Aktionen vor dem Löschen durchzuführen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Get|X_Get]] || Wird im Rahmen des &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Befehls aufgerufen um Daten vom Gerät abzufragen&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Set|X_Set]]  || Wird im Rahmen des &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;-Befehls aufgerufen um Daten an das Gerät zu senden.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Attr|X_Attr]]  || Wird im Rahmen des &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls aufgerufen um Attributwerte zu prüfen)&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Read|X_Read]]  || Wird durch FHEM aufgerufen, wenn ein gelisteter Filedeskriptor in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; Daten zum Lesen bereitstellt.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Ready|X_Ready]]  || Wird unter Windows durch FHEM aufgerufen um zyklisch einen seriellen Filedeskriptor auf lesbare Daten zu prüfen. Unter Linux dient diese Funktion dem Wiederaufbau verlorener Verbindungen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Notify|X_Notify]]  || Verarbeitet Events von anderen Geräten innerhalb von FHEM&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Rename|X_Rename]] || Wird aufgerufen, wenn ein Gerät umbenannt wird.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Shutdown|X_Shutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_DelayedShutdown | X_DelayedShutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; im Namen muss dabei auf den Namen des Moduls bzw. des definierten Gerätetyps geändert werden. Im Modul mit der Datei &amp;lt;code&amp;gt;36_JeeLink.pm&amp;lt;/code&amp;gt; beispielsweise ist der Name der Funktion &amp;lt;code&amp;gt;JeeLink_Initialize&amp;lt;/code&amp;gt;. Die Funktion wird von fhem.pl nach dem Laden des Moduls aufgerufen und bekommt eine leere Hashreferenz für den Initialisierungsvorgang übergeben. &lt;br /&gt;
&lt;br /&gt;
Dieser Hash muss nun von X_Initialize mit allen modulrelevanten Funktionsnamen gefüllt werden. Anschließend wird dieser Hash durch fhem.pl im globalen Hash &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt; gespeichert. &amp;lt;code&amp;gt;$modules{ModulName}&amp;lt;/code&amp;gt; wäre dabei der Hash für das Modul mit dem Namen &amp;lt;code&amp;gt;ModulName&amp;lt;/code&amp;gt;. Es handelt sich also nicht um den oben beschriebenen Hash der Geräteinstanzen sondern einen Hash, der für jedes Modul existiert und modulspezifische Daten wie bspw. die implementierten Modulfunktionen enthält. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DefFn}                = &amp;quot;X_Define&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{UndefFn}              = &amp;quot;X_Undef&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{DeleteFn}             = &amp;quot;X_Delete&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{SetFn}                = &amp;quot;X_Set&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{GetFn}                = &amp;quot;X_Get&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AttrFn}               = &amp;quot;X_Attr&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ReadFn}               = &amp;quot;X_Read&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ReadyFn}              = &amp;quot;X_Ready&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NotifyFn}             = &amp;quot;X_Notify&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{RenameFn}             = &amp;quot;X_Rename&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ShutdownFn}           = &amp;quot;X_Shutdown&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{DelayedShutdownFn}    = &amp;quot;X_ DelayedShutdown&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine entsprechende Funktion in FHEM bekannt zu machen muss dazu der Funktionsname, wie er im Modul als &amp;lt;code&amp;gt;sub &amp;amp;lt;&#039;&#039;Funktionsname&#039;&#039;&amp;amp;gt;() { ... }&amp;lt;/code&amp;gt; definiert ist, als Zeichenkette in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; gesetzt werden. Dabei sollten die entsprechenden Funktionsnamen immer den Modulnamen (in diesem Beispiel &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;) als Präfix verwenden.&lt;br /&gt;
Auf diese Weise können sämtliche modulspezifisch implementierten Funktionen wie &amp;lt;code&amp;gt;X_Read&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X_Parse&amp;lt;/code&amp;gt; etc. durch Zuweisung an &amp;lt;code&amp;gt;$hash-&amp;gt;{ReadFn}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;$hash-&amp;gt;{ParseFn}&amp;lt;/code&amp;gt; usw. bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sollten die vom Modul unterstützten Attribute definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{AttrList} =&lt;br /&gt;
  &amp;quot;do_not_notify:1,0 &amp;quot; . &lt;br /&gt;
  &amp;quot;header &amp;quot; .&lt;br /&gt;
  $readingFnAttributes;  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Auflistung aller unterstützten modulspezifischen Attribute erfolgt in Form einer durch Leerzeichen getrennten Liste in &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt;. Es gibt in FHEM globale Attribute, die in allen Gerätedefinitionen verfügbar sind und nur modulspezifische Attribute die jedes Modul via &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; über die eigene Initialize-Funktion setzt.  In fhem.pl werden dann die entsprechenden Attributwerte beim Aufruf eines &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls in die globale Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt;, z.B. &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; für das Attribut &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; gespeichert. Falls im Modul weitere Aktionen oder Prüfungen beim Setzen eines Attributs nötig sind, dann kann wie im Beispiel oben die [[#X_Attr|Attr]]-Funktion implementiert und in der Initialize-Funktion bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$readingFnAttributes&amp;lt;/code&amp;gt;, die im obigen Beispiel an die Liste der unterstützten Attribute angefügt wird, definiert Attributnamen, die dann zusätzlich gemacht werden, wenn das Modul zum Setzen von Readings die Funktionen &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]&amp;lt;/code&amp;gt; verwendet. In diesen Funktionen werden Attribute wie &amp;lt;code&amp;gt;event-min-interval&amp;lt;/code&amp;gt; oder auch &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; ausgewertet. Für Details hierzu siehe commandref zu {{Link2CmdRef|Anker=readingFnAttributes|Label=readingFnAttributes}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt; [[DevelopmentModuleAPI#parseParams|parseParams()]]&amp;lt;/code&amp;gt; unterstützt Modul-Autoren beim Parsen von Übergabeparametern, welche bei &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; Kommandos an die entsprechenden Modulfunktionen übergeben werden. Dadurch lassen sich auf einfache Weise insbesondere komplexe Parameter (wie bspw. Perl-Ausdrücke) sehr einfach parsen.&lt;br /&gt;
&lt;br /&gt;
Diese Zusatzfunktion kann man in der Initialize-Funktion einfach über folgenden Parameter für [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion modulweit aktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sobald es gesetzt ist wird automatisch durch fhem.pl &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#parseParams|parseParams()]]&amp;lt;/code&amp;gt; aufgerufen und die an die [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion übergebenen Parameter ändern sich wie weiter unten in den jeweiligen Funktionen beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Define-Funktion eines Moduls wird von FHEM aufgerufen wenn der Define-Befehl für ein Geräte ausgeführt wird und das Modul bereits geladen und mit der Initialize-Funktion initialisiert ist. Sie ist typischerweise dazu da, die übergebenen Parameter zu prüfen und an geeigneter Stelle zu speichern sowie einen Kommunikationsweg zum Gerät zu öffnen (z.B. TCP-Verbindung, USB-Schnittstelle o.ä.) oder einen [[#Pollen_von_Geräten|Status-Timer]] zu starten.&lt;br /&gt;
Sie beginnt typischerweise mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	my @a = split( &amp;quot;[ \t][ \t]*&amp;quot;, $def );&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den die im &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl übergebenen Parameter. Welche bzw. wie viele Parameter &lt;br /&gt;
akzeptiert werden und welcher Syntax diese entsprechen müssen ist Sache dieser Funktion. Im obigen Beispiel wird die Argumentzeile &amp;lt;code&amp;gt;$def&amp;lt;/code&amp;gt; in ein Array aufgeteilt (durch Leerzeichen/Tabulator getrennt) und so können die vom Modul bzw. der Define-Funktion erwarteten Werte über das Array der Reihe nach verarbeitet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $name   = $a[0];&lt;br /&gt;
my $module = $a[1];&lt;br /&gt;
my $url    = $a[2];&lt;br /&gt;
my $inter  = 300;&lt;br /&gt;
&lt;br /&gt;
if(int(@a) == 4) { &lt;br /&gt;
	$inter = $a[3]; &lt;br /&gt;
	if ($inter &amp;lt; 5) {&lt;br /&gt;
		return &amp;quot;interval too small, please use something &amp;gt; 5s, default is 300 seconds&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit die übergebenen Werte auch anderen Funktionen zur Verfügung stehen und an die jeweilige Geräteinstanz gebunden sind, werden die Werte typischerweise als Internals im Hash der Geräteinstanz gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{url} 		= $url;&lt;br /&gt;
$hash-&amp;gt;{Interval}	= $inter;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald alle Parameter korrekt verarbeitet wurden, wird in der Regel die erste Verbindung zum Gerät aufgebaut. Je nach Art des Geräts kann das eine permanente Datenverbindung sein (z.B. serielle Schnittstelle oder TCP-Verbindung) oder das Starten eines regelmäßigen Timers, der zyklisch den Status z.B. via [[HttpUtils|HTTP]] ausliest.&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Define-Funktion Syntax-Probleme der Übergabeparameter festgestellt werden oder es kann bspw. keine Verbindung aufgebaut werden, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn alle Übergabeparameter akzeptiert werden, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Sobald eine Define-Funktion eine Fehlermeldung zurückmeldet, wird der define-Befehl durch FHEM zurückgewiesen und der User erhält die Fehlermeldung, welche die Define-Funktion produziert hat, als Ausgabe zurück.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;u&amp;gt;Verfügbarkeit von Attributen&amp;lt;/u&amp;gt; =====&lt;br /&gt;
Während die Define-Funktion ausgeführt wird, sollte man nicht davon ausgehen, dass alle vom Nutzer konfigurierten Attribute via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verfügbar sind. Attribute stehen in der Define-Funktion nur dann zur Verfügung, wenn FHEM sich nicht in der Initialisierungsphase befindet (globale Variable &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; ist wahr; der Nutzer hat die Gerätedefinition modifiziert). Daher sollte man weiterführende Funktion, welche auf gesetzte Attribute angewiesen sind, nur dann in der Define-Funktion starten, wenn &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; zutrifft.&lt;br /&gt;
&lt;br /&gt;
Andernfalls sollte man den Aufruf in der Notify-Funktion durchführen sobald &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt; getriggert wurde:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	X_FunctionWhoNeedsAttr($hash) if($init_done);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
	my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
	my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
 &lt;br /&gt;
	return &amp;quot;&amp;quot; if(IsDisabled($ownName)); # Return without any further action if the module is disabled&lt;br /&gt;
 &lt;br /&gt;
	my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
	my $events = deviceEvents($dev_hash, 1);&lt;br /&gt;
&lt;br /&gt;
	if($devName eq &amp;quot;global&amp;quot; &amp;amp;&amp;amp; grep(m/^INITIALIZED|REREADCFG$/, @{$events}))&lt;br /&gt;
	{&lt;br /&gt;
		 X_FunctionWhoNeedsAttr($hash);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die Modulfunktion X_FunctionWhoNeedsAttr() nach dem Start erst aufgerufen, wenn alle Attribute aus der Konfiguration geladen wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Aufteilen und Parsen von &amp;lt;code&amp;gt;$def&amp;lt;/code&amp;gt; lässt sich die Funktion [[DevelopmentModuleAPI#parseParams|parseParams()]] verwenden um die einzelnen Argumente einfach zu parsen. Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird parseParams() automatisch aufgerufen und X_Define() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
==== X_Undef ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Undef ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Undef-Funktion wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird oder bei der Abarbeitung des Befehls &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu einliest. Entsprechend müssen in der Funktion typische Aufräumarbeiten durchgeführt werden wie das saubere Schließen von Verbindungen oder das Entfernen von internen Timern, sofern diese im Modul zum Pollen verwendet wurden (siehe Abschnitt [[#Pollen_von_Geräten|Pollen von Geräten]]). &lt;br /&gt;
&lt;br /&gt;
Zugewiesene Variablen im Hash der Geräteinstanz, Internals oder Readings müssen hier nicht gelöscht werden. In fhem.pl werden die entsprechenden Strukturen beim Löschen der Geräteinstanz ohnehin vollständig gelöscht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Undef($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name) = @_;       &lt;br /&gt;
	DevIo_CloseDev($hash);         &lt;br /&gt;
	RemoveInternalTimer($hash);    &lt;br /&gt;
	return undef;                  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Undef-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn die Undef-Funktion erfolgreich durchgeführt wurde, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht bzw. neu angelegt. Sollte die Undef-Funktion jedoch eine Fehlermeldung zurückgeben, wird der entsprechende Vorgang (&amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;) für dieses Gerät abgebrochen. Es bleibt dann unverändert in FHEM bestehen.&lt;br /&gt;
&lt;br /&gt;
==== X_Delete ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Delete ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Delete-Funktion ist das Gegenstück zur Funktion [[#X_Define|X_Define]] und wird aufgerufen wenn ein Gerät mit dem Befehl &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Gerät in FHEM gelöscht wird, wird zuerst die Funktion [[#X_Undef|X_Undef]] aufgerufen um offene Verbindungen zu schließen, anschließend wird die Funktion X_Delete aufgerufen. Diese dient eher zum Aufräumen von dauerhaften Daten, welche durch das Modul evtl. für dieses Gerät spezifisch erstellt worden sind. Es geht hier also eher darum, alle Spuren sowohl im laufenden FHEM-Prozess, als auch dauerhafte Daten bspw. im physikalischen Gerät zu löschen die mit dieser Gerätedefinition zu tun haben.&lt;br /&gt;
&lt;br /&gt;
Dies kann z.B. folgendes sein:&lt;br /&gt;
&lt;br /&gt;
* Löschen von Dateien im Dateisystem die während der Nutzung dieses Geräts angelegt worden sind.&lt;br /&gt;
* Lösen von evtl. Pairings mit dem physikalischen Gerät &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Delete($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name ) = @_;       &lt;br /&gt;
&lt;br /&gt;
	# Löschen von Geräte-assoziiertem Temp-File&lt;br /&gt;
	unlink($attr{global}{modpath}.&amp;quot;/FHEM/FhemUtils/$name.tmp&amp;quot;;)&lt;br /&gt;
&lt;br /&gt;
	return undef;&lt;br /&gt;
}    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Delete-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur die Delete-Funktion erfolgreich durchgeführt wurde, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht. Sollte die Delete-Funktion eine Fehlermeldung zurückgeben, wird der Löschvorgang abgebrochen und das Gerät bleibt weiter in FHEM bestehen.&lt;br /&gt;
&lt;br /&gt;
==== X_Get ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get ($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $opt, @args ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Get-Funktion wird aufgerufen wenn der FHEM-Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; für eine Definition dieses Moduls ausgeführt wird. Mit &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; werden typischerweise Werte von einem Gerät abgefragt. In vielen Modulen wird auf diese Weise auch der Zugriff auf generierte Readings ermöglicht. Der Get-Funktion wird dabei der Definitions-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;, der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;, sowie die Aufrufparameter &amp;lt;code&amp;gt;$opt&amp;lt;/code&amp;gt; plus optional weiterer Parameter &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; übergeben. Als Rückgabewert &amp;lt;code&amp;gt;$result&amp;lt;/code&amp;gt; wird das Ergebnis des entsprechenden Befehls in Form einer Zeichenkette zurückgegeben. Der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; hat hierbei keine besondere Bedeutung und wird behandelt wie eine leere Zeichenkette &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $opt, @args ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;get $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($opt));&lt;br /&gt;
&lt;br /&gt;
	if($opt eq &amp;quot;status&amp;quot;) &lt;br /&gt;
	{&lt;br /&gt;
	   ...&lt;br /&gt;
	}&lt;br /&gt;
	elsif($opt eq &amp;quot;power&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   ...&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of status power [...]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine unbekannte Option an die Get-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Get-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf &amp;lt;code&amp;gt;get &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;&amp;lt;NAME&amp;gt;&#039;&#039;&amp;lt;/font&amp;gt; &amp;lt;u&amp;gt;&#039;&#039;&#039;?&#039;&#039;&#039;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;, welche durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;unknown&#039;&#039;&#039; argument &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Parameter]&amp;lt;/font&amp;gt;&#039;&#039; &#039;&#039;&#039;choose one of&#039;&#039;&#039; &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Liste möglicher Optionen]&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Get-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort &amp;quot;unknown&amp;quot; vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt &amp;quot;choose one of&amp;quot; mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;return &amp;quot;unknown argument $opt choose one of status temperature humidity&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden als mögliche Optionen für einen Get-Befehl folgende Parameter angegeben:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde in folgenden, mögliche Get-Befehle für einen User resultieren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im weiteren Verlauf der Get-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert direkt abfragen und diesen als Return-Wert der Get-Funktion zurückgeben. Vielfach werden aber auch die vorhandenen Readings zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Get() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
==== X_Set ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set ($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
	return ($error, $skip_trigger);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Set-Funktion ist das Gegenteil zur [[#X_Get|Get]]-Funktion. Sie ist dafür gedacht, Daten zum physischen Gerät zu schicken, bzw. entsprechende Aktionen im Gerät selber auszulösen. Ein Set-Befehl dient daher der direkten Steuerung des physikalischen Gerätes in dem es bspw. Zustände verändert (wie &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;). Der Set-Funktion wird dabei der Definitions-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;, der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;, sowie die Aufrufparameter &amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; und optional weitere Argumente &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; übergeben. Als Rückgabewert &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; kann eine Fehlermeldung in Form Zeichenkette zurückgegeben werden. Der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; bedeutet hierbei, dass der Set-Befehl erfolgreich durchgeführt wurde. Eine Set-Funktion gibt daher nur im Fehlerfall eine Rückmeldung mit einer entsprechenden Fehlermeldung. Der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; wird als &amp;quot;erfolgreich&amp;quot; interpretiert. &lt;br /&gt;
&lt;br /&gt;
Standardmäßig wird jeder Set-Befehl, welcher erfolgreich ausgeführt wurde (&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;), als Event getriggert um dies bspw. in einem FileLog festzuhalten. Dieses Verhalten kann optional unterbunden werden indem der optionale zweite Rückgabewert &amp;lt;code&amp;gt;$skip_trigger&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gesetzt wird. Damit wird das Generieren eines Events für das erfolgreich ausgeführte Set-Kommando unterbunden. Falls nicht gesetzt, wird ein Event erzeugt (&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; mit sämtlichen &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Rückmeldungen (Fehler) von set-Befehlen sämtlicher Module, die im Rahmen der Ausführung eines getriggerten [[Notify]] auftreten, werden im FHEM Logfile festgehalten.&lt;br /&gt;
&lt;br /&gt;
Falls nur interne Daten, die ausschließlich für das Modul relevant sind, gesetzt werden müssen, so sollte statt Set die [[#X_Attr|Attr]]-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht, da sie nur zu Steuerungszwecken im laufenden Betrieb von FHEM dienen.&lt;br /&gt;
 &lt;br /&gt;
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch in der Regel weitere zusätzliche Parameter (&amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;) übergeben um Zustände zu setzen/ändern. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;set $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($cmd));&lt;br /&gt;
&lt;br /&gt;
	if($cmd eq &amp;quot;status&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   if($args[0] eq &amp;quot;up&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   elsif($args[0] eq &amp;quot;down&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   else&lt;br /&gt;
	   {&lt;br /&gt;
	      return &amp;quot;Unknown value $args[0] for $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	   }   &lt;br /&gt;
	}&lt;br /&gt;
	elsif($cmd eq &amp;quot;power&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   if($args[0] eq &amp;quot;on&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   elsif($args[0] eq &amp;quot;off&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }  &lt;br /&gt;
	   else&lt;br /&gt;
	   {&lt;br /&gt;
	      return &amp;quot;Unknown value $args[0] for $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	   }       &lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;Unknown argument $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine unbekannte Option an die Set-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Set-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf &amp;lt;code&amp;gt;set &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;&amp;lt;NAME&amp;gt;&#039;&#039;&amp;lt;/font&amp;gt; &amp;lt;u&amp;gt;&#039;&#039;&#039;?&#039;&#039;&#039;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;, welcher durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;unknown&#039;&#039;&#039; argument &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Parameter]&amp;lt;/font&amp;gt;&#039;&#039; &#039;&#039;&#039;choose one of&#039;&#039;&#039; &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Liste möglicher Optionen]&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Set-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort &amp;quot;unknown&amp;quot; vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt &amp;quot;choose one of&amp;quot; mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;return &amp;quot;unknown argument $cmd choose one of status power&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden als mögliche Optionen für einen Set-Befehl folgende Parameter angegeben:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;power&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde in folgenden, mögliche Set-Befehle für einen User resultieren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; power&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von SetExtensions.pm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dem Nutzer zusätzlich zu den Set-Befehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; auch weiterführende Befehle wie &amp;lt;code&amp;gt;on-for-timer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;on-till&amp;lt;/code&amp;gt;, usw. anbieten möchte, obwohl die zu steuernde Hardware solche Kommandos nicht unterstützt, kann man dies über das Hilfsmodul SetExtensions.pm realisieren.&lt;br /&gt;
&lt;br /&gt;
Das Hilfsmodul SetExtensions.pm bietet weiterführende Set-Kommandos basierend auf den Befehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; an. Dabei werden durch interne Timer bzw. eigens angelegten [[at]]-Definitionen diese Befehle durch FHEM selber umgesetzt. Je nach ausgeführtem Befehl wird der &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;- bzw. &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl dann durch FHEM zum richtigen Zeitpunkt ausgeführt. Vorausgesetzt das Modul unterstützt in der Set-Funktion die Befehle &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;, so werden durch den Einsatz von SetExtensions.pm folgende Befehle zusätzlich unterstützt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Set-Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-for-timer &#039;&#039;&amp;amp;lt;Dauer&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-for-timer 120&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-Befehl ein und nach der angegebenen Dauer in Sekunden via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-for-timer &#039;&#039;&amp;amp;lt;Dauer&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-for-timer 120&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl aus und nach der angegebenen Dauer in Sekunden via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; wieder ein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till 16:30&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-Befehl ein und zum angegebenen Zeitpunkt via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till 16:30&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl aus und zum angegebenen Zeitpunkt via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; wieder ein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till-overnight &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till-overnight 01:00&amp;lt;/code&amp;gt; || Ähnlich wie &amp;lt;code&amp;gt;on-till&amp;lt;/code&amp;gt;. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till-overnight &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till-overnight 01:00&amp;lt;/code&amp;gt; || Ähnlich wie &amp;lt;code&amp;gt;off-till&amp;lt;/code&amp;gt;. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;blink &#039;&#039;&amp;amp;lt;Anzahl&amp;amp;gt; &amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;blink 3 1&amp;lt;/code&amp;gt; || Schaltet das Gerät via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; für &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; Sekunden ein und anschließend via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus. Nach &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; Sekunden wird das ganze wiederholt, solange bis die angegebene Anzahl erreicht ist.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;intervals &#039;&#039;&amp;amp;lt;Start&amp;amp;gt;-&amp;amp;lt;Ende&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Start&amp;amp;gt;-&amp;amp;lt;Ende&amp;amp;gt;&#039;&#039; ...&amp;lt;/code&amp;gt; || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;intervals 07:00-08:00 16:30-18:00&amp;lt;/code&amp;gt; || Schaltet das Gerät innerhalb der übergebenen Zeiträumen via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; ein. Sobald die aktuelle Zeit ausserhalb dieser Zeiträume liegt, wird das Gerät via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder ausgeschaltet. Es können dabei beliebig viele Zeiträume angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt;  || Sofern der aktuelle Status &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; ist, wird das Gerät via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; ausgeschaltet. Andernfalls wird es via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; eingeschaltet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine kurze Beschreibung zu den möglichen Befehlen durch SetExtensions.pm gibt es auch in der commandref zum {{Link2CmdRef|Anker=set|Label=set-Befehl}}.&lt;br /&gt;
&lt;br /&gt;
Um SetExtensions.pm in der Set-Funktion nutzen zu können müssen folgende Aktionen durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
# Laden von SetExtensions.pm via &amp;lt;code&amp;gt;use SetExtensions;&amp;lt;/code&amp;gt; am Anfang des Moduls&lt;br /&gt;
# Aufruf und Rückgabe der Funktion [[DevelopmentModuleAPI#SetExtensions|SetExtensions()]] sofern die Set-Funktion mit dem übergebenen Befehl nichts anfangen kann.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use SetExtensions;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
	my $cmdList = &amp;quot;on off&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;set $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($cmd));&lt;br /&gt;
&lt;br /&gt;
	if($cmd eq &amp;quot;on&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		# Gerät einschalten...&lt;br /&gt;
	}&lt;br /&gt;
	elsif($cmd eq &amp;quot;off&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		# Gerät ausschalten...&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else # wenn der übergebene Befehl nicht durch X_Set() verarbeitet werden kann, Weitergabe an SetExtensions()&lt;br /&gt;
	{&lt;br /&gt;
		return SetExtensions($hash, $cmdList, $name, $cmd, @args);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte der übergebene Set-Befehl auch für SetExtensions unbekannt sein (bspw. &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; ?&amp;lt;/code&amp;gt;), so generiert SetExtensions() eine entsprechende Usage-Meldung, welche innerhalb der Set-Funktion an FHEM zurückgegeben werden muss.&lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Beschreibung zu der Funktion SetExtensions() gibt es in der  [[DevelopmentModuleAPI#SetExtensions|API-Referenz]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Set() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von FHEMWEB-Widgets&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das GUI-Modul [[FHEMWEB]] kann für die einzelnen Set-Optionen, die das Modul versteht, automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht der GUI kann der Anwender dann die jeweiligen Werte komfortabel auswählen. Dafür muss die Set-Funktion, wenn sie mit der Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; aufgerufen wird, nicht nur einen Text mit  &amp;lt;code&amp;gt;&amp;quot;Unknown ... choose one of ...&amp;quot;&amp;lt;/code&amp;gt; zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt entsprechende Zusatzinformationen anhängen.&lt;br /&gt;
Meist prüft man in den Modulen gar nicht auf die Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; sondern gibt generell bei unbekannten Optionen diesen Text zurück. Das Modul FHEMWEB ermittelt die Syntax eines Gerätes jedoch immer mit dem Befehl:&lt;br /&gt;
 set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; ?&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
	return &amp;quot;Unknown argument $cmd, choose one of status:up,down power:on,off on:noArg off:noArg&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Kommata getrennte Werte ergeben eine Drop-Down Liste, mit der der User die Werte auswählen kann&lt;br /&gt;
&amp;lt;pre&amp;gt;timer:30,120,300&lt;br /&gt;
mode:verbose,ultra,relaxed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Doppelpunkt zum Kommando angegeben, so wird eine Eingabezeile angezeigt, die die freie Eingabe eines Wertes erlaubt.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch die Eingabe-/Auswahlmöglichkeiten durch Widgets vereinfachen. Dazu gibt man hinter dem Doppelpunkt einen Widgetnamen und widgetspezifische Parameter an. Es existieren mehrere solcher Widgets in FHEMWEB. Die gebräuchlichsten sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zusatz !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;noArg&#039;&#039;&#039; || &amp;lt;code&amp;gt;reset:noArg&amp;lt;/code&amp;gt;|| Es werden keine weiteren Argumente mehr benötigt. In so einem Fall wird bei der Auswahl keine Textbox oder ähnliches angezeigt, da keine weiteren Argumente für diesen Befehl notwendig sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;slider&#039;&#039;&#039;,&amp;lt;min&amp;gt;,&amp;lt;step&amp;gt;,&amp;lt;max&amp;gt; || &amp;lt;code&amp;gt;dim:slider,0,1,100&amp;lt;/code&amp;gt;|| Es wird ein Schieberegler angezeigt um den Parameter auszuwählen. Dabei werden als Zusatzparameter Minimum, Schrittweite und Maximum angegeben.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;colorpicker&#039;&#039;&#039; || &amp;lt;code&amp;gt;rgb:colorpicker,RGB&amp;lt;/code&amp;gt;|| Es wird ein Colorpicker angezeigt, der dem Anwender die Auswahl einer Farbe ermöglicht. Die genaue Parametersyntax kann man dem Artikel zum  [[Color#Colorpicker|Colorpicker]] entnehmen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;multiple&#039;&#039;&#039; || &amp;lt;code&amp;gt;group:multiple,Telefon,Multimedia,Licht,Heizung&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte durch klicken auswählen kann. Optional kann man in einem Freitext eigene Werte ergänzen. dieser Dialog wird bspw. bei der Raum-Auswahl (Attribut &amp;quot;room&amp;quot;) oder der Gruppen-Auswahl (Attribut &amp;quot;group&amp;quot;) in FHEMWEB genutzt. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sortable&#039;&#039;&#039; || &amp;lt;code&amp;gt;command:sortable,monday,tuesday,...&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte auswählen und sortieren kann. Man kann dabei Werte durch Klicken auswählen und durch Drag&#039;n&#039;Drop sortieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt noch weitere solcher Widgets. Eine genaue Auflistung dazu findet sich in der {{Link2CmdRef|Anker=widgetOverride}} unter widgetOverride zu FHEMWEB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Damit in einer Eingabe bereits der aktuelle Wert vorbelegt bzw. in einer Auswahlliste der aktuelle Wert vorselektiert ist, muss es im Modul bzw. Gerät ein Reading mit dem gleichen Namen wie die Set-Option geben. Der Wert des gleichnamigen Readings wird dann als Vorbelegung / Vorselektion verwendet. &lt;br /&gt;
* Der User kann sich in der Raumübersicht nach wie vor via [[WebCmd|webCmd]] eine entsprechende Steuerung anlegen.&lt;br /&gt;
&lt;br /&gt;
==== X_Attr ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Attr($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $cmd, $name, $attrName, $attrValue  ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion dient der Prüfung von Attributen, welche über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl gesetzt werden können. Sobald versucht wird, ein Attribut für ein Gerät zu setzen, wird vorher die Attr-Funktion des entsprechenden Moduls aufgerufen um zu prüfen, ob das Attribut aus Sicht des Moduls korrekt ist.&lt;br /&gt;
Liegt ein Problem mit dem Attribut bzw. dem Wert vor, so muss die Funktion eine aussagekräftige Fehlermeldung zurückgeben, welche dem User angezeigt wird.&lt;br /&gt;
Sofern das übergebene Attribut samt Inhalt korrekt ist, gibt die Attr-Funktion den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurück. Erst dann wird das Attribut in der globalen Datenstruktur &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; gespeichert und ist somit erst aktiv.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Attr($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $cmd, $name, $aName, $aValue ) = @_;&lt;br /&gt;
    &lt;br /&gt;
  	# $cmd  - Vorgangsart - kann die Werte &amp;quot;del&amp;quot; (löschen) oder &amp;quot;set&amp;quot; (setzen) annehmen&lt;br /&gt;
	# $name - Gerätename&lt;br /&gt;
	# $aName/$aValue sind Attribut-Name und Attribut-Wert&lt;br /&gt;
    &lt;br /&gt;
	if ($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
		if ($aName eq &amp;quot;Regex&amp;quot;) {&lt;br /&gt;
			eval { qr/$aValue/ };&lt;br /&gt;
			if ($@) {&lt;br /&gt;
				Log3 $name, 3, &amp;quot;X ($name) - Invalid regex in attr $name $aName $aValue: $@&amp;quot;;&lt;br /&gt;
				return &amp;quot;Invalid Regex $aValue: $@&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist es möglich auch übergebene Attributwerte zu verändern bzw. zu korrigieren, indem man im Parameterarray &amp;lt;code&amp;gt;@_&amp;lt;/code&amp;gt; den ursprünglichen Wert anpasst. Dies erfolgt im Beispiel über die Modifikation des Wertes mit Index 3 (entspricht dem 4. Element) im Parameterarray, also &amp;lt;code&amp;gt;$_[3]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Da das Attribut zum Zeitpunkt des Aufrufs der Attr-Funktion noch nicht gespeichert ist, wird der neue Wert zu diesem Zeitpunkt noch nicht via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] zurückgegeben. Erst, wenn die Attr-Funktion mit &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; beendet ist, wird der neue Wert in FHEM gespeichert und steht dann via AttrVal() zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie normalerweise keine Werte dort speichern muss, sondern lediglich das Attribut auf Korrektheit prüfen muss.&lt;br /&gt;
Im obigen Beispiel wird für ein Attribut mit Namen &amp;quot;Regex&amp;quot; geprüft ob der reguläre Ausdruck fehlerhaft ist. Sofern dieser OK ist, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben und fhem.pl speichert den Wert des Attributs in &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Attributnamen mit Platzhaltern&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man Attribute in der [[#X_Initialize|Initialize]]-Funktion mit Platzhaltern definiert (Wildcard-Attribute) wie z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
      &amp;quot;reading[0-9]*Name &amp;quot; .&lt;br /&gt;
    # usw.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken in der Web-Oberfläche, da FHEMWEB nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muss solche Attribute manuell über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl eingeben.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch in der Attr-Funktion neu gesetzte Ausprägungen von Wildcard-Attributen an die gerätespezifische userattr-Variable anfügen. Dann können bereits gesetzte Attribute in FHEMWEB durch Klicken ausgewählt und geändert werden.&lt;br /&gt;
Dazu reicht ein Aufruf der Funktion [[DevelopmentModuleAPI#addToDevAttrList|addToDevAttrList()]]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
    addToDevAttrList($name, $aName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== X_Read ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Read ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die X_Read-Funktion wird aufgerufen, wenn ein dem Gerät zugeordneter Filedeskriptor (serielle Schnittstelle, TCP-Verbindung, ...) Daten zum Lesen bereitgestellt hat. Die Daten müssen nun eingelesen und interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Serial-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion [[DevIo#DevIo_SimpleRead()|DevIo_SimpleRead()]] gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann.&lt;br /&gt;
Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten in einem eigenen Puffer (idealerweise in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) zwischenspeichern (siehe auch [[DevIo#Hinweis bei der Datenverarbeitung (Buffering)|DevIo]]). Im Beispiel ist dies &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{BUFFER}&amp;lt;/code&amp;gt; an den die aktuell gelesenen Daten angehängt werden, bis die folgende Prüfung ein für das jeweilige Protokoll vollständige Frame erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Read($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	&lt;br /&gt;
	# einlesen der bereitstehenden Daten&lt;br /&gt;
	my $buf = DevIo_SimpleRead($hash);		&lt;br /&gt;
	return &amp;quot;&amp;quot; if ( !defined($buf) );&lt;br /&gt;
	Log3 $name, 5, &amp;quot;X ($name) - received data: &amp;quot;.$buf;    &lt;br /&gt;
&lt;br /&gt;
	# Daten in Hex konvertieren und an den Puffer anhängen&lt;br /&gt;
	$hash-&amp;gt;{helper}{BUFFER} .= unpack (&#039;H*&#039;, $buf);	&lt;br /&gt;
	Log3 $name, 5, &amp;quot;X ($name) - current buffer content: &amp;quot;.$hash-&amp;gt;{helper}{BUFFER};&lt;br /&gt;
&lt;br /&gt;
	# prüfen, ob im Buffer ein vollständiger Frame zur Verarbeitung vorhanden ist.&lt;br /&gt;
	if ($hash-&amp;gt;{helper}{BUFFER} =~ &amp;quot;ff1002(.{4})(.*)1003(.{4})ff(.*)&amp;quot;) {&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zu lesenden Nutzdaten können dann je nach Protokoll des Geräts beispielsweise an einer festgelegten Stelle im Frame (dann in &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{BUFFER}&amp;lt;/code&amp;gt;) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und via [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] in Readings gespeichert werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert der Read-Funktion wird nicht geprüft und hat daher keinerlei Bedeutung.&lt;br /&gt;
&lt;br /&gt;
==== X_Ready ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Ready ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
    &lt;br /&gt;
	return $success;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird im Main-Loop aufgerufen falls das Modul in der globalen Liste &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; existiert. Diese Funktion hat, je nachdem auf welchem OS FHEM ausgeführt wird, unterschiedliche Aufgaben:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;UNIX-artiges Betriebssystem:&#039;&#039;&#039; prüfen, ob eine Verbindung nach einem Verbindungsabbruch wieder aufgebaut werden kann. Sobald der Verbindungsaufbau erfolgreich war, muss die Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. &amp;quot;1&amp;quot;) und den eigenen Eintrag entsprechend aus &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; löschen.&lt;br /&gt;
* &#039;&#039;&#039;Windows-Betriebssystem:&#039;&#039;&#039; prüfen, ob lesbare Daten für ein serielles Device (via COM1, COM2, ...) vorliegen. Sofern lesbare Daten vorliegen, muss Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. &amp;quot;1&amp;quot;). Zusätzlich dazu muss die Funktion, wie bei UNIX-artigen Betriebssystem, ebenfalls bei einem Verbindungsabbruch einen neuen Verbindungsversuch initiieren. Der Eintrag in &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; bleibt solange erhalten, bis die Verbindung seitens FHEM beendet wird.&lt;br /&gt;
&lt;br /&gt;
Der Windows-spezifische Teil zur Datenprüfung ist dabei nur zu implementieren, wenn das Modul über eine serielle Verbindung kommuniziert.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung des Moduls [[DevIo]] wird dem Modulentwickler der Umgang mit &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; abgenommen, da DevIo sich selbst um die entsprechenden Einträge kümmert und diese selbstständig wieder entfernt.&lt;br /&gt;
&lt;br /&gt;
In der Regel sieht eine Ready-Funktion immer gleich aus.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Ready($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
      &lt;br /&gt;
	# Versuch eines Verbindungsaufbaus, sofern die Verbindung beendet ist.&lt;br /&gt;
	return DevIo_OpenDev($hash, 1, undef ) if ( $hash-&amp;gt;{STATE} eq &amp;quot;disconnected&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	# This is relevant for Windows/USB only&lt;br /&gt;
	if(defined($hash-&amp;gt;{USBDev})) {&lt;br /&gt;
		my $po = $hash-&amp;gt;{USBDev};&lt;br /&gt;
		my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po-&amp;gt;status;&lt;br /&gt;
		return ( $InBytes &amp;gt; 0 );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Notify ====&lt;br /&gt;
&lt;br /&gt;
Die X_Notify-Funktion wird aus der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] in fhem.pl heraus aufgerufen sobald ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind dabei das [[FileLog]]-Modul oder das [[notify]]-Modul.&lt;br /&gt;
&lt;br /&gt;
Die Notify-Funktion bekommt dafür zwei Hash-Referenzen übergeben: den Hash des eigenen Geräts und den Hash des Geräts, das die Events erzeugt hat. &lt;br /&gt;
Über den Hash des eigenen Geräts kann die Notify-Funktion beispielsweise auf die Internals oder Attribute des eigenen Geräts zugreifen.&lt;br /&gt;
Über den Hash des Gerätes und der [[DevelopmentModuleAPI#deviceEvents|deviceEvents()]]-Funktion kann man auf die generierten Events zugreifen. Über den zweiten Parameter dieser Routine lässt sich bestimmen ob für das Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; ein &#039;normales&#039; Event (d.h. in der form &amp;lt;code&amp;gt;state: &amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;) erzeugen soll (Wert: 1) oder ob z.b. aus Gründen der Rückwärtskompatibilität ein Event ohne &amp;lt;code&amp;gt;state: &amp;lt;/code&amp;gt; erzeugt werden soll. Falls dem Anwender die Wahl des verwendeten Formats überlassen werden soll ist hierzu das {{Link2CmdRef|Anker=addStateEvent|Lang=de|Label=addStateEvent-Attribut}} vorzusehen.&lt;br /&gt;
&lt;br /&gt;
Der direkte Zugriff auf &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; ist nicht mehr zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
  my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
&lt;br /&gt;
  return &amp;quot;&amp;quot; if(IsDisabled($ownName)); # Return without any further action if the module is disabled&lt;br /&gt;
&lt;br /&gt;
  my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
&lt;br /&gt;
  my $events = deviceEvents($dev_hash,1);&lt;br /&gt;
  return if( !$events );&lt;br /&gt;
&lt;br /&gt;
  foreach my $event (@{$events}) {&lt;br /&gt;
    $event = &amp;quot;&amp;quot; if(!defined($event));&lt;br /&gt;
&lt;br /&gt;
    # Examples:&lt;br /&gt;
    # $event = &amp;quot;readingname: value&amp;quot; &lt;br /&gt;
    # or&lt;br /&gt;
    # $event = &amp;quot;INITIALIZED&amp;quot; (for $devName equal &amp;quot;global&amp;quot;)&lt;br /&gt;
    #&lt;br /&gt;
    # processing $event with further code&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Begrenzung der Aufrufe auf bestimmte Geräte&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Notify-Funktion für jedes definierte Gerät mit all seinen Events aufgerufen wird, muss sie in einer Schleife jedesmal prüfen und entscheiden, ob es mit dem jeweiligen Event etwas anfangen kann. Ein Gerät, das die Notify-Funktion implementiert, sieht dafür typischerweise einen regulären Ausdruck vor, welcher für die Filterung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Wenn man nur gezielt von bestimmten Definitionen Events erhalten will, kann man diese auch in Form einer {{Link2CmdRef|Lang=de|Anker=devspec|Label=devspec}} in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; angeben. Bspw. kann man in der Define-Funktion diesen Wert setzen. Dadurch wird die Notify-Funktion nur aufgerufen wenn eine der Definitionen, auf welche die devspec passt, ein Event erzeugt hat. Ein typischer Fall ist die Begrenzung von Events auf &amp;quot;global&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
in der Define-Funktion:&lt;br /&gt;
&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,Definition_.*&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,Definition_A,Definition_B&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,TYPE=CUL_HM&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies schont insbesondere bei grossen Installationen Ressourcen, da die Notify-Funktion nicht sämtliche Events, sondern nur noch Events der gewünschten Definitionen erhält. Dadurch erfolgen deutlich weniger Aufrufe der Notify-Funktion, was Systemressourcen schont. Statt den Filter &#039;&#039;NOTIFYDEV&#039;&#039; direkt zu setzen, kann auch [[DevelopmentModuleAPI#setNotifyDev|setNotifyDev()]] aufgerufen werden. Letzteres ist v.a. dann zu empfehlen, wenn Änderungen zur Laufzeit erfolgen sollen.&lt;br /&gt;
&lt;br /&gt;
Sofern in der [[#X_Define|Define-Funktion]] eine Regexp als Argument übergeben wird, die ähnlich wie beim Modul [[notify]] auf Events wie &amp;lt;code&amp;gt;&amp;amp;lt;Definitionsname&amp;amp;gt;&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;&amp;amp;lt;Definitionsname&amp;amp;gt;:&amp;amp;lt;Event&amp;amp;gt;&amp;lt;/code&amp;gt; reagiert, so sollte man in der Define-Funktion die Funktion [[DevelopmentModuleAPI#notifyRegexpChanged|notifyRegexpChanged()]] verwenden. Diese versucht einen passenden Eintrag für &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; basierend auf der übergebenen Regexp zu setzen, sofern dies möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Reihenfolge für den Aufruf der Notify-Funktion beeinflussen&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald ein Event ausgelöst wurde, stellt sich FHEM eine Liste aller relevanten Geräte-Hashes zusammen, welche via Notify-Funktion prüfen müssen, ob das Event relevant ist. Dabei wird die Liste nach &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; sortiert. Diese enthält ein Order-Präfix in Form einer Ganzzahl, sowie den Namen der Definition (Bsp: &amp;lt;code&amp;gt;&#039;&#039;&#039;50&#039;&#039;&#039;-Lampe_Wohnzimmer&amp;lt;/code&amp;gt;). Dadurch kann man jedoch nicht sicherstellen, dass Events von bestimmten Modulen zuerst verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn das eigene Modul bei der Eventverarbeitung gegenüber den anderen Modulen eine bestimmte Reihenfolge einhalten muss, kann man in der [[#X_Initialize|Initialize]]-Funktion durch Setzen von &amp;lt;code&amp;gt;$hash-&amp;gt;{NotifyOrderPrefix}&amp;lt;/code&amp;gt; diese Reihenfolge beeinflussen. Standardmäßig werden Module immer mit einem Order-Präfix von &amp;quot;50-&amp;quot; in FHEM registriert. Durch die Veränderung dieses Präfixes kann man das eigene Modul in der Reihenfolge gegenüber anderen Modulen bei der Eventverarbeitung beeinflussen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	$hash-&amp;gt;{NotifyOrderPrefix} = &amp;quot;45-&amp;quot;  # Alle Definitionen des Moduls X werden bei der Eventverarbeitung zuerst geprüft&lt;br /&gt;
	&lt;br /&gt;
	# oder...&lt;br /&gt;
	&lt;br /&gt;
	$hash-&amp;gt;{NotifyOrderPrefix} = &amp;quot;55-&amp;quot;  # Alle Definitionen des Moduls X werden bei der Eventverarbeitung als letztes geprüft&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Da dieses Präfix bei eventverarbeitenden Definitionen in &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; dem Definitionsnamen vorangestellt wird bewirkt es bei einer normalen aufsteigenden Sortierung nach &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; eine veränderte Reihenfolge. Alle Module die in der Initialize-Funktion nicht &amp;lt;code&amp;gt;$hash-&amp;gt;{NotifyOrderPrefix}&amp;lt;/code&amp;gt; explizit setzen, werden mit &amp;quot;50-&amp;quot; als Standardwert vorbelegt.&lt;br /&gt;
&lt;br /&gt;
==== X_Rename ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Rename($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $new_name, $old_name) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Rename-Funktion wird ausgeführt, nachdem ein Gerät umbenannt wurde. Auf diese Weise kann ein Modul auf eine Namensänderung reagieren, wenn das Gerät &amp;lt;code&amp;gt;$old_name&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;$new_name&amp;lt;/code&amp;gt; umbenannt wurde. Ein typischer Fall ist das Umsetzen der Namensänderungen bei Daten die mittels [[DevelopmentModuleAPI#setKeyValue|setKeyValue()]] gespeichert wurden. Hierbei müssen die Daten, welche unter dem alten Namen gespeichert sind, auf den neuen Namen geändert werden.&lt;br /&gt;
&lt;br /&gt;
Der Rename-Funktion wird lediglich der alte, sowie der neue Gerätename übergeben. Der Rückgabewert wird nicht ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Rename($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $new_name, $old_name ) = @_;&lt;br /&gt;
&lt;br /&gt;
	my $old_index = &amp;quot;Module_X_&amp;quot;.$old_name.&amp;quot;_data&amp;quot;;&lt;br /&gt;
	my $new_index = &amp;quot;Module_X_&amp;quot;.$new_name.&amp;quot;_data&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	my ($err, $old_pwd) = getKeyValue($old_index);&lt;br /&gt;
	return undef unless(defined($old_pwd));&lt;br /&gt;
&lt;br /&gt;
	setKeyValue($new_index, $old_pwd);&lt;br /&gt;
	setKeyValue($old_index, undef);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_DelayedShutdown ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DelayedShutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $delay_needed;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit der X_DelayedShutdown Funktion kann eine Definition das Stoppen von FHEM verzögern um asynchron hinter sich aufzuräumen. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.), welcher mehrfache Requests/Responses benötigt. Als Übergabeparameter wird der Geräte-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; bereitgestellt. Je nach Rückgabewert &amp;lt;code&amp;gt;$delay_needed&amp;lt;/code&amp;gt; wird der Stopp von FHEM verzögert. Ist ein verzögerter Stopp von FHEM notwendig, darf der Rückgabewert in diesem Fall nicht &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; sein.&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zur [[#X_Shutdown|Shutdown]]-Funktion steht vor einem bevorstehenden Stopp von FHEM für einen User-konfigurierbaren Zeitraum (global-Attribut: &amp;lt;code&amp;gt;maxShutdownDelay&amp;lt;/code&amp;gt; / Standard: 10 Sekunden) weiterhin die asynchrone FHEM Infrastruktur ([[DevIo]]/[[#X_Read|Read]]-Funktion und [[DevelopmentModuleAPI#InternalTimer|InternalTimer]]) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Sobald alle nötigen Maßnahmen erledigt sind, muss der Abschluss mit [[DevelopmentModuleAPI#CancelDelayedShutdown|CancelDelayedShutdown(&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;)]] an FHEM zurückgemeldet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DelayedShutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	# Aufräumen starten&lt;br /&gt;
	&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Shutdown ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Shutdown ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit der X_Shutdown Funktion kann ein Modul Aktionen durchführen bevor FHEM gestoppt wird. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.). Nach der Ausführung der Shutdown-Fuktion wird FHEM sofort beendet. Falls vor dem Herunterfahren von FHEM asynchrone Kommunikation (via [[DevIo]]/[[#X_Read|X_Read]]) notwendig ist um eine vorhandene Verbindung sauber zu beenden, sollte man [[#X_DelayedShutdownFn|X_DelayedShutdownFn]] verwenden.&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter wird der Geräte-Hash bereitgestellt. Der Rückgabewert einer Shutdown-Funktion wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Shutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	# Verbindung schließen&lt;br /&gt;
	DevIo_CloseDev($hash);&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funktionen für zweistufiges Modulkonzept ===&lt;br /&gt;
&lt;br /&gt;
Für das [[#Zweistufiges_Modell_für_Module|zweistufige Modulkonzept]] gibt es weiterhin:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Parse|X_Parse]] || Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] vom physischen Modul zum logischen Modul zwecks der Verarbeitung.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Write|X_Write]]|| Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|IOWrite()]] vom logischen zum physischen Modul um diese an die Hardware weiterzureichen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Fingerprint|X_Fingerprint]] || Rückgabe eines &amp;quot;Fingerabdrucks&amp;quot; einer Nachricht. Dient der Erkennung von Duplikaten im Rahmen von [[DevelopmentModuleAPI#Dispatch|Dispatch()]]. Kann im physischen, als auch logischen Modul benutzt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für das zweistufige Modulkonzept muss in einem logischen Modul eine [[#X_Parse|Parse]]-Funktion im Modul-Hash registriert werden. In einem physikalischen Modul muss eine [[#X_Write|Write]]-Funktion registriert sein. Diese dienen dem Datenaustausch in beide Richtungen und werden von dem jeweils anderen Modul indirekt aufgerufen.&lt;br /&gt;
&lt;br /&gt;
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{ParseFn}       = &amp;quot;X_Parse&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{WriteFn}       = &amp;quot;X_Write&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{FingerprintFn} = &amp;quot;X_Fingerprint&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Parse ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen &amp;quot;X&amp;quot; ein &#039;&#039;&#039;logisches Modul&#039;&#039;&#039; im Sinne des zweistufigen Modulkonzepts ist, also Daten mit einem übergeordneten, physikalischen Modul austauscht.}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Parse ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_hash, $message) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $found;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_Parse wird aufgerufen, sobald von dem IO-Gerät &amp;lt;code&amp;gt;$io_hash&amp;lt;/code&amp;gt; eine Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] zur Verarbeitung angefragt wird. Die Parse-Funktion muss dann prüfen, zu welcher Gerätedefinition diese Nachricht gehört und diese entsprechend verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise enthält eine Nachricht immer eine Komponente durch welche sich die Nachricht einem Gerät zuordnen lässt (z.B. Adresse, ID-Nummer, ...). Eine solche Identifikation sollte man im Rahmen der [[#X_Define|Define]]-Funktion im logischen Modul an geeigneter Stelle speichern, um in der Parse-Funktion eine einfache Zuordnung von Adresse/ID einer Nachricht zur entsprechenden Gerätedefinition zu haben. Dazu wird in der Regel im Modul-Hash im modulspezifischen Bereich eine Liste &amp;lt;code&amp;gt;defptr&amp;lt;/code&amp;gt; (Definition Pointer) geführt, welche jede eindeutige Adresse/ID dem entsprechenden Geräte-Hash zuordnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Define ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def) = @_;&lt;br /&gt;
	my @a = split(&amp;quot;[ \t][ \t]*&amp;quot;, $def);&lt;br /&gt;
	my $name = $a[0];&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# erstes Argument ist die eindeutige Geräteadresse&lt;br /&gt;
	my $address = $a[1];&lt;br /&gt;
&lt;br /&gt;
	# Adresse rückwärts dem Hash zuordnen (für ParseFn)&lt;br /&gt;
	$modules{X}{defptr}{$address} = $hash;&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Basis dieses Definition Pointers kann die Parse-Funktion nun sehr einfach prüfen, ob für die empfangene Nachricht bereits eine entsprechende Gerätedefinition existiert. Sofern diese existiert, kann die Nachricht entsprechend verarbeitet werden. Sollte jedoch keine passende Gerätedefinition zu der empfangenen Nachricht existieren, so muss die Parse-Funktion den Gerätenamen &amp;quot;UNDEFINED&amp;quot; zusammen mit den Argumenten für einen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl zurückgeben, welcher ein passendes Gerät in FHEM anlegen würde (durch [[autocreate]]).&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Parse ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_hash, $message) = @_;&lt;br /&gt;
	&lt;br /&gt;
	# Die Stellen 10-15 enthalten die eindeutige Identifikation des Geräts&lt;br /&gt;
	my $address = substr($message, 10, 5); &lt;br /&gt;
&lt;br /&gt;
	# wenn bereits eine Gerätedefinition existiert (via Definition Pointer aus Define-Funktion)&lt;br /&gt;
	if(my $hash = $modules{X}{defptr}{$address}) &lt;br /&gt;
	{&lt;br /&gt;
		...  # Nachricht für $hash verarbeiten&lt;br /&gt;
		&lt;br /&gt;
		# Rückgabe des Gerätenamens, für welches die Nachricht bestimmt ist.&lt;br /&gt;
		return $hash-&amp;gt;{NAME}; &lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		# Keine Gerätedefinition verfügbar&lt;br /&gt;
		# Daher Vorschlag define-Befehl: &amp;lt;NAME&amp;gt; &amp;lt;MODULNAME&amp;gt; &amp;lt;ADDRESSE&amp;gt;&lt;br /&gt;
		return &amp;quot;UNDEFINED X_&amp;quot;.$address.&amp;quot; X $address&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Write ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen &amp;quot;X&amp;quot; ein &#039;&#039;&#039;physisches Modul&#039;&#039;&#039; im Sinne des zweistufigen Modulkonzepts ist, also Daten mit untergeordneten logischen Modulen austauscht. }}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Write ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @arguments) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Write-Funktion wird durch die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] aufgerufen, sobald eine logische Gerätedefinition Daten per IO-Gerät an die Hardware übertragen möchte. Dazu kümmert sich die Write-Funktion um die Übertragung der Nachricht in geeigneter Form an die verbundene Hardware. Als Argumente wird der Hash des physischen Gerätes übertragen, sowie alle weiteren Argumente, die das logische Modul beim Aufruf von IOWrite() mitgegeben hat. Im Normalfall ist das ein Skalar mit der zu sendenden Nachricht in Textform. Es kann aber auch sein, dass weitere Daten zum Versand notwendig sind (evtl. Schlüssel, Session-Key, ...). Daher ist die Parametersyntax einer zu schreibenden Nachricht via IOWrite-/Write-Funktion zwischen logischem und physikalischem Modul abzustimmen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Write ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $message, $address) = @_;&lt;br /&gt;
	&lt;br /&gt;
	DevIo_SimpleWrite($hash, $address.$message, 2);&lt;br /&gt;
&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Fingerprint ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Fingerprint($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_name, $msg ) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return ( $io_name, $fingerprint );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fingerprint-Funktion dient der Erkennung von Duplikaten empfangener Nachrichten. Diese Funktion kann dabei sowohl im physischen, als auch im logischen Modul implementiert sein - je nachdem auf welcher Ebene man für eine Nachricht einen Fingerprint bilden kann. &lt;br /&gt;
&lt;br /&gt;
Als Parameter wird der Name des IO-Geräts &amp;lt;code&amp;gt;$io_name&amp;lt;/code&amp;gt; übergeben, sowie die Nachricht &amp;lt;code&amp;gt;$msg&amp;lt;/code&amp;gt;, welche empfangen wurde. Nun muss aus dieser Nachricht ein eindeutiger Fingerprint gebildet werden. Dies bedeutet, dass alle variablen Inhalte, die aufgrund des Empfangs dieser Nachricht über unterschiedliche IO-Geräte enthalten sein können, entfernt werden müssen. Dies können bspw. Empfangsadressen von IO-Geräten sein oder Session-ID&#039;s die in der Nachricht enthalten sind. Alle Fingerprints sämtlicher Nachrichten, die innerhalb der letzten 500 Millisekunden (konfigurierbar via &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; Attribut &amp;lt;code&amp;gt;dupTimeout&amp;lt;/code&amp;gt;) empfangen wurden, werden gegen diesen generierten Fingerprint getestet. Sollte innerhalb dieser Zeit bereits eine Nachricht mit diesem Fingerprint verarbeitet worden sein, so wird sie als Duplikat erkannt und nicht weiter verarbeitet. In diesem Fall gibt [[DevelopmentModuleAPI#Dispatch|Dispatch()]] den Namen der Gerätedefinition zurück, welche eine Nachricht mit dem selben Fingerprint bereits verarbeitet hat. Es erfolgt dann kein Aufruf der [[#X_Parse|Parse]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Fingerprint($$)&lt;br /&gt;
{&lt;br /&gt;
  my ( $io_name, $msg ) = @_;&lt;br /&gt;
&lt;br /&gt;
  substr( $msg, 2, 2, &amp;quot;--&amp;quot; ); # entferne Empfangsadresse&lt;br /&gt;
  substr( $msg, 4, 1, &amp;quot;-&amp;quot; );  # entferne Hop-Count&lt;br /&gt;
&lt;br /&gt;
  return ( $io_name, $msg );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird zuerst, sofern implementiert, die Fingerprint-Funktion des physischen Moduls aufgerufen. Sollte sich hierdurch kein Duplikat erkennen lassen, wird die Fingerprint-Funktion jedes möglichen geladenen logischen Moduls aufgerufen, sofern implementiert. &lt;br /&gt;
&lt;br /&gt;
Sollte sowohl im physischen, als auch im logischen Modul keine Fingerprint-Funktion implementiert sein, so wird keinerlei Duplikatserkennung durchgeführt.&lt;br /&gt;
&lt;br /&gt;
=== FHEMWEB-spezifische Funktionen ===&lt;br /&gt;
&lt;br /&gt;
FHEMWEB bietet Modul-Autoren die Möglichkeit an durch spezielle Funktionsaufrufe in Modulen, eigene HTML-Inhalte zu verwenden. Dadurch können in Verbindung mit zusätzlichem JavaScript komplexe Dialoge/Inhalte/Steuermöglichkeiten dargestellt werden. &lt;br /&gt;
&lt;br /&gt;
Eine genaue Auflistung aller FHEMWEB-spezifischen Funktionsaufrufe gibt es in dem separaten Artikel [[DevelopmentFHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
=== sonstige Funktionen ===&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden weitere Funktionen behandelt die zum Teil aus FHEM, aber auch aus anderen Modulen aufgerufen werden. Sie sind dabei nur in speziellen Anwendungsfällen relevant. Hier eine Auflistung aller sonstigen Modulfunktionen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Funktionsname !! class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_DbLog_split|X_DbLog_split]] || Wird durch das Modul 93_DbLog.pm aufgerufen. Dient dem korrekten Split eines moduleigenen Events in Name/Wert/Einheit für die Nutzung einer Datenbank.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Except|X_Except]]|| Wird aufgerufen, sobald ein ein geöffneter Filedescriptor in [[#Wichtige_globale_Variablen_aus_fhem.pl|&amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;]], der unter &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt; im Geräte-Hash gesetzt ist, einen Interrupt bzw. Exception auslöst.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Copy|X_Copy]]|| Wird durch das Modul 98_copy.pm aufgerufen im Rahmen des &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt;-Befehls sobald ein Gerät kopiert wurde.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_State|X_State]]|| Wird aufgerufen im Rahmen des &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt;-Befehls bevor der Status einer Gerätedefinition bzw. eines zugehörigen Readings gesetzt wird.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_AsyncOutput|X_AsyncOutput]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht die asynchrone Ausgabe von Daten via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an einen einzelnen verbundenen Client.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_ActivateInform|X_ActivateInform]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht das Aktivieren des inform-Mechanismus zum Senden von Events für einen einzelnen verbundenen Client.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Authorize|X_Authorize]]|| Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authorized|Authorized()]] um eine gewünschte Vorgangs-Art zu autorisieren.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Authenticate|X_Authenticate]]||  Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authenticate|Authenticate()]] um eine Authentifizierung zu prüfen und ggf. zu genehmigen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DbLog_splitFn} = &amp;quot;X_DbLog_split&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ExceptFn} = &amp;quot;X_Except&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{CopyFn} = &amp;quot;X_Copy&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AsyncOutputFn} = &amp;quot;X_AsyncOutput&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ActivateInformFn} = &amp;quot;X_ActivateInform&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{StateFn} = &amp;quot;X_State&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AuthorizeFn} = &amp;quot;X_Authorize&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AuthenticateFn} = &amp;quot;X_Authenticate&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
==== X_DbLog_split ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DbLog_split ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $event, $device_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
    &lt;br /&gt;
	return  ( $reading, $value, $unit );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die DbLog_split-Funktion wird durch das Modul [[DbLog]] aufgerufen, sofern der Nutzer DbLog benutzt. Sofern diese Funktion implementiert ist, kann der Modul-Autor das Auftrennen von Events in den Reading-Namen, -Wert und der Einheit selbst steuern. Andernfalls nimmt DbLog diese Auftrennung selber mittels Trennung durch Leerzeichen sowie vordefinierten Regeln zu verschiedenen Modulen vor. Je nachdem, welche Readings man in seinem Modul implementiert, passt diese standardmäßige Trennung jedoch nicht immer.&lt;br /&gt;
&lt;br /&gt;
Der Funktion werden folgende Eingangsparameter übergeben:&lt;br /&gt;
# Das generierte Event (Bsp: &amp;lt;code&amp;gt;temperature: 20.5 °C&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Der Name des Geräts, welche das Event erzeugt hat (Bsp: &amp;lt;code&amp;gt;Temperatursensor_Wohnzimmer&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es ist nicht möglich in der DbLog_split-Funktion auf die verarbeitende DbLog-Definition zu referenzieren.&lt;br /&gt;
&lt;br /&gt;
Als Rückgabewerte muss die Funktion folgende Werte bereitstellen:&lt;br /&gt;
# Name des Readings (Bsp: &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Wert des Readings (Bsp: &amp;lt;code&amp;gt;20.5&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Einheit des Readings (Bsp: &amp;lt;code&amp;gt;°C&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DbLog_splitFn($$)&lt;br /&gt;
{&lt;br /&gt;
	my ($event, $device) = @_;&lt;br /&gt;
	my ($reading, $value, $unit);&lt;br /&gt;
        my $devhash = $defs{$device}&lt;br /&gt;
&lt;br /&gt;
	if($event =~ m/temperature/) {&lt;br /&gt;
	   $reading = &#039;temperature&#039;;&lt;br /&gt;
	   $value = substr($event,12,4);&lt;br /&gt;
	   $unit = &#039;°C&#039;;&lt;br /&gt;
	}   &lt;br /&gt;
        &lt;br /&gt;
        return ($reading, $value, $unit);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Except ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Except ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_Except-Funktion wird durch fhem.pl aufgerufen, wenn die Gerätedefinition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; aufgeführt ist und der Filedeskriptor in &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt; eine Exception bzw. Interrupt auslöst. &lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use IO::File;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
sub X_Except ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	# Filehandle aus Filedescriptor erstellen&lt;br /&gt;
	my $filehandle = IO::File-&amp;gt;new_from_fd($hash-&amp;gt;{EXCEPT_FD}, &#039;r&#039;);&lt;br /&gt;
	seek($filehandle,0,0);	&lt;br /&gt;
&lt;br /&gt;
	# aktuellen Inhalt auslesen&lt;br /&gt;
	my $current_value = $filehandle-&amp;gt;getline;&lt;br /&gt;
&lt;br /&gt;
	if($current_value eq &amp;quot;1&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		...&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		...&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Copy ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Copy ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $old_name, $new_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_Copy-Funktion wird durch das Modul [[copy]] aufgerufen nachdem ein Nutzer eine Gerätedefinition über den Befehl &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; kopiert hat. Dazu werden als Funktionsparameter die Definitionsnamen der alten und neuen Gerätedefinition übergeben. Es dient dazu zusätzliche Daten aus der zu kopierenden Gerätedefinition in die neue Definition zu übernehmen. Der Befehl &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; überträgt lediglich &amp;lt;code&amp;gt;$hash-&amp;gt;{DEF}&amp;lt;/code&amp;gt; in die neue Definition sowie sämtliche gesetzte Attribute. Weitere Daten müssen dann durch die X_Copy-Funktion übertragen werden. &lt;br /&gt;
&lt;br /&gt;
Die X_Copy-Funktion wird erst nach dem erfolgtem Kopiervorgang aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Copy ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $old_name, $new_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	my $old_hash = $defs{$old_name};&lt;br /&gt;
	my $new_hash = $defs{$new_name};&lt;br /&gt;
&lt;br /&gt;
	# copy also temporary session key&lt;br /&gt;
	$new_hash-&amp;gt;{helper}{SESSION_KEY} = $old_hash-&amp;gt;{helper}{SESSION_KEY};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_AsyncOutput ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_AsyncOutput ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $client_hash, $text ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_AsyncOutput wird durch [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] von anderen Modulen aufgerufen. Es erlaubt diesen anderen Modulen die Ausgabe von asynchronen Befehlsergebnissen &amp;lt;code&amp;gt;$text&amp;lt;/code&amp;gt; zuvor ausgeführter set-/get-Befehle an den entsprechenden Client (identifiziert durch den Client-Hash &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; der temporären Definition) zurückzugeben. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Client einen set-/get-Befehl ausführt, wird der Client-Hash bei der Ausführung dieser Befehle an die jeweiligen Module übermittelt. Sobald ein Befehl ausgeführt wird, der seine Ausgabe asynchron ausführen möchte und die Client-Verbindung des Server-Moduls dies unterstützt (&amp;lt;code&amp;gt;$client_hash-&amp;gt;{canAsyncOutput}&amp;lt;/code&amp;gt; ist gesetzt), merkt sich das befehlsausführende Modul den Client-Hash und gibt das Ergebnis des Befehls zu späterer Zeit via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an den ursprünglichen Client zurück. Die Funktion X_AsyncOutput des Server-Moduls kümmert sich darum das Ergebnis dem entsprechenden Client in der notwendigen Form zuzustellen.&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert von X_AsyncOutput() wird als Rückgabewert für asyncOutput() verwendet. Man kann hier im Fehlerfall eine Fehlermeldung angeben und im Erfolgsfall &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;. Der Rückgabewert wird aber aktuell nicht ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==== X_ActivateInform====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_ActivateInform($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $client_hash, $arg ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_ActivateInform wird aktuell nur durch den [[update]]-Befehl aufgerufen, sofern ein Client eines Frontend-Moduls diesen Befehl aufgerufen hat um den Inform-Mechanismus (Senden von Events) zu aktivieren. Dadurch wird im Falle von [[update]] die umgehende Anzeige der Logmeldungen für den ausführenden Client aktiviert. In [[FHEMWEB]] geschieht das über den Event-Monitor, bei telnet mit der direkten Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Da diese Funktion aktuell nur speziell für den update-Befehl implementiert ist, kann man aktuell keine genaue Angaben zu den möglichen Werten von &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; geben. Dieser Parameter dient dazu genauer zu spezifizieren was exakt an Events an den entsprechenden Client &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; zu senden ist. Aktuell wird dazu die Parametersyntax des inform-Befehls verwendet (on|off|log|raw|timer|status).&lt;br /&gt;
&lt;br /&gt;
==== X_State ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_State($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $time, $readingName, $value ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_State-Funktion wird durch fhem.pl aufgerufen, sobald über den Befehl &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; versucht wird ein Wert für ein Reading oder den Status (&amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt;) einer Gerätedefinition zu setzen. Dieser Befehl wird primär beim Starten von FHEM aufgerufen sobald das State-File eingelesen wird. Je nachdem, ob im gegebenen Fall ein Reading oder der Definitionsstatus gesetzt wird, haben die Übergabeparameter verschiedene Werte:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Funktionsparameter!! Wert beim Setzen eines Readings !! Wert beim Setzen eines Definitionsstatus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | Die Hashreferenz der betreffenden Gerätedefinition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$time&amp;lt;/code&amp;gt;|| Der Zeitstempel auf welchen das Reading &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt; gesetzt werden soll. Das Ergebnis entspricht dem Rückgabewert der Funktion || Der aktuelle Zeitstempel zum jetzigen Zeitpunkt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt;|| Der Name des Readings, welches auf einen neuen Wert gesetzt werden soll. || Statischer Wert &amp;quot;STATE&amp;quot; um anzuzeigen, dass es sich um den Definitionsstatus handelt, welcher gesetzt werden soll (&amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; || Den Wert, welchen das Reading &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt; annehmen soll. || Den Wert, welchen die Gerätedefinition als Status annehmen soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn via &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; ein Reading gesetzt wird, kann die X_State-Funktion das Setzen dieses Readings durch die Rückgabe einer aussagekräftigen Fehlermeldung unterbinden. Sofern &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben wird, wird das entsprechende Reading auf den übergebenen Status gesetzt.&lt;br /&gt;
&lt;br /&gt;
Wenn via &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; der Definitionsstatus gesetzt wird, wird die X_State-Funktion erst nach dem Setzen des Status aufgerufen. Man kann dabei zwar eine Fehlermeldung zurückgeben, der Status wird aber dennoch übernommen. Die Fehlermeldung wird lediglich dem Nutzer angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_State($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $time, $readingName, $value ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return undef if($readingName &amp;quot;STATE&amp;quot; || $value ne &amp;quot;inactive&amp;quot;);&lt;br /&gt;
	readingsSingleUpdate($hash, &amp;quot;state&amp;quot;, &amp;quot;inactive&amp;quot;, 1);&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Authorize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Authorize($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $client_hash, $type, $arg ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $authorized;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Authorize-Funktion wird von fhem.pl aufgerufen um zu erfragen, ob ein bestimmter Client &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; die Aktion &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; ausführen darf. Auf diese Weise können Module Einfluss nehmen, welcher User welche Funktionen in FHEM nutzen darf. Wenn ein Client eine Aktion ausführen möchte, werden alle Module, die eine Authorize-Funktion implementiert haben, gefragt, ob diese Aktion ausgeführt werden darf. Als Rückgabewert wird das Ergebnis der Überprüfung zurückgegeben, wobei &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (unbekannt / nicht zuständig), &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (erlaubt) oder &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (verboten) zurückgegeben werden können.&lt;br /&gt;
&lt;br /&gt;
Es gibt aktuell folgende &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; Kombinationen, mit denen die Authorize-Funktion aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! $type !! $arg !! Überschrift&lt;br /&gt;
|- &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$type&#039;&#039;&#039; = &amp;quot;cmd&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Befehlsausführung&#039;&#039;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;set Lampe on&amp;quot;&amp;lt;/code&amp;gt; || Jeglicher FHEM-Befehl, der ausgeführt werden soll, wird in &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; hinterlegt, sodass innerhalb einer Authorize-Funktion der Befehl genauer geparst werden kann um zu entscheiden, ob dieser Befehl erlaubt ist, oder nicht.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;perl&amp;quot;&amp;lt;/code&amp;gt; || Ausführen von Perl-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;{ReadingsVal(&amp;quot;Lampe&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;off&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;shell&amp;quot;&amp;lt;/code&amp;gt; || Ausführen von Shell-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;&amp;quot;/opt/fhem/myScript.sh&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$type&#039;&#039;&#039; = &amp;quot;devicename&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sichtbarkeit von Geräten/Definitionen&#039;&#039; &lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;Licht_Wohnzimmer&amp;quot;&amp;lt;/code&amp;gt; || Sichtbarkeit des jeweiligen Gerät/Definition in FHEM. Dies bedeutet konkret die Auffindbarkeit im &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;-Befehl, sowie der Suche via [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wird eine solche Anfrage durch die Authorize-Funktion abgelehnt, ist das entsprechende Gerät bzw. Definition für den jeweiligen Client nicht sichtbar.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== X_Authenticate ====&lt;br /&gt;
{{Link2Forum|Topic=72757|Message=644098}}&lt;br /&gt;
&lt;br /&gt;
== Bereitstellen eines eigenen Befehls (Befehlsmodul) ==&lt;br /&gt;
&lt;br /&gt;
Ein Modul kann primär einen neuen FHEM-Befehl bereitstellen. Man spricht in so einem Fall nicht von einem Gerätemodul, sondern einem Befehlsmodul. Ein solches Befehlsmodul stellt nur einen einzelnen Befehl bereit, der dem Modulnamen entsprechen muss. Nur, wenn der Modulname dem Befehlsname entspricht, kann FHEM das Modul beim ersten Ausführen dieses unbekannten Befehls finden und nachladen.&lt;br /&gt;
&lt;br /&gt;
Der entsprechende Befehl wird dazu in der [[#X_Initialize|Initialize]]-Funktion im globalen Hash &amp;lt;code&amp;gt;[[DevelopmentModuleIntro#Wichtige_globale_Variablen_aus_fhem.pl|%cmds]]&amp;lt;/code&amp;gt; registriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($$) {&lt;br /&gt;
&lt;br /&gt;
    $cmds{X} = { Fn           =&amp;gt; &amp;quot;CommandX&amp;quot;,&lt;br /&gt;
                 Hlp          =&amp;gt; &amp;quot;&amp;lt;argument1&amp;gt; [optional_argument2], print something very useful&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
                 # optionaler Filter für Clientmodule als regulärer Ausdruck&lt;br /&gt;
                 ClientFilter =&amp;gt; &amp;quot;FHEMWEB&amp;quot;&lt;br /&gt;
                };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird der neue Befehl &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; in FHEM registriert. Die Funktion mit dem Namen &amp;lt;code&amp;gt;CommandX&amp;lt;/code&amp;gt; setzt diesen Befehl innerhalb des Moduls um. Desweiteren wird eine kurze Aufrufsyntax mitgegeben, welche beim Aufruf des &amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt;-Befehls dem Nutzer angezeigt wird um als Gedankenstütze zu dienen. Optional kann man mittels &amp;lt;code&amp;gt;ClientFilter&amp;lt;/code&amp;gt; (regulärer Ausdruck für Modulnamen) die Ausführbarkeit nur auf bestimmte Client-Module (wie FHEMWEB oder telnet) beschränken. &lt;br /&gt;
&lt;br /&gt;
Nun muss noch die Funktion &amp;lt;code&amp;gt;CommandX&amp;lt;/code&amp;gt; im Rahmen des Moduls implementiert werden, welche den Befehl &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; umsetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
sub CommandX($$)&lt;br /&gt;
{&lt;br /&gt;
 	my ($client_hash, $arguments) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $output;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden der Befehlsfunktion zwei Parameter übergeben. Zuerst die Hash-Referenz des aufrufenden Clients (sofern manuell ausgeführt, ansonsten &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;) zwecks Rechteprüfung via [[allowed|allowed-Definitionen]]. Anschließend folgen die Aufrufparameter als zusammenhängende Zeichenkette. Die Trennung der einzelnen Argumente obligt der Funktion (bspw. via [[DevelopmentModuleAPI#parseParams|parseParams()]]). Als Funktionsrückgabewert wird eine Ausgabemeldung erwartet, die dem Nutzer angezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
== Pollen von Geräten ==&lt;br /&gt;
Wenn Geräte von sich aus keine Informationen senden sondern abgefragt werden müssen, kann man im Modul die Funktion [[DevelopmentModuleAPI#InternalTimer|InternalTimer()]] verwenden um einen Funktionsaufruf zu einem späteren Zeitpunkt durchführen zu können. Man übergibt dabei den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, sowie den zu übergebenden Parameter. Als zu übergebender Parameter wird üblicherweise der Hash der betroffenen Geräteinstanz verwendet. Damit hat die aufgerufene Funktion Zugriff auf alle wichtigen Daten der Geräteinstanz. Eventuell zusätzlich benötigte Werte können einfach als weitere Internals über den Hash zugänglich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise könnte man für das Abfragen eines Geräts in der [[#X_Define|Define]]-Funktion den Timer folgendermaßen setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
InternalTimer(gettimeofday()+2, &amp;quot;X_GetUpdate&amp;quot;, $hash);	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch in der [[#X_Notify|Notify]]-Funktion auf das Event &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt; reagieren und erst dort, den Timer anstoßen, sobald die Konfiguration komplett eingelesen wurde. Dies ist insbesondere notwendig, wenn man sicherstellen will, dass alle Attribute aus der Konfiguration gesetzt sind, sobald man einen Status-Update initiiert.&lt;br /&gt;
&lt;br /&gt;
In der Funktion &amp;lt;code&amp;gt;X_GetUpdate&amp;lt;/code&amp;gt; selbst wird dann der Timer neu gesetzt, so dass nach einem Intervall die Funktion erneut aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_GetUpdate($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	Log3 $name, 4, &amp;quot;X: GetUpdate called ...&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# neuen Timer starten in einem konfigurierten Interval.&lt;br /&gt;
	InternalTimer(gettimeofday()+$hash-&amp;gt;{Interval}, &amp;quot;X_GetUpdate&amp;quot;, $hash);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innerhalb der Funktion kann man nun das Gerät abfragen und die abgefragten Werte in Readings speichern. Falls das Abfragen der Werte jedoch zu einer Verzögerung und damit zu einer Blockade von FHEM führen kann, ist es möglich, in der GetUpdate-Funktion nur die Aufforderung zum Senden bestimmter Daten an das angeschlossene Gerät zu senden und dann das Lesen über die oben beschriebene [[#X_Read|Read]]-Funktion zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Beschreibung der Timer-Funktion gibt es [[DevelopmentModuleAPI#Timer|hier im Wiki]]&lt;br /&gt;
&lt;br /&gt;
== Logging / Debugging ==&lt;br /&gt;
Um Innerhalb eines Moduls eine Log-Meldung in die FHEM-Logdatei zu schreiben, wird die Funktion [[DevelopmentModuleAPI#Log3|Log3()]] aufgerufen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log3 $name, 3, &amp;quot;X ($name) - Problem erkannt ...&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine genaue Beschreibung zu der Funktion inkl. Aufrufparameter findet man [[DevelopmentModuleAPI#Log3|hier]]. Es ist generell ratsam in der Logmeldung sowohl den Namen des eigenen Moduls zu schreiben, sowie den Namen des Geräts, welche diese Logmeldung produziert, da die Meldung, so wie sie ist, direkt in das Logfile wandert und es für User ohne diese Informationen schwierig ist, die Meldungen korrekt zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Log3() verwendet den Namen der Geräteinstanz um das &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;-Attribut zu prüfen. In der Regel wird bei Modulfunktionen jedoch immer nur der Gerätehash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; übergeben. Um den Namen der Definition zu ermitteln ist es daher notwendig sich diesen aus dem Hash extrahieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für eine einzelne Geräteinstanz das Verbose-Level zu erhöhen, ohne gleich für das gesamte FHEM den globalen Verbose-Level zu erhöhen und damit alle Meldungen zu erzeugen, kann man den Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;NAME&amp;gt; verbose&amp;lt;/code&amp;gt; verwenden. Beispielsweise &amp;lt;code&amp;gt;attr Lichtschalter_Wohnzimmer verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logmeldungen sollten je nach Art und Wichtigkeit für den Nutzer in unterschiedlichen Loglevels erzeugt werden. Es gibt insgesamt 5 Stufen in denen geloggt werden kann. Standardmäßig steht der systemweite Loglevel (&amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;-Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;) auf der Stufe 3. Die Bedeutung der jeweiligen Stufen ist in der {{Link2CmdRef|Lang=de|Anker=verbose}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
Während der Entwicklung eines Moduls kann man für eigene Debug-Zwecke auch die Funktion [[DevelopmentModuleAPI#Debug|Debug()]] verwenden um schnell und einfach Debug-Ausgaben in das Log zu schreiben. Diese sollten in der endgültigen Fassung jedoch nicht mehr vorhanden sein. Sie dienen ausschließlich zum Debugging während der Entwicklung.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Beschreibung der Log-Funktion gibt es [[DevelopmentModuleAPI#Logging|hier im Wiki]].&lt;br /&gt;
&lt;br /&gt;
== Zweistufiges Modell für Module ==&lt;br /&gt;
[[Datei:Zweistufiges Modulkonzept.jpg|mini|rechts|Schematische Darstellung am Beispiel CUL]]&lt;br /&gt;
Es gibt viele Geräte, welche die Kommunikation mit weiteren Geräten mit tlw. unterschiedlichen Protokollen ermöglichen. Das typischste Beispiel bietet hier der [[CUL]], welcher via Funk mit verschiedenen Protokollen weitere Geräte ansprechen kann (z.B. Aktoren, Sensoren, ...). Hier bildet ein Gerät eine Brücke durch die weitere Geräte in FHEM zugänglich gemacht werden können. Dabei werden über einen Kommunikationsweg (z.B. serielle Schnittstelle, TCP, ...) beliebig viele Geräte gesteuert. Typische Beispiele dazu sind:&lt;br /&gt;
&lt;br /&gt;
* [[CUL]]: stellt Geräte mit verschiedenen Kommunikationsprotokollen via Funk bereit (u.a. [[FS20]], [[HomeMatic]], [[Funk-Heizkörperregler_Kurz-Bedienungsanleitung_FHT|FHT]], [[MAX]], ...)&lt;br /&gt;
* [[HMLAN]]: stellt HomeMatic Geräte via Funk bereit&lt;br /&gt;
* [[MAX#MAXLAN|MAXLAN]]: stellt [[MAX|MAX!]] Geräte via Funk bereit&lt;br /&gt;
* [[PanStamp#panStick.2FShield|panStamp]]: stellt weitere panStamp Geräte via Funk bereit&lt;br /&gt;
&lt;br /&gt;
Dabei wird die Kommunikation in 2 Stufen unterteilt:&lt;br /&gt;
* physisches Modul - z.B. 00_CUL.pm - zuständig für die physikalische Kommunikation mit der Hardware. Empfangene Daten müssen einem logischen Modul zugeordnet werden.&lt;br /&gt;
* logische Modul(e) - z.B. 10_FS20.pm - interpretiert protokollspezifische Nachrichten. Sendet protokollspezifische Daten über das physische Modul an die Hardware.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;physisches Modul&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das physische Modul öffnet die Datenverbindung zum Gerät (z.B. CUL) und verarbeitet sämtliche Daten. Es kümmert sich um den Erhalt der Verbindung (bsp. durch Keep-Alives) und konfiguriert das Gerät so, dass eine Kommunikation mit allen weiteren Geräten möglich ist (bsp. Frequenz, Modulation, Kanal, etc.).&lt;br /&gt;
&lt;br /&gt;
Empfangene Nutzdaten werden als Zeichenkette über die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] an logische Module weitergegeben.&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt eine [[#Die_Match-Liste|Match-Liste]] bereit, anhand FHEM die Nachricht einem Modul zuordnen kann, sofern dieses noch nicht geladen sein sollte. Die Match-Liste enthält eine Liste von regulären Ausdrücken und ordnet diese einem Modul zu. Wenn eine Nachricht auf einen solchen regulären Ausdruck passt und das Modul noch nicht geladen ist, lädt FHEM dieses automatisch nach, zwecks Verarbeitung der Nachricht. &lt;br /&gt;
&lt;br /&gt;
Anhand einer bereitgestellten [[#Die_Client-Liste|Client-Liste]] (Auflistung von logischen Modulen) kann FHEM feststellen, welche logischen Module mit dem physischen Modul kommunizieren können. Nur die hier aufgelisteten, logischen Module werden beim Aufruf von [[DevelopmentModuleAPI#Dispatch|Dispatch()]] angesprochen.&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt eine [[#X_Write|Write]]-Funktion zur Verfügung, über die logische Module Daten in beliebiger Form an die Hardware übertragen können. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;logisches Modul&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das logische Modul interpretiert die via Dispatch() übergebene Nachricht (Zeichenkette) durch eine bereitgestellte [[#X_Parse|Parse]]-Funktion und erzeugt entsprechende Readings/Events. Es stellt über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;-/&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Kommandos Steuerungsmöglichkeiten dem Nutzer zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Es stellt FHEM einen [[#Der_Match-Ausdruck|Match-Ausdruck]] (regulärer Ausdruck) zur Verfügung anhand [[DevelopmentModuleAPI#Dispatch|Dispatch()]] ermitteln kann, ob die Nachricht durch das logische Modul verarbeitet werden kann. Nur Nachrichten, welche auf diesen Ausdruck passen, werden an das logische Modul weitergegeben (Aufruf [[#X_Parse|Parse]]-Funktion).&lt;br /&gt;
&lt;br /&gt;
=== Die Client-Liste ===&lt;br /&gt;
&lt;br /&gt;
Die Client-Liste ist eine Auflistung von Modulnamen (genauer: regulären Ausdrücken die auf Modulnamen passen) die in einem physischen Modul gesetzt ist. Damit wird definiert, mit welchen logischen Modulen das physikalische Modul  kommunizieren kann. &lt;br /&gt;
&lt;br /&gt;
Eine Client-Liste ist eine Zeichenkette, welche aus allen logischen Modulnamen besteht. Die einzelnen Namen werden durch einen Doppelpunkt getrennt. Anstatt kompletter Modulnamen können auch reguläre Ausdrücke verwendet werden, die auf mehrere Modulnamen passen (z.B. &amp;lt;code&amp;gt;CUL_.*&amp;lt;/code&amp;gt; um die logischen Module CUL_HM, CUL_MAX, etc. zu verwenden).&lt;br /&gt;
&lt;br /&gt;
Bsp.: Die Client-Liste von dem Modul CUL lautet daher wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FS20:FHT.*:KS300:USF1000:BS:HMS:CUL_EM:CUL_WS:CUL_FHTTK:CUL_HOERMANN:ESA2000:CUL_IR:CUL_TX:Revolt:IT:UNIRoll:SOMFY:STACKABLE_CC:CUL_RFR:CUL_TCM97001:CUL_REDIRECT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle hier aufgelisteten Module können über das Modul CUL Daten empfangen bzw. senden.&lt;br /&gt;
&lt;br /&gt;
Die Client-Liste hat generell folgende Funktion:&lt;br /&gt;
* Die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur Module, welche in der Client-Liste enthalten sind, ob diese die Nachricht verarbeiten können (Prüfung via [[#Der Match-Ausdruck|Match-Ausdruck]])&lt;br /&gt;
* Die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] prüft anhand sämtlicher Client-Listen in FHEM, welches IO-Gerät für ein logisches Gerät nutzbar ist.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise wird die Client-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{Clients} = &amp;quot;FS20:KS300:FHT.*&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann die Client-Liste jedoch auch pro physikalisches Gerät setzen. Eine gesetzte Client-Liste in einem Gerät hat immer Vorrang vor der Liste im Modul-Hash. Eine gerätespezifische Client-Liste wird dann verwendet, wenn bspw. ein Gerät je nach Konfiguration nur bestimmte logische Module bedienen kann. Bspw. kann ein CUL je nach RF-Einstellungen FS20, uvm. oder nur HomeMatic bedienen. In einem solchen Fall wird die Client-Liste im Geräte-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{Clients} = &amp;quot;CUL_HM&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
	# ggf.&lt;br /&gt;
	$hash-&amp;gt;{ClientsKeepOrder} = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In vielen Modulen, welche nach dem zweistufigem Konzept arbeiten, beginnt und endet die Client-Liste mit einem Doppelpunkt. Dies ist ein historisches Überbleibsel, da der Prüfmechanismus die Client-Liste früher auf das Vorhandensein von &amp;lt;code&amp;gt;&#039;&#039;&#039;&amp;lt;u&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt;&amp;lt;/u&amp;gt;&#039;&#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039;&#039;&amp;lt;u&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt;&amp;lt;/u&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt; prüfte. Dies ist nun nicht mehr notwendig. Die einzelnen Modulnamen müssen lediglich durch einen Doppelpunkt getrennt werden.&lt;br /&gt;
&lt;br /&gt;
Wird das Internal &amp;quot;ClientsKeepOrder&amp;quot; auf 1 gesetzt, können in &amp;quot;Clients&amp;quot; keine regulären Ausdrücke mehr angegeben werden. Dies hat einen erheblichen Einfluss, auf die Verarbeitungsdauer und sollte in Betracht gezogen werden.&lt;br /&gt;
&lt;br /&gt;
=== Die Match-Liste ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Sämtliche regulären Ausdrücke in der Match-Liste werden &amp;quot;case insensitive&amp;quot; überprüft. Das bedeutet, dass Groß-/Kleinschreibung nicht berücksichtigt wird.&lt;br /&gt;
&lt;br /&gt;
Um dennoch in einem regulären Ausdruck auf Groß-/Kleinschreibung zu prüfen, kann man dieses mit dem Modifizierer &amp;lt;code&amp;gt;(?-i)&amp;lt;/code&amp;gt; wieder aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my %matchListFHEMduino = (&lt;br /&gt;
    ....&lt;br /&gt;
    &amp;quot;5:FHEMduino_PT2262&amp;quot;   =&amp;gt; &amp;quot;^(?-i)IR.*\$&amp;quot;,&lt;br /&gt;
    ....&lt;br /&gt;
    &amp;quot;13:IT&amp;quot;                =&amp;gt; &amp;quot;^(?-i)i......\$&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe dazu Forumsbeitrag: {{Link2Forum|Topic=33422}}&lt;br /&gt;
}}&lt;br /&gt;
Die Match-Liste ordnet eine Nachrichtensyntax (regulärer Ausdruck) einem Modulnamen zu und wird in einem physikalischen Modul gesetzt. Sollte eine Nachricht vom physikalischen Gerät empfangen werden, die durch kein geladenes Modul verarbeitet werden kann ([[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur alle bisher geladenen Module aus der [[#Die Client-Liste|Client-Liste]]), so wird über die Match-Liste geprüft, welches Modul diese Nachricht verarbeiten kann. Dieses Modul wird anschließend geladen und die Nachricht durch dieses direkt durch Aufruf der [[#X_Parse|Parse]]-Funktion verarbeitet. In dieser Liste findet mittels regulärem Ausdruck eine Zuordnung der Nachrichtenstruktur zum verarbeitenden logischen Modul statt.&lt;br /&gt;
&lt;br /&gt;
Diese Liste wird ausschließlich in der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion verwendet. Sollte keine passendes Modul, welches bereits geladen ist, zur Verarbeitung einer Nachricht gefunden werden, so wird mithilfe der Match-Liste aufgrund der vorliegenden Nachricht das entsprechende Modul ermittelt. Dieses Modul wird dann direkt geladen und die Nachricht wird via [[#X_Parse|Parse]]-Funktion verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Die Match-Liste ist eine Zuordnung von einem Sortierpräfix + Modulname zu einem regulären Ausdruck:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;1:FS20&amp;quot;  =&amp;gt; &amp;quot;^81..(04|0c)..0101a001&amp;quot;,&lt;br /&gt;
    &amp;quot;2:KS300&amp;quot; =&amp;gt; &amp;quot;^810d04..4027a001&amp;quot;,&lt;br /&gt;
    &amp;quot;3:FHT&amp;quot;   =&amp;gt; &amp;quot;^81..(04|09|0d)..(0909a001|83098301|c409c401)..&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Sortierpräfix (&amp;lt;code&amp;gt;&amp;lt;u&amp;gt;1:&amp;lt;/u&amp;gt;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;FS20&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) dient als Sortierhilfe um so die Reihenfolge der Prüfung festzulegen. Bei der Prüfung wird die Match-Liste mittels sort() nach dem Schlüssel (Sortierpräfix + Modulname) sortiert und die regulären Ausdrücke werden dann nacheinander getestet. Daher sollten die präzisesten Ausdrücke immer zuerst getestet werden, sofern es weniger präzise Ausdrücke in der Match-Liste gibt. Dabei ist zu beachten, dass der Sortierpräfix nicht nach numerischen Regeln sortiert wird, sondern zeichenbasierend.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise wird die Match-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
   my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
   $hash-&amp;gt;{MatchList} = { &amp;quot;1:FS20&amp;quot;      =&amp;gt; &amp;quot;^81..(04|0c)..0101a001&amp;quot;,&lt;br /&gt;
                          &amp;quot;2:KS300&amp;quot;     =&amp;gt; &amp;quot;^810d04..4027a001&amp;quot;,&lt;br /&gt;
                          &amp;quot;3:FHT&amp;quot;       =&amp;gt; &amp;quot;^81..(04|09|0d)..(0909a001|83098301|c409c401)..&amp;quot; };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann die Match-Liste, ähnlich wie bei der Client-Liste, auch pro physikalisches Gerät setzen. Dabei hat auch hier die Match-Liste eines Gerätes immer Vorrang vor der Match-Liste aus dem Modul-Hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
   my ($hash, $def) = @_;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
   $hash-&amp;gt;{MatchList} = { &amp;quot;1:CUL_HM&amp;quot; =&amp;gt; &amp;quot;^A....................&amp;quot; };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Der Match-Ausdruck ===&lt;br /&gt;
&lt;br /&gt;
Ein Match-Ausdruck wird in einem logischen Modul gesetzt und dient der Prüfung, ob eine Nachricht durch das eigene Modul via [[#X_Parse|Parse]]-Funktion verarbeitet werden kann. Es handelt sich hierbei um einen einzelnen regulären Ausdruck, den FHEM innerhalb der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion prüft. Nur wenn eine Nachricht via Dispatch() auf diesen Audruck matcht, wird die Parse-Funktion des eigenen Moduls aufgerufen um die Nachricht zu verarbeiten. &lt;br /&gt;
&lt;br /&gt;
Der Hintergrund, warum man den Aufruf mit einem solchen Ausdruck vorher abprüft, liegt in der Möglichkeit, dass ein physikalisches Modul mehrere unterschiedliche logische Module ansprechen kann. So kann FHEM jedes geladene Modul durch diesen Match-Ausdruck prüfen, ob es diese Nachricht verarbeiten kann. Erst, wenn alle geladenen Module, aufgrund einer Prüfung des Ausdrucks, die Nachricht nicht verarbeiten können, wird via [[#Die_Match-Liste|Match-Liste]] ermittelt, welches Modul geladen werden muss um die Nachricht zu verarbeiten. &lt;br /&gt;
&lt;br /&gt;
Der Match-Ausdruck wird in der [[#X_Initialize|Initialize]]-Funktion zur Verfügung gestellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# Dieses Modul verarbeitet FS20 Nachrichten&lt;br /&gt;
	$hash-&amp;gt;{Match} = &amp;quot;^81..(04|0c)..0101a001&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Die vollständige Implementierung ===&lt;br /&gt;
&lt;br /&gt;
Hier nun eine Zusammenfassung beim zweistufigen Modulkonzept in der jeweiligen Stufe implementiert werden muss, damit die Kommunikation funktioniert.&lt;br /&gt;
&lt;br /&gt;
==== physisches Modul ====&lt;br /&gt;
&lt;br /&gt;
Das physische Modul, welches als Kommunikationsbrücke zwischen der Hardware und logischen Modulen fungieren wird, sollte mindestens folgende Funktionen implementieren:&lt;br /&gt;
&lt;br /&gt;
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.&lt;br /&gt;
* [[#X_Define|Define]]-Funktion - Zum öffnen der Datenverbindung zur Hardware (IP-Adresse/serielle Schnittstelle/...).&lt;br /&gt;
* [[#X_Read|Read]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.&lt;br /&gt;
* [[#X_Read|Ready]]-Funktion - Zum Wiederaufbau der Verbindung bei Verbindungsabbruch, bzw. Prüfung auf lesbare Daten bei serieller Schnittstelle unter Windows.&lt;br /&gt;
* [[#X_Write|Write]]-Funktion - Zum Senden von Daten, welche logische Module via [[DevelopmentModuleAPI#IOWrite|IOWrite()]] an die Hardware übertragen möchten.&lt;br /&gt;
* [[#X_Undef|Undef]]-Funktion - Schließen der Verbindung zur Hardware beim Löschen via &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [[#X_Shutdown|Shutdown]]-Funktion - Schließen der Verbindung zur Hardware beim Stopp von FHEM via &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [[#X_DelayedShutdown | DelayedShutdown]]-Funktion - Verzögertes beenden zum Schließen der Verbindung zur Hardware beim Stopp von FHEM via &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:&lt;br /&gt;
&lt;br /&gt;
* [[#Die_Client-Liste|Client-Liste]] - Auflistung aller logischen Module, die über dieses Modul kommunizieren können&lt;br /&gt;
* [[#Die_Match-Liste|Match-Liste]] - Zuordnung von Nachrichtensyntax zu Modul zwecks Autoload-Funktionalität.&lt;br /&gt;
&lt;br /&gt;
==== logisches Modul ====&lt;br /&gt;
&lt;br /&gt;
Das logische Modul, bildet ein einzelnes Gerät ab, über das mit einem physikalisches Modul kommuniziert werden kann. Es sollte mindestens folgende Funktionen implementieren:&lt;br /&gt;
&lt;br /&gt;
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.&lt;br /&gt;
* [[#X_Define|Define]]-Funktion - Speichern des Definition Pointers (siehe [[#X_Parse|Parse-Funktion]])&lt;br /&gt;
* [[#X_Parse|Parse]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.&lt;br /&gt;
* [[#X_Undef|Undef]]-Funktion - Löschen des Definition Pointers beim Löschen via &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:&lt;br /&gt;
&lt;br /&gt;
* [[#Der_Match-Ausdruck|Match-Ausdruck]] - Prüfausdruck, ob eine Nachricht durch dieses Modul verarbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von der Hardware bis zu den logischen Modulen ===&lt;br /&gt;
&lt;br /&gt;
Die Gerätedefinition des physischen Moduls öffnet eine Verbindung zur Hardware (z.B. via [[DevIo]]). Die [[#X_Read|Read]]-Funktion wird bei anstehenden Daten aus der Hauptschleife von fhem.pl aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Die Read-Funktion stellt dabei sicher, dass die Daten&lt;br /&gt;
* komplett (in der Regel über einen internen Puffer in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) und&lt;br /&gt;
* korrekt (z.B. via Prüfung mittels regulärem Ausdruck)&lt;br /&gt;
sind und ruft die globale Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] mit einer kompletten Nachricht auf.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() prüft alle geladenen Module aus der [[#Die_Client-Liste|Client-Liste]] des physikalischen Moduls nach möglichen logischen Modulen zur Verarbeitung. Alle zum Zeitpunkt geladenen Module, die in der Client-Liste aufgeführt sind, werden über den [[#Der_Match-Ausdruck|Match-Ausdruck]] geprüft, ob sie mit der Nachricht etwas anfangen können. Sollte bei einem logischen Modul der Match-Ausdruck passen, so wird die entsprechende [[#X_Parse|Parse]]-Funktion des logischen Moduls aufgerufen. Sofern keine passendes Modul gefunden wurde, um die Nachricht zu verarbeiten, wird in der [[#Die_Match-Liste|Match-Liste]] im Geräte- bzw. Modul-Hash der physischen Gerätedefinition nach dem passenden Modul gesucht. Sollte es darin ein Modul geben, was diese Art von Nachricht verarbeiten kann, so wird versucht dieses Modul zu laden um nun die Nachricht via Parse-Funktion zu verarbeiten. Es erfolgt in diesem Fall keine Vorprüfung durch den Match-Ausdruck.&lt;br /&gt;
&lt;br /&gt;
Durch Dispatch() wird nun die [[#X_Parse|Parse]]-Funktion des gefundenen logischen Moduls aufgerufen. Diese&lt;br /&gt;
* interpretiert die übergebene Nachricht,&lt;br /&gt;
* versucht eine existierende Gerätedefinition in FHEM zu finden (z.B. mittels Definition Pointer), für welche die Nachricht addressiert ist,&lt;br /&gt;
* setzt alle [[#Readings|Readings]] für die gefundene Gerätedefinition via [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen,&lt;br /&gt;
* gibt den Namen der logischen Definition zurück, welche die Nachricht verarbeitet hat.&lt;br /&gt;
&lt;br /&gt;
Sollte keine passende Gerätedefinition für die entsprechende Nachricht existieren (Adresse/ID/Kanal/...), wird der Gerätename &amp;quot;UNDEFINED&amp;quot; inkl. einem passenden &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Statement zurückgegeben, um die Definition durch [[autocreate]] erzeugen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Es findet während der Verarbeitung einer Nachricht durch Dispatch()/Parse-Funktion keine sofortige Eventverarbeitung (via [[DevelopmentModuleAPI#Dispatch|DoTrigger()]]) statt, wenn die [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen verwendet werden.&lt;br /&gt;
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() triggert das Event-Handling für das von der Parse-Funktion zurückgegebene logische Device selbstständig nach Abschluss der Parse-Funktion.&lt;br /&gt;
&lt;br /&gt;
Optional führt die Funktion Dispatch() eine Überprüfung auf Nachrichtenduplikate beim Einsatz von mehreren IO-Geräten durch. Dazu wird eine implementierte [[#X_Fingerprint|Fingerprint]]-Funktion im physischen oder logischen Modul benötigt. Sollte der Fingerprint einer Nachricht innerhalb einer bestimmten Zeit (globales Attribut &amp;lt;code&amp;gt;dupTimeout&amp;lt;/code&amp;gt;, standardmäßig 500ms) bereits empfangen worden sein, so wird die Nachricht verworfen. Dies ist insbesondere bei funkbasierter Hardware notwendig, wenn mehrere Empfänger die selbe Nachricht empfangen.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von den logischen Modulen bis zur Hardware ===&lt;br /&gt;
&lt;br /&gt;
Um von einem logischen Modul eine Nachricht an die Hardware senden zu können, muss zunächst im logischen Gerät ein passenden IO-Gerät ausgewählt sein. Dazu muss die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] ein entsprechendes IO-Gerät auswählen und in &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt; setzen. Dieser Aufruf wird üblicherweise in der [[#X_Define|Define]]-Funktion des logischen Moduls ausgeführt. Erst, wenn ein IO-Gerät ausgewählt wurde, können Daten über das physikalische Gerät an die Hardware übermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten ruft das logische Modul die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] samt Daten auf. Diese ruft für das entsprechende IO-Gerät die [[#X_Write|Write]]-Funktion auf und übergibt die Daten zum Schreiben an das physikalische Modul. Die Write-Funktion kümmert sich nun um die Übertragung der Daten an die Hardware. &lt;br /&gt;
&lt;br /&gt;
Keine direkten Zugriffe zwischen dem logischen und dem physischen Gerät gibt (d.h. keine direkten Aufrufe von Funktionen, kein direktes Überprüfen von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;-Inhalten, ...), so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie bei der [[RFR_CUL|RFR]]-Funktionalität) oder mittels [[FHEM2FHEM]] im RAW-Modus zwei FHEM-Installationen verbunden werden und die logischen Geräte können dennoch kommunizieren.&lt;br /&gt;
&lt;br /&gt;
=== Automatisches Anlegen von logischen Gerätedefinitionen (autocreate) ===&lt;br /&gt;
&lt;br /&gt;
Das logische Modul kann im Rahmen der [[#X_Parse|Parse]]-Funktion eine neue Gerätedefinition anlegen, sofern eine passende Definition nicht existieren sollte. Die Parse-Funktion gibt generell den Namen der logischen Gerätedefinition zurück, für welche die Nachricht verarbeitet wurde. Sollte keine passende Definition gefunden werden, so muss die Parse-Funktion folgenden Rückgabewert liefern (zusammenhängende Zeichenkette):&lt;br /&gt;
&lt;br /&gt;
 UNDEFINED &#039;&#039;&amp;amp;lt;Namensvorschlag&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Define-Parameter...&amp;amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sollte also bspw. im Rahmen der Parse-Funktion zu Modul X eine Nachricht nicht einer existierenden Gerätedefinition zugeordnet werden können, so muss ein Namensvorschlag erstellt werden der eine eindeutige Komponente wie bspw. eine Adresse/ID/Kanal-Nr enthält. In der Regel wird hier immer der Modulname zusammen mit der eindeutigen Komponente, durch einen Unterstrich getrennt, verwendet (Bsp: &amp;lt;code&amp;gt;X_4834&amp;lt;/code&amp;gt;). Der Modulname ist in der Regel immer der, des eigenen Moduls. In besonderen Fällen kann man hier auch einen abweichenden Modulnamen angeben. Dies wird bspw. bei den [[PanStamp#FHEM-Module.2FDevice_Definition_Files|SWAP-Modulen]] eingesetzt. Als Define-Parameter müssen alle notwendigen Parameter angegeben werden, die beim Aufruf des &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehls notwendig sind, damit eine neu angelegte Gerätedefinition Nachrichten zu dieser eindeutigen Adresse Daten verarbeitet. Dazu muss mind. die eindeutige Adresse mitgegeben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel für FS20:&lt;br /&gt;
&lt;br /&gt;
 UNDEFINED FS20_0ae42f8 FS20 0ae42 f8&lt;br /&gt;
&lt;br /&gt;
Sobald [[DevelopmentModuleAPI#Dispatch|Dispatch()]] einen solchen Rückgabewert von einer [[#X_Parse|Parse]]-Funktion erhält, wird diese Zeichenkette so wie sie ist via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] als Event für die Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; getriggert.&lt;br /&gt;
&lt;br /&gt;
Sofern der Nutzer das Modul [[autocreate]] verwendet (definiert hat), kümmert sich dieses nun um das Anlegen einer entsprechenden Gerätedefinition. Es lauscht dabei auf generierte Events der Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; via [[#X_Notify|Notify]]-Funktion. Der Nutzer kann dabei das Verhalten von autocreate durch entsprechende Parameter beeinflussen.&lt;br /&gt;
&lt;br /&gt;
Das Modul, für welches autocreate eine neue Definition anlegen möchte, kann das Verhalten durch entsprechende Parameter im Modul-Hash beeinflussen. Dabei gilt, dass gesetzte Attribute durch den Nutzer generell Vorrang haben. Die entsprechenden Parameter werden dabei im Rahmen der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	$hash-&amp;gt;{AutoCreate} = {&amp;quot;X_.*&amp;quot;  =&amp;gt; { ATTR   =&amp;gt; &amp;quot;event-on-change-reading:.* event-min-interval:.*:300&amp;quot;,&lt;br /&gt;
	                                    FILTER =&amp;gt; &amp;quot;%NAME&amp;quot;,&lt;br /&gt;
	                                    GPLOT  =&amp;gt; &amp;quot;temp4hum4:Temp/Hum,&amp;quot;,&lt;br /&gt;
	                                    autocreateThreshold =&amp;gt; &amp;quot;2:140&amp;quot;&lt;br /&gt;
					  }&lt;br /&gt;
	                      };&lt;br /&gt;
			    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei wird unterhalb von &amp;lt;code&amp;gt;$hash-&amp;gt;{AutoCreate}&amp;lt;/code&amp;gt; eine Liste angelegt, wo einem regulären Ausdruck für einen anzulegenden Definitionsnamen entsprechende Optionen zugeordnet werden. Sobald durch autocreate eine Gerätedefintion angelegt wird, auf den ein hier gelisteter Ausdruck matcht, so werden die zugeordneten Optionen berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
Hier eine Auflistung aller möglichen Optionen und ihrer Bedeutung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Optionsname !! Beispiel !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;ATTR&amp;lt;/code&amp;gt;|| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&amp;quot;event-on-change-reading:.* event-min-interval:.*:300&amp;quot;&amp;lt;/code&amp;gt; || Eine Auflistung von Attributen, die nach dem Anlegen einer Definition zusätzlich gesetzt werden. Es handelt sich hierbei um eine Leerzeichen-separierte Liste von Doppelpunkt-getrennten Tupels mit Attributname und -wert.&lt;br /&gt;
&lt;br /&gt;
Für das dargestellte Beispiel bedeutet dies, dass nach dem Anlegen der Definition folgende FHEM-Befehle zusätzlich ausgeführt werden:&lt;br /&gt;
&lt;br /&gt;
 attr &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; event-on-change-reading .*&lt;br /&gt;
 attr &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; event-min-interval .*:300&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&amp;quot;%NAME&amp;quot;&amp;lt;/code&amp;gt;|| Sofern in der autocreate-Definiton das Attribut &amp;lt;code&amp;gt;filelog&amp;lt;/code&amp;gt; entsprechend durch den Nutzer gesetzt ist, wird eine zugehörige FileLog-Definition angelegt. Diese Option setzt den dabei benutzten Filter-Regexp, der beim Anlegen der FileLog-Definition gesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Dabei werden folgende Platzhalter durch die entsprechenden Werte der neu angelegten Gerätedefinition ersetzt:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;%NAME&amp;lt;/code&amp;gt; - wird ersetzt durch den Definitionsnamen&lt;br /&gt;
* &amp;lt;code&amp;gt;%TYPE&amp;lt;/code&amp;gt; - wird ersetzt durch den Modulnamen&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&amp;quot;temp4hum4:Temp/Hum,&amp;quot;&amp;lt;/code&amp;gt; || Sofern eine FileLog-Definition angelegt wurde, kann man weiterführend dazu eine passende SVG-Definition erzeugen um Daten aus dem erzeugten FileLog zu visualisieren. Ein typischer Fall sind hierbei Temperatursensoren, wo es sinnvoll sein kann, einen passenden SVG-Plot mit Temperatur/Luftfeuchtigkeit direkt anzulegen.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich hierbei um eine kommaseparierte Auflistung von gplot-Dateinamen und optionalen Label-Texten durch einen Doppelpunkt getrennt. Im genannten Beispiel entspricht &amp;lt;code&amp;gt;temp4hum4&amp;lt;/code&amp;gt; der zu verwendenden GnuPlot-Datei und &amp;lt;code&amp;gt;Temp/Hum&amp;lt;/code&amp;gt; dem zu verwendenden Label ([[SVG]] Attribut &amp;lt;code&amp;gt;label&amp;lt;/code&amp;gt;). Das Label wird auch durch FileLog verwendet als Link-Text zum entsprechenden SVG Plot. Alternativ kann auch nur die entsprechende GnuPlot-Datei anegeben werden ohne Label. Für jede angegebene GnuPlot-Datei wird anschließend eine entsprechende SVG-Definition erzeugt mit der vorher erzeugten FileLog-Definition als Datenquelle.&lt;br /&gt;
&lt;br /&gt;
Der gesamte Inhalt der &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt;-Option wird beim Anlegen einer FileLog-Definition dem Attribut &amp;lt;code&amp;gt;logtype&amp;lt;/code&amp;gt; als Wert plus dem Text &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; zugewiesen. Daher muss der Inhalt der Option &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; immer mit einem Komma enden. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&amp;quot;2:10&amp;quot;&amp;lt;/code&amp;gt; || Definiert, wie viele Aufrufe (im Bsp: &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;) von autocreate innerhalb welcher Zeit (im Bsp: &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; Sek.) stattfinden müssen, bevor die Gerätedefinition tatsächlich durch autocreate angelegt wird. Dadurch kann das ungewollte Anlegen von Geräten verhindert werden die tatsächlich nicht in Echt existieren. Aufgrund von Funkstörungen kann es durchaus zum ungewollten Anlegen einer Definition kommen. Diese Funktion lässt eine Definition erst zu wenn innerhalb einer vorgegeben Zeit eine Mindestzahl an Nachrichten eintrifft.&lt;br /&gt;
&lt;br /&gt;
Die erste Zahl stellt dabei die Mindestanzahl an Nachrichten dar. Die Zweite Zahl stellt die Zeit in Sekunden dar, in der die Mindestanzahl an Nachrichten erreicht werden muss um eine entsprechende Gerätedefinition anzulegen. &lt;br /&gt;
&lt;br /&gt;
Sofern diese Option nicht gesetzt ist, wird standardmäßig &amp;lt;code&amp;gt;2:60&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
Diese Option kann durch den Anwender über das Attribut &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; übersteuert werden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;noAutocreatedFilelog&amp;lt;/code&amp;gt;|| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;|| Flag. Sofern gesetzt, wird keine FileLog- und ggf. SVG-Definition erzeugt. Selbst wenn der Nutzer durch entsprechende Attribute das Anlegen wünscht. Diese Option ist sinnvoll für Module bzw. Geräte die keine Readings erzeugen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Die Wahl der vorangestellten Nummer für den Dateinamen eines neuen Moduls hat keine Bedeutung mehr, es sei denn die Nummer ist 99. Module, die mit 99_ beginnen, werden von FHEM automatisch geladen. Module mit einer anderen Nummer nur wenn ein &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl dafür sorgt, dass das Modul geladen wird.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Modul Initialisierungsdaten benötigt, sollten diese im Modul selbst enthalten sein. Eine zusätzliche Datei oder sogar ein Unterverzeichnis mit mehreren Dateien ist bei FHEM nicht üblich und sollte bei Modulen, die mit FHEM ausgeliefert werden nur in Rücksprache mit Rudolf König angelegt werden, da sie sonst bei einem Update nicht verteilt werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
Wenn man weitere Details wissen möchte, ist ein erster sinnvoller Schritt ein Blick in die Datei fhem.pl. Dort sieht man im Perl-Code wie die Module aufgerufen werden, was vorher passiert und was danach. Am Anfang der Datei (ca. ab Zeile 130) findet man beispielsweise eine Liste der globalen Variablen, die den Modulen zur Verfügung stehen sowie Details zu den wichtigen Hashes %modules und %defs. Wer mit Perl noch nicht so gut klar kommt, dem hilft eventuell ein Blick auf die Perldoc Website[http://perldoc.perl.org/] oder in das Perl-Buch seiner Wahl. Auch die FHEM {{Link2CmdRef}} sollte nicht unterschätzt werden. Es stehen oft mehr interessante Details auch für Modulentwickler darin als man zunächst vermuten könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hello World&amp;quot; Beispiel ==&lt;br /&gt;
&lt;br /&gt;
98_Hello.pm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
package main;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my %Hello_gets = (&lt;br /&gt;
	&amp;quot;whatyouwant&amp;quot;	=&amp;gt; &amp;quot;can&#039;t&amp;quot;,&lt;br /&gt;
	&amp;quot;whatyouneed&amp;quot;	=&amp;gt; &amp;quot;try sometimes&amp;quot;,&lt;br /&gt;
	&amp;quot;satisfaction&amp;quot;  =&amp;gt; &amp;quot;no&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
sub Hello_Initialize {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{DefFn}      = \&amp;amp;Hello_Define;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn}    = \&amp;amp;Hello_Undef;&lt;br /&gt;
    $hash-&amp;gt;{SetFn}      = \&amp;amp;Hello_Set;&lt;br /&gt;
    $hash-&amp;gt;{GetFn}      = \&amp;amp;Hello_Get;&lt;br /&gt;
    $hash-&amp;gt;{AttrFn}     = \&amp;amp;ello_Attr;&lt;br /&gt;
    $hash-&amp;gt;{ReadFn}     = \&amp;amp;Hello_Read;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
          &amp;quot;formal:yes,no &amp;quot;&lt;br /&gt;
        . $readingFnAttributes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Define($$) {&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    my @param = split(&#039;[ \t]+&#039;, $def);&lt;br /&gt;
    &lt;br /&gt;
    if(int(@param) &amp;lt; 3) {&lt;br /&gt;
        return &amp;quot;too few parameters: define &amp;lt;name&amp;gt; Hello &amp;lt;greet&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    my $hash-&amp;gt;{name}  = $param[0];&lt;br /&gt;
    my $hash-&amp;gt;{greet} = $param[2];&lt;br /&gt;
    &lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Undef($$) {&lt;br /&gt;
    my ($hash, $arg) = @_; &lt;br /&gt;
    # nothing to do&lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Get($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;get Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	if(!$Hello_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if($attr{$name}{formal} eq &#039;yes&#039;) {&lt;br /&gt;
	    return $Hello_gets{$opt}.&#039;, sir&#039;;&lt;br /&gt;
    }&lt;br /&gt;
	return $Hello_gets{$opt};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Set($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;set Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @param);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($Hello_gets{$opt})) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
    $hash-&amp;gt;{STATE} = $Hello_gets{$opt} = $value;&lt;br /&gt;
    &lt;br /&gt;
	return &amp;quot;$opt set to $value. Try to get it.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub Hello_Attr(@) {&lt;br /&gt;
	my ($cmd,$name,$attr_name,$attr_value) = @_;&lt;br /&gt;
	if($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
        if($attr_name eq &amp;quot;formal&amp;quot;) {&lt;br /&gt;
			if($attr_value !~ /^yes|no$/) {&lt;br /&gt;
			    my $err = &amp;quot;Invalid argument $attr_value to $attr_name. Must be yes or no.&amp;quot;;&lt;br /&gt;
			    Log 3, &amp;quot;Hello: &amp;quot;.$err;&lt;br /&gt;
			    return $err;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
		    return &amp;quot;Unknown attr $attr_name&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=begin html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;Hello&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Hello&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;i&amp;gt;Hello&amp;lt;/i&amp;gt; implements the classical &amp;quot;Hello World&amp;quot; as a starting point for module development. &lt;br /&gt;
    You may want to copy 98_Hello.pm to start implementing a module of your very own. See &lt;br /&gt;
    &amp;lt;a href=&amp;quot;http://wiki.fhem.de/wiki/DevelopmentModuleIntro&amp;quot;&amp;gt;DevelopmentModuleIntro&amp;lt;/a&amp;gt; for an &lt;br /&gt;
    in-depth instruction to your first module.&lt;br /&gt;
    &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-define&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Define&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; Hello &amp;amp;lt;greet&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Example: &amp;lt;code&amp;gt;define HELLO Hello TurnUrRadioOn&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        The &amp;quot;greet&amp;quot; parameter has no further meaning, it just demonstrates&lt;br /&gt;
        how to set a so called &amp;quot;Internal&amp;quot; value. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#define&amp;quot;&amp;gt;commandref#define&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the define command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-set&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Set&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;set &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;set&amp;lt;/i&amp;gt; any value to any of the following options. They&#039;re just there to &lt;br /&gt;
        &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; them. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#set&amp;quot;&amp;gt;commandref#set&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the set command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Options:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;satisfaction&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;no&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouwant&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;can&#039;t&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouneed&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;try sometimes&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-get&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Get&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;get &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; the value of any of the options described in &lt;br /&gt;
        &amp;lt;a href=&amp;quot;#Helloset&amp;quot;&amp;gt;paragraph &amp;quot;Set&amp;quot; above&amp;lt;/a&amp;gt;. See &lt;br /&gt;
        &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#get&amp;quot;&amp;gt;commandref#get&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the get command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-attr&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Attributes&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;attr &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;attribute&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#attr&amp;quot;&amp;gt;commandref#attr&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the attr command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Attributes:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;formal&amp;lt;/i&amp;gt; no|yes&amp;lt;br&amp;gt;&lt;br /&gt;
                When you set formal to &amp;quot;yes&amp;quot;, all output of &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; will be in a&lt;br /&gt;
                more formal language. Default is &amp;quot;no&amp;quot;.&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der HTML-Code zwischen den Tags &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt; dient zur Generierung der commandref.html. Der HTML-Inhalt wird automatisch beim Verteilen des Moduls im Rahmen des Update-Mechanismus aus jedem Modul extrahiert und daraus die Commandref in verschiedenen Sprachen erstellt. Eine detaillierte Beschreibung wie ein Commandref-Abschnitt in einem Modul definiert wird, siehe: [[Guidelines zur Dokumentation]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=37115</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=37115"/>
		<updated>2022-01-17T21:19:15Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* FHEM-Modul laden */ Hinweis zu SVN Version aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (z.B. Raspberry) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt änderbarer/updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung auf Stick-Firmware-Seite korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichenden Frequenzen steuerbar sind; so empfangen die &#039;&#039;Somfy&#039;&#039;-Rolladenmotoren beispielsweise auf 433.42 MHz und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;Aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum FHEMduino &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, Link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist momentan (für ordentlich breiten Support müsste man wohl eine CMake-Build-Config hinzufügen - ich sollte hier mal in die Pötte kommen...) nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird eine einfache Empfänger / Sender Kombination verwendet, dann über die Pins:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) - es wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltagstauglichen Zustand haben. Aktuell wird dort die Version 3.5.2 seit 18.01.2022 verteilt.&lt;br /&gt;
&lt;br /&gt;
Mit Version 3.5.x ist die Unterstützung für Geräte mit FSK-Modulation integriert.&lt;br /&gt;
&lt;br /&gt;
Die aktuell in Entwicklung befindlichen Version (3.5.3) kann über folgende Vorgehensweise installiert werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/master&amp;lt;nowiki/&amp;gt;/controls_signalduino.txt&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&amp;lt;code&amp;gt;&amp;lt;nowiki/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Es empfiehlt sich, die Github-Quelle dauerhaft einzutragen: &amp;lt;code&amp;gt;update add https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/master/controls_signalduino.txt&amp;lt;/code&amp;gt;, um weitere Entwicklungs-Updates zu bekommen, und damit das nächste Standard-&amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; nicht die alte Version wieder einspielt.&lt;br /&gt;
&lt;br /&gt;
Das Gerät kann wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen, ist die Syntax (ebenso wird auch vorgegangen wenn der SIGNALduino beispielsweise über ser2net freigeben wird):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 -  &lt;br /&gt;
&lt;br /&gt;
Verbindungsversuche via telnet müssen dieselbe Baudrate verwenden. &lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
Wenn ein miniCUL geflasht werden soll, sind einige Besonderheiten zu beachten. Details dazu in {{Link2Forum|Topic=114413|LinkText=diesem Forenthema}}.&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Die Version 3.4 ist die aktuell stabile Version.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut &amp;lt;code&amp;gt;hardware&amp;lt;/code&amp;gt; auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl &amp;lt;code&amp;gt;availableFirmware&amp;lt;/code&amp;gt; werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut &amp;lt;code&amp;gt;updateChannelFW&amp;lt;/code&amp;gt; kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten Version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut &amp;lt;code&amp;gt;flashCommand&amp;lt;/code&amp;gt; hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen &#039;&#039;Intertechno&#039;&#039;-Funksteckdosen (&#039;&#039;Brennenstuhl&#039;&#039;) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (&amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&lt;br /&gt;
&amp;lt;!-- &amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;  ... markdown lexer not yet available; use pre instead --&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Modul, welches diese Protokolle verarbeitet.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist auch kurz und knapp manuell (also ohne Modul und automatisch angelegtem Gerät).&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes [[notify]]-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich muss in diesem Moment auch eine &amp;lt;code&amp;gt;sub my_sender_trigger_indicate()&amp;lt;/code&amp;gt; definiert werden (z.B. in &amp;lt;code&amp;gt;FHEM/99_myUtils.pm&amp;lt;/code&amp;gt;), die dort z.B. als Test eine Log-Ausgabe (&amp;lt;code&amp;gt;Log3()&amp;lt;/code&amp;gt;) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (&amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Internet-Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise folgende Bits-Bereiche enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Daten-Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich (identisch) erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut &amp;lt;code&amp;gt;WhitelistID&amp;lt;/code&amp;gt; minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die &amp;lt;code&amp;gt;WhitelistID&amp;lt;/code&amp;gt; aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann der Tabelle [[#Unterstützte Geräte|Unterstützte Geräte]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das Signal so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;Rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegebenen Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut &amp;lt;code&amp;gt;ITClock&amp;lt;/code&amp;gt; eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt Geräte-Instanz-spezifische Konfiguration) das &amp;lt;code&amp;gt;ITclock&amp;lt;/code&amp;gt; eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
&lt;br /&gt;
=== Modul-Initialisierung ===&lt;br /&gt;
&lt;br /&gt;
==== Perl-Modul Digest::CRC fehlt ====&lt;br /&gt;
&lt;br /&gt;
Das FHEM-Log kann (bei ab Version 3.5.x ) folgendes enthalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Can&#039;t locate Digest/CRC.pm in @INC (you may need to install the Digest::CRC module) (@INC contains: fhem.p/lib fhem.p/FHEM/lib ./FHEM/lib ./lib ./FHEM ./ /usr/local/FHEM/share/fhem/FHEM/lib /opt/fhem . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/arm-linux-gnueabihf/perl5/5.28 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at ./FHEM/00_SIGNALduino.pm line 28, &amp;lt;$fh&amp;gt; line 1870.&lt;br /&gt;
BEGIN failed--compilation aborted at ./FHEM/00_SIGNALduino.pm line 28, &amp;lt;$fh&amp;gt; line 1870.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Fall ist der Transceiver nicht funktionsfähig - es muss erst Perl-Modul &amp;lt;code&amp;gt;Digest::CRC&amp;lt;/code&amp;gt; (Ubuntu: Package &amp;lt;code&amp;gt;libdigest-crc-perl&amp;lt;/code&amp;gt;) installiert werden und fhem neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration von Firmware/Hardware (Reset usw.) ===&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl im Modul direkt ausgeführt werden können. Sofern möglich, sollte die Abfrage von Werten aus dem Modul allerdings mit den dafür vorgesehenen Kommandos erfolgen, da die Rückmeldungen des &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehls nur im Logfile ab verbose 4 erscheinen. Die Befehle sind nützlich, wenn direkt auf den Microcontroller zugegriffen wird: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: &amp;lt;code&amp;gt;set raw C35&amp;lt;/code&amp;gt; führt ab verbose 4 zu einer Logausgabe folgender Art: &amp;lt;code&amp;gt;Read, msg: C35 = 0D&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die EEPROM Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2 des CC1101)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=37101</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=37101"/>
		<updated>2022-01-12T21:34:12Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Die Client-Liste */ Internal ClientsKeepOrder ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hinweis|Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. }}&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Um neue Geräte, Dienste, o.ä. in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben. Ein Modul wird in FHEM automatisch geladen, wenn ein entsprechendes Device in FHEM definiert wird. Das Modul ermöglicht eine spezifische Kommunikation mit einem physikalischen Gerät, stellt Ergebnisse (&amp;quot;Readings&amp;quot;) und Events innerhalb von FHEM zur Verfügung und erlaubt es, das Gerät mit &amp;quot;Set&amp;quot;-/&amp;quot;Get&amp;quot;-Befehlen zu beeinflussen. Dieser Artikel soll den Einstieg in die Entwicklung eigener Module erleichtern.&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; werden Devices in FHEM basierend auf einem Modul definiert. Dieser Befehl sorgt dafür, dass ein neues Modul bei Bedarf geladen und initialisiert wird. Ein gutes Beispiel ist hierbei die zentrale Konfigurationsdatei &amp;quot;fhem.cfg&amp;quot; in der sämtliche Devices in Form von &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Statements gespeichert sind.&lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen der Name des Moduls und der Name der [[#X_Initialize|Initialisierungsfunktion]]  identisch sein. Das folgende Beispiel soll dies verdeutlichen:&lt;br /&gt;
&lt;br /&gt;
Ein Jeelink USB-Stick könnte beispielsweise mit dem Befehl &amp;lt;code&amp;gt;define JeeLink1 &#039;&#039;JeeLink&#039;&#039; /dev/ttyUSB0@57600&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
In fhem.pl wird der &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl verarbeitet und geprüft, ob ein Modul mit dem Namen &amp;quot;JeeLink&amp;quot; schon geladen ist. Falls nicht, wird ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (z.B. /opt/fhem/FHEM) gesucht und, falls vorhanden, anschließend geladen. &lt;br /&gt;
Danach wird die Funktion &amp;lt;code&amp;gt;&#039;&#039;JeeLink&#039;&#039;_Initialize()&amp;lt;/code&amp;gt; aufgerufen um das Modul in FHEM zu registrieren. Eine Moduldatei muss dazu eine Funktion &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039;_Initialize()&amp;lt;/code&amp;gt; enthalten. Durch den Aufruf dieser Funktion wird FHEM mitgeteilt, welche Funktionalitäten dieses Modul unterstützt und durch welche Perl-Funktionen im Modul selbst diese ausimplementiert werden.&lt;br /&gt;
&lt;br /&gt;
In der Initialisierungsfunktion des Moduls werden die Namen aller weiteren Perl-Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird für jedes Modul ein eigener Hash (genauer &amp;quot;Modul-Hash&amp;quot;) mit entsprechenden Werten gefüllt, der in fhem.pl für jedes Modul entsprechend abgelegt wird. Dadurch weiß FHEM wie dieses Modul anzusprechen ist.&lt;br /&gt;
&lt;br /&gt;
== Grundlegender Aufbau eines Moduls ==&lt;br /&gt;
&lt;br /&gt;
=== Dateiname ===&lt;br /&gt;
&lt;br /&gt;
Ein FHEM-Modul wird als Perl-Modul mit der Dateiendung *.pm abgespeichert. Der Dateiname folgt dabei folgendem Schema:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;&#039;&#039;[&#039;&#039;&#039;Schlüsselnummer&#039;&#039;&#039;]&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;_&amp;lt;/font&amp;gt;&#039;&#039;[&#039;&#039;&#039;Modulname&#039;&#039;&#039;]&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;.pm&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Schlüsselnummer&#039;&#039;&#039; - Eine zweistellige Zahl zwischen 00 - 99. Die Schlüsselnummer hat aktuell keine technische Relevanz mehr. In früheren FHEM-Versionen ist sie relevant für [[#Zweistufiges_Modell_f.C3.BCr_Module|zweistufige Module]] (Reihenfolge für [[DevelopmentModuleAPI#Dispatch|Dispatch()]] um logische Module zu prüfen). Die allgemeine Empfehlung ist hierbei eine Schlüsselnummer eines Moduls zu verwenden, welches eine ähnliche Funktionalität bietet. Die Schlüsselnummer 99 hat hierbei eine besondere Bedeutung, da alle Module mit dieser Schlüsselnummer beim Start von FHEM automatisch geladen werden, selbst, wenn sie in der Konfiguration nicht verwendet werden. Daher wird für myUtils 99 als Schlüsselnummer verwendet (99_myUtils.pm). Module mit der Schlüsselnummer 99 werden im SVN nicht akzeptiert (siehe [[SVN Nutzungsregeln]])&lt;br /&gt;
* &#039;&#039;&#039;Modulname&#039;&#039;&#039; - Der Name des Moduls wie er in FHEM bei dem Anlegen einer Gerätedefinition zu verwenden ist. Der Modulname sollte nur aus den folgenden möglichen Zeichen bestehen: Groß-/Kleinbuchstaben, Zahlen sowie Unterstrich (_)&lt;br /&gt;
&lt;br /&gt;
=== Inhaltlicher Aufbau ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul ist inhaltlich in folgende Abschnitte unterteilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
#  72_MYMODULE.pm &lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
package main;&lt;br /&gt;
&lt;br /&gt;
# Laden evtl. abhängiger Perl- bzw. FHEM-Hilfsmodule&lt;br /&gt;
use HttpUtils;&lt;br /&gt;
use [...]&lt;br /&gt;
&lt;br /&gt;
# FHEM Modulfunktionen&lt;br /&gt;
&lt;br /&gt;
sub MYMODULE_Initialize() {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub MYMODULE_Define() {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# Eval-Rückgabewert für erfolgreiches&lt;br /&gt;
# Laden des Moduls&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Beginn der Commandref&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=item [helper|device|command]&lt;br /&gt;
=item summary Kurzbeschreibung in Englisch was MYMODULE steuert/unterstützt&lt;br /&gt;
=item summary_DE Kurzbeschreibung in Deutsch was MYMODULE steuert/unterstützt&lt;br /&gt;
&lt;br /&gt;
=begin html&lt;br /&gt;
 Englische Commandref in HTML&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=begin html_DE&lt;br /&gt;
 Deutsche Commandref in HTML&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
# Ende der Commandref&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann hierbei von folgender Reihenfolge sprechen:&lt;br /&gt;
&lt;br /&gt;
# Perl-Code, welcher das Modul implementiert&lt;br /&gt;
# Die Zeile &amp;lt;code&amp;gt;1;&amp;lt;/code&amp;gt; nachdem der Perl-Code abgeschlossen ist. Dies dient FHEM der Erkennung, dass das Modul erfolgreich und vollständig geladen wurde. Sollte diese Zeile nicht enthalten sein, wird FHEM beim Laden des Moduls die Fehlermeldung &amp;lt;code&amp;gt;Error:Modul 72_MYMODULE deactivated&amp;lt;/code&amp;gt; in das Logfile schreiben.&lt;br /&gt;
# Commandref zur Dokumentation des Moduls. Diese Dokumentation soll dem User die möglichen Befehle/Attribute/Readings/Events vermitteln. Weitere Informationen und Hinweise findet man in den [[Guidelines zur Dokumentation]].&lt;br /&gt;
&lt;br /&gt;
== Der Hash einer Geräteinstanz ==&lt;br /&gt;
Eine Besonderheit in Perl sind [http://de.wikipedia.org/wiki/Assoziatives_Array#Perl assoziative Arrays], (nicht ganz richtig als &amp;quot;Hash&amp;quot; bezeichnet) in denen die Adressierung nicht über eine Zählvariable erfolgt, sondern über einen beliebigen String. Die internen Abläufe bei der Adressierung führen dazu, dass die Speicherung in und der Abruf aus Hashes relativ langsam ist.&lt;br /&gt;
&lt;br /&gt;
Der zentrale Speicherort für Informationen einer Geräteinstanz bei FHEM ist ein solcher Hash, der seinerseits in fhem.pl von einem globalen Hash referenziert wird. &lt;br /&gt;
&lt;br /&gt;
In fhem.pl werden alle Gerätedefinitionen in dem globalen Hash &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; abgelegt. Der Inhalt von &amp;lt;code&amp;gt;$defs{&#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039;}&amp;lt;/code&amp;gt; in fhem.pl verweist dabei auf den Hash der Geräteinstanz in Form einer Hashreferenz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben (i.d.R. als &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; bezeichnet), welche direkt von fhem.pl aufgerufen werden. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im Frontend als &amp;quot;Internals&amp;quot; angezeigt werden, sowie die Readings des Geräts. &lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt; enthält den Namen der Geräteinstanz, &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt; enthält die Typbezeichnung des Geräts (Modulname)&lt;br /&gt;
&lt;br /&gt;
==Ausführung von Modulen==&lt;br /&gt;
FHEM arbeitet intern nicht parallel, sondern arbeitet alle Aufgaben seriell nacheinander kontinuierlich ab. Daher wäre es ungünstig, wenn Module Daten von einem physikalischen Gerät abfragen wollen und dabei innerhalb der selben Funktion auf die Antwort des Geräts warten. In dieser Zeit, in der FHEM auf die Antwort des Gerätes warten muss, wäre der Rest von FHEM blockiert. Da immer nur eine Aufgabe zur selben Zeit bearbeitet wird, müssen alle weiteren Aufgaben solange warten. Eine Datenkommunikation innerhalb eines Moduls sollte daher immer ohne Blockierung erfolgen. Dadurch kann FHEM die Wartezeit effizient für andere Aufgaben nutzen um bspw. anstehende Daten für andere Module zu verarbeiten. Es gibt in FHEM entsprechende Mechanismen, welche eine &amp;quot;Non-Blocking&amp;quot;-Kommunikation über verschiedene Wege (z.B. seriell, HTTP, TCP, ...) ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Dafür werden in FHEM zwei zentrale Listen gepflegt, in der die Filedeskriptoren der geöffneten Kommunikatonsverbindungen gespeichert sind. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet um Filedeskriptoren auf lesbare Daten zu überprüfen. In FHEM gibt es dazu eine Liste (&amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;), in der die Filedeskriptoren sämtlicher Geräte (z.B. serielle Verbindung, TCP-Verbindung, etc.) gespeichert sind. &lt;br /&gt;
&lt;br /&gt;
In der zentralen Schleife (Main-Loop) von fhem.pl wird mit &amp;lt;code&amp;gt;select()&amp;lt;/code&amp;gt; überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion ([[#X_Read|X_Read]]) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und verarbeitet. Anschließend wird die Schleife weiter ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per &amp;lt;code&amp;gt;select()&amp;lt;/code&amp;gt; überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion ([[#X_Ready|X_Ready]]) implementieren, welche prüft, ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt, beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.&lt;br /&gt;
&lt;br /&gt;
Innerhalb der eigentlichen Lesefunktion (X_Read) werden dann die Daten vom zugehörigen Gerät gelesen, das nötige Protokoll implementiert um die Daten zu interpretieren und Werte in Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
Auch wenn von einem Anwender über einen Get-Befehl Daten aktiv von einem Gerät angefordert werden, sollte nicht blockierend gewartet werden. Eine asynchrone Ausgabe, sobald das Ergebnis vorliegt, ist über [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] möglich. Siehe {{Link2Forum|Topic=43771|Message=357870|LinkText=Beschreibung}} und {{Link2Forum|Topic=43771|Message=360935|LinkText=Beispiel}}. Weitere Anwendungsbeispiele finden sich im  {{Link2Forum|Topic=43052|Message=353477|LinkText=PLEX Modul}} und im überarbeiteten und nicht-blockierenden {{Link2Forum|Topic=42771|Message=348498|LinkText=SYSSTAT Modul}}.&lt;br /&gt;
&lt;br /&gt;
== Wichtige globale Variablen aus fhem.pl ==&lt;br /&gt;
&lt;br /&gt;
FHEM arbeitet mit einer Vielzahl an internen Variablen. Die nun folgenden aufgelisteten Variablen sind die wichtigsten, welche man im Rahmen der Modulprogrammierung kennen sollte:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Variable !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; || Dient der Erkennung für fhem.pl sowie den Modulen, ob FHEM den Initialisierungsvorgang abgeschlossen hat. Beim Starten von FHEM ist &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; gleich &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Erst, wenn das Einlesen der Konfiguration, sowie des State-Files (Readings) abgeschlossen ist, wird &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
Das gleiche Verfahren wird auch bei dem Befehl &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; angewandt. Während &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; ausgeführt wird (Konfiguration löschen, neu einlesen), ist &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; gleich &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dies ist insbesondere in der [[#X_Define|Define]]-Funktion eines Moduls relevant. Durch eine Prüfung auf &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; kann man erkennen, ob eine Definition von Hand (&amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; = 1) oder im Rahmen der Initialisierung (FHEM Start / Rereadcfg =&amp;gt; &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; = 0) erfolgte. Während der Initialisierung stehen bspw. die gesetzten Attribute der Definition noch nicht zur Verfügung und können daher nicht ausgewertet werden (siehe . &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; || In &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; werden sämtliche gesetzten Attribute aller Geräte gespeichert. Diese Datenstruktur wird generell durch den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl verwaltet. Hierbei wird einem Gerätenamen eine Mehrzahl an Attributnamen mit einem Wert zugeordnet. Attribut-Inhalte können über die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] ausgelesen werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; || In &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; wird jedem in FHEM existierendem Befehl die entsprechende Funktion zugewiesen, welche diesen Befehl umsetzt. Module können durch das Eintragen eines Befehlsnamen samt Funktion in &amp;lt;code&amp;gt;%cmds&amp;lt;/code&amp;gt; über die [[#X_Initialize|Initialize]]-Funktion eines Moduls einen (oder mehrere) eigene Befehle in FHEM registrieren.&lt;br /&gt;
&lt;br /&gt;
Die Struktur ist dabei wiefolgt:&lt;br /&gt;
&lt;br /&gt;
  $cmds{&#039;&#039;&amp;amp;lt;Befehlsname&amp;amp;gt;&#039;&#039;} = {  Fn  =&amp;gt; &amp;quot;&#039;&#039;&amp;amp;lt;Funktionsname&amp;amp;gt;&#039;&#039;&amp;quot;,&lt;br /&gt;
                            Hlp =&amp;gt; &amp;quot;&#039;&#039;&amp;amp;lt;Aufrufsyntax&amp;amp;gt;&#039;&#039;&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt;|| Der eigentliche Zweck von &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt; ist dem Nutzer eine Möglichkeit zum Speichern von temporären Daten im globalen Kontext zu ermöglichen. Einige Module verwenden &amp;lt;code&amp;gt;%data&amp;lt;/code&amp;gt; jedoch auch um modul- &amp;amp; geräteübergreifend Daten auszutauschen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; werden sämtliche Gerätedefinitionen, bzw. die Hash-Referenzen auf diese, gespeichert. Hier ist jedem Gerätenamen eine Hash-Referenz zugeordnet.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt; sind alle geladenen Module gelistet mit ihren entsprechenden Initialisierungsdaten (Funktionsnamen, Attribut-Listen, spezielle Einstellungen, ...). Hier wird für jeden Modulname der Modul-Hash aus der [[#X_Initialize|Initialize]]-Funktion gespeichert. &lt;br /&gt;
Desweiteren legen viele Module, welche nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] hier eine Rückwärtszuordnung von Geräteadressen zu Geräte-Hash an.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; sind alle zu prüfenden Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte regelmäßig über eine Aufruf der entsprechenden [[#X_Ready|Ready]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;|| In &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt; sind alle geöffneten Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte, ob der geöffnete Filedeskriptor unter &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt; Daten zum Lesen bereitgestellt hat. Ist dass der Fall, wird die entsprechende [[#X_Read|Read]]-Funktion aufgerufen, um anstehende Daten durch das Modul zu verarbeiten.&lt;br /&gt;
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in &amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt durchaus viele weitere globale Variablen, die jedoch für sehr spezielle Anwendungsfälle und z.T. nur einzelne Module gedacht sind und daher hier nicht aufgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Daten, die ein Modul im Geräte-Hash speichert nennt man Internals. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese &amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt; für den Gerätenamen, welcher beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Diese Daten spielen für FHEM eine sehr wichtige Rolle, da sämtliche gerätespezifischen Daten als Internal im Gerätehash gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Falls Werte wie z.B. ein Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollten, ist eine alternative Möglichkeit die Speicherung in so genannten Attributen. Dann würde man den Define-Befehl so implementieren, dass er kein Intervall übergeben bekommt und statt dessen das Interval als Attribut über den Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
Generell werden alle Werte, welche direkt in der ersten Ebene von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; (Gerätehash) gespeichert werden auf der Detail-Seite einer Definition in der FHEMWEB Oberfläche angezeigt. Es gibt jedoch Ausnahmen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{URL}&amp;lt;/code&amp;gt; - Alle Elemente, welche als Unterelement wieder einen Hash besitzen werden nicht in FHEMWEB dargestellt. Typischerweise speichern Module Daten unter &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}&amp;lt;/code&amp;gt; interne Daten zwischen, die für den User nicht relevant sind, sondern nur der internen Verarbeitung dienen.&lt;br /&gt;
* &amp;lt;code&amp;gt;$hash-&amp;gt;{&#039;&#039;&#039;.&#039;&#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;ELEMENT&amp;lt;/font&amp;gt;}&amp;lt;/code&amp;gt; - Alle Knoten, welche mit einem Punkt beginnen werden in der FHEMWEB Oberfläche nicht angezeigt. Man kann diese Daten jedoch beim Aufruf des [[List|list-Kommandos]] einsehen.&lt;br /&gt;
&lt;br /&gt;
Es gibt bereits vorbelegte Internals welche in FHEM dazu dienen definitionsbezogene Informationen wie bspw. Namen und Readings zu speichern. Dies sind im besonderen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;min-width: 13em;&amp;quot; | Internal !!  Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NAME}&amp;lt;/code&amp;gt;  || Der Definitionsname, mit dem das Gerät angelegt wurde.  &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}&amp;lt;/code&amp;gt;  || Enthält alle aktuell vorhandenen Readings. Daten unterhalb dieses Knotens sollte man nicht direkt manipulieren. Um Readings zu Erzeugen gibt es entsprechende [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NR}&amp;lt;/code&amp;gt;  || Die Positions-Nr. der Definition innerhalb der Konfiguration. Diese dient dazu die Konfiguration in der gleichen Reihenfolge zu speichern, wie die einzelnen Geräte angelegt wurden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt;  || Der Modulname, mit welchem die Definition angelegt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{DEF}&amp;lt;/code&amp;gt;  || Sämtliche Argumente, welche beim &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl nach dem Modulnamen übergeben wurden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{CFGFN}&amp;lt;/code&amp;gt;  || Der Dateiname der Konfigurationsdatei in der diese Definition enthalten ist (sofern nicht in fhem.cfg). Dieser Wert ist nur gefüllt, wenn man mit mehreren Konfigurationsdateien arbeitet, welche dann in fhem.cfg via include-Befehl eingebunden werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt;  || Sofern das Modul Events via [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] verarbeitet enthält jede Definition eine Notify-Order als Zeichenkette bestehend aus dem Notify Order Prefix und dem Definitionsnamen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt &amp;quot;Reihenfolge für den Aufruf der Notify-Funktion beeinflussen&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt;  || Sofern das Modul Events via NotifyFn verarbeitet kann man damit die Definitionen, von denen man Events erhalten will begrenzen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt &amp;quot;Begrenzung der Aufrufe auf bestimmte Geräte&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt;  || Hier wird das zugeordnete IO-Gerät durch [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] gespeichert, welches für den Datentransport und -empfang dieses logischen Gerätes zuständig ist. Dieser Wert existiert nur bei Modulen die nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] arbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt;  || Hier werden alle Events kurzzeitig gesammelt, welche für die Eventverarbeitung anstehen. Insbesondere die [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] speichern hier alle Events zwischen um sie nach Abschluss via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] zu verarbeiten. &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt;  || Wenn die Definition eine Netzwerkverbindung oder serielle Schnittstelle geöffnet hat (z.B. via [[DevIo]]), so wird der entsprechende File-Deskriptor in diesem Internal gespeichert. Damit kann FHEM alle geöffneten Filedeskriptoren der entsprechenden Definition zuordnen um bei ankommenden Daten die Definition via [[DevelopmentModuleIntro#X_Read|Read-Funktion]] damit zu versorgen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt;  || Ähnlich wie &amp;lt;code&amp;gt;$hash-&amp;gt;{FD}&amp;lt;/code&amp;gt;. Sofern die Definition in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; eingetragen ist und ein Fildeskriptor in diesem Internal gesetzt ist, wird bei einer auftretenden Exception bzw. Interrupt die [[DevelopmentModuleIntro#X_Except|Except]]-Funktion des entsprechenden Moduls aufgerufen um darauf zu reagieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Generell sollte man die meisten der hier genannten systemweiten Internals nicht modifizieren, da ansonsten die korrekte Funktionsweise von FHEM nicht mehr garantiert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Daten, welche von einem Gerät gelesen werden und in FHEM in einer für Menschen verständlichen Form zur Verfügung gestellt werden können, werden Readings genannt. Sie geben den Status des Gerätes wieder und erzeugen Events innerhalb von FHEM auf die andere Geräte reagieren können. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}{temperature}{VAL}&amp;lt;/code&amp;gt; für die Temperatur eines Fühlers&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{READINGS}{temperature}{TIME}&amp;lt;/code&amp;gt; für den Zeitstempel der Messung&lt;br /&gt;
&lt;br /&gt;
Für den lesenden Zugriff auf Readings steht die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#ReadingsVal|ReadingsVal()]]&amp;lt;/code&amp;gt; zur Verfügung. Ein direkter Zugriff auf die Datenstruktur sollte nicht vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Readings werden im Statefile von FHEM automatisch auf der Festplatte zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen. Dadurch ist der letzte Status eines Gerätes vor einem Neustart nachvollziehbar.&lt;br /&gt;
&lt;br /&gt;
Readings, die mit einem Punkt im Namen beginnen, haben eine funktionale Besonderheit. Sie werden im FHEMWEB nicht angezeigt und können somit als &amp;quot;Permanentspeicher&amp;quot; für kleinere Daten innerhalb des Moduls genutzt werden. Um größere Datenmengen permanent zu speichern sollte man jedoch die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#setKeyValue|setKeyValue()]]&amp;lt;/code&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
Zum Setzen von Readings sollen &lt;br /&gt;
*bei Gruppen von Readings der Funktionsblock &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]&amp;lt;/code&amp;gt; (mehrfach wiederholt), &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]&amp;lt;/code&amp;gt;&lt;br /&gt;
*bei einzelnen Updates die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]&amp;lt;/code&amp;gt; &lt;br /&gt;
aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht. Events erzeugen, je nach Hardwareperformance, spürbare Last auf dem System (siehe [[DevelopmentModuleIntro#X_Notify|NotifyFn]]), das Ändern von Readings ohne dass dabei Events erzeugt werden jedoch nicht.&lt;br /&gt;
&lt;br /&gt;
Eine Sequenz zum Setzen von Readings könnte folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
readingsBulkUpdate($hash, $readingName1, $wert1 );&lt;br /&gt;
readingsBulkUpdate($hash, $readingName2, $wert2 );&lt;br /&gt;
readingsEndUpdate($hash, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Readings zu löschen, wird für die Modulprogrammierung die Funktion &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsDelete|readingsDelete()]]&amp;lt;/code&amp;gt; empfohlen. Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsDelete($hash, $readingsname) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Hinweis|&#039;&#039;&#039;Hintergrundinfo dazu aus dem Forum:&#039;&#039;&#039; {{Link2Forum|Topic=83069|Message=753066}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CommandDeleteReading()&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;deletereading&amp;lt;/code&amp;gt; ist eher fuer den Endbenutzer und seine userReadings gedacht, und macht bei den Modulen die unnoetige Schleife ueber [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wenn der Modulautor beim Aufruf auch &amp;lt;code&amp;gt;$cl&amp;lt;/code&amp;gt; weitergibt, und der Anwender meint, dieses Geraet auf blacklist setzen zu muessen, dann kann das Modul sein eigenes Reading nicht entfernen, und das ist kontraproduktiv.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
FHEM verfügt über einen Event-Mechanismus um Änderungen verschiedenster Art an einzelne oder alle Definitionen mitzuteilen. Jedes Modul (und damit alle Definitionen dieses Moduls) können auf Events von FHEM selber (Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;) oder von anderen Definitionen reagieren und dadurch selber aktiv werden. Ein Event wird innerhalb von FHEM als Zeichenkette behandelt.&lt;br /&gt;
&lt;br /&gt;
Events sind grundsätzlich immer definitionsbezogen. Das bedeutet, dass ein Event immer in Verbindung mit einem Definitionsnamen erzeugt wird. Jede Definition, welche ein Event verarbeitet, erhält den Definitions-Hash (&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) der auslösenden Definition.&lt;br /&gt;
&lt;br /&gt;
Events werden typischerweise bei der Erstellung von Readings implizit für jedes einzelne Reading erzeugt. Es gibt jedoch auch Events die nichts mit Readings zu tun haben um anderweitige Änderungen bekannt zu geben.&lt;br /&gt;
&lt;br /&gt;
Eigene Events können in FHEM mit der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] erzeugt werden. Um auf Events in einem Modul reagieren zu können, muss eine [[#X_Notify|Notify]]-Funktion implementiert sein. Sobald ein oder mehrere Events für eine Definition getriggert werden, prüft FHEM, welche Definitionen über Events der auslösenden Definition informiert werden möchten. Diese werden dann nacheinander in einer bestimmten Reihenfolge durch Aufruf der [[#X_Notify|Notify]]-Funktion über anstehende Events in Kenntnis gesetzt. Es obliegt dann dem jeweiligen Modul, wie es auf die Events reagiert.&lt;br /&gt;
&lt;br /&gt;
=== globale Events ===&lt;br /&gt;
&lt;br /&gt;
Als &amp;quot;globale Events&amp;quot; werden alle Events bezeichnet, die durch die Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; erzeugt werden. Es handelt sich hierbei um Events die Strukturänderungen in der Konfiguration, als auch systemweite Ereignisse zu FHEM selbst signalisieren.&lt;br /&gt;
&lt;br /&gt;
Hier eine kurze Zusammenfassung, welche Events durch &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; getriggert werden können:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Allgemeine Events:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event-Text !! Beschreibung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;INITIALIZED&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Start von FHEM ist abgeschlossen. Sämtliche Definitionen und Attribute wurden aus der Konfiguration (fhem.cfg oder configDB) eingelesen, sowie sämtliche Readings sind aus dem State-File eingelesen und stehen nun voll umfänglich zur Verfügung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;REREADCFG&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Konfiguration wurde erneut eingelesen. Dies bedeutet, es wurden alle Definitionen/Attribute/Readings aus FHEM entfernt und durch Einlesen der Konfiguration neu angelegt. (FHEM-Befehl: &amp;quot;rereadcfg&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;SAVE&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die laufende Konfiguration soll gespeichert werden (in fhem.cfg oder configDB). Dieses Event wird &#039;&#039;&#039;VOR&#039;&#039;&#039; dem Speichern der Konfiguration getriggert. Sobald der Trigger verarbeitet wurde, beginnt das Speichern der Konfiguration. (FHEM-Befehl: &amp;quot;save&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;SHUTDOWN&amp;lt;/code&amp;gt;&#039;&#039;&#039; || FHEM wird sich beenden. (FHEM-Befehl: &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt; DELAYEDSHUTDOWN &amp;lt;/code&amp;gt;&#039;&#039;&#039; || FHEM wird sich beenden. (FHEM-Befehl: &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde ein Update erfolgreich installiert. (FHEM-Befehl: &amp;quot;update&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Definitionsbezogene Events:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Event-Text !! Beschreibung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;DEFINED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde eine neue Definition mit Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; angelegt. (FHEM-Befehl: &amp;quot;define&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;DELETED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde gelöscht. (FHEM-Befehl: &amp;quot;delete&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;RENAMED &#039;&#039;&amp;lt;Alt&amp;gt;&#039;&#039; &#039;&#039;&amp;lt;Neu&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Alt&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde in den Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Neu&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; umbenannt. (FHEM-Befehl: &amp;quot;rename&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;MODIFIED &#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Definition mit dem Namen &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;Name&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; wurde modifiziert. (FHEM-Befehl: &amp;quot;modify&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;UNDEFINED &#039;&#039;&amp;lt;Name&amp;gt; &amp;lt;Modul&amp;gt; &amp;lt;Define-Parameter&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Es wurde eine Nachricht von einem physikalischen Modul (siehe [[#Zweistufiges Modell für Module|zweistufiges Modulkonzept]]) erhalten, für die keine passende logische Definition in FHEM existiert. Details dazu, siehe dazu Abschnitt [[#Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)|Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Begrenzung von Events ===&lt;br /&gt;
&lt;br /&gt;
Ein Modul, welches Events verarbeitet, kann die Eventverarbeitung auf bestimmte Definitionen begrenzen. Dadurch werden nur Events an das Modul gemeldet (via [[#X_Notify|X_Notify()]]), welche von einer oder mehreren bestimmten Definitionen getriggert wurden. Dadurch werden unnötige Events nicht an das Modul gemeldet und schont somit Ressourcen.&lt;br /&gt;
&lt;br /&gt;
Standardmäßig werden sämtliche Events ohne Begrenzung an ein Modul gemeldet, welches eine [[#X_Notify|Notify]]-Funktion implementiert hat und somit Events verarbeiten kann. Details zur Begrenzung von Events findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].&lt;br /&gt;
&lt;br /&gt;
=== Reihenfolge der Eventverarbeitung ===&lt;br /&gt;
&lt;br /&gt;
Ein getriggertes Event wird nacheinander gegen jede Definition geprüft, deren Modul eine [[#X_Notify|Notify]]-Funktion implementiert hat. Dies bedeutet, jede Definition wird nacheinander durch Aufruf der [[#X_Notify|Notify]]-Funktion mit dem Definitionshash der auslösenden Definition aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Unter bestimmten Umständen kann es erforderlich sein, in diese Reihenfolge einzugreifen. Beispielsweise wenn das eigene Modul und deren Definitionen das Event als letztes oder erstes verarbeiten müssen. Ein Beispiel bietet hierbei das Modul [[dewpoint]], welches Events vor allen anderen Modulen verarbeiten muss.&lt;br /&gt;
&lt;br /&gt;
Details, wie man die Reihenfolge der Eventverarbeitung steuern kann, findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Damit der Nutzer das Verhalten einer einzelnen Gerätedefinition zur Laufzeit individuell anpassen kann, gibt es in FHEM für jede Definition sogenannte Attribute, welche mit dem Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; gesetzt werden können.&lt;br /&gt;
Diese stehen dann dem Modul unmittelbar zur Verfügung um das Verhalten während der Ausführung zu beeinflussen. Attribute werden zusammen mit dem &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl der jeweiligen Definition beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben. Beim Neustart werden die entsprechenden Befehle ausgeführt um alle Definition inkl. Attribute wieder anzulegen. Zur Laufzeit werden Attribute in dem globalen Hash &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; mit dem Definitionsnamen als Index (&amp;lt;code&amp;gt;$attr{$name} = $value&amp;lt;/code&amp;gt;) gespeichert. Ein Attribut mit dem Namen &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; würde beispielsweise mit &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; adressiert. Generell sollte &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; nicht durch direkten Zugriff manipuliert/benutzt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Auslesen von Attributen sollte die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Welche Attribute ein Modul unterstützt muss in der Funktion &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]&amp;lt;/code&amp;gt; durch Setzen von &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; bekannt gemacht werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Wenn beim Setzen von Attributen in einer Gerätedefinition entsprechende Werte geprüft werden sollen oder zusätzliche Funktionalitäten implementiert werden müssen, dann muss dies in der Funktion &amp;lt;code&amp;gt;[[#X_Attr|X_Attr]]&amp;lt;/code&amp;gt; (siehe unten) implementiert werden. Hier kann man bspw. einen Syntaxcheck für Attribut-Werte implementieren um ungültige Werte zurückzuweisen.&lt;br /&gt;
&lt;br /&gt;
== Modulfunktionen ==&lt;br /&gt;
&lt;br /&gt;
Damit fhem.pl ein Modul nutzen kann, muss dieses entsprechende Funktionen mit einer vorgegebenen Aufrufsyntax implementieren. Durch die Bekanntgabe dieser modulspezifischen Funktionen können Daten zwischen fhem.pl und einem Modul entsprechend ausgetauscht werden. Es gibt verschiedene Arten von Funktionen die ein Modul anbieten muss bzw. kann, je nach Funktionsumfang.&lt;br /&gt;
&lt;br /&gt;
=== Die wichtigsten Funktionen in einem Modul ===&lt;br /&gt;
&lt;br /&gt;
Folgende Funktion muss ein Modul mit dem beispielhaften Namen &amp;quot;X&amp;quot; mindestens bereitstellen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
|  [[#X_Initialize|X_Initialize]] || Initialisiert das Modul und gibt den Namen zusätzlicher Modulfunktionen bekannt, sowie modulspezifische Einstellungen. Wird direkt nach dem erfolgreichen Laden des Moduls durch fhem.pl aufgerufen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Funktionen sind die wichtigsten Funktionen, welche je nach Anwendungsfall zu implementieren sind. Es handelt sich hierbei um die wichtigsten Vertreter, welche in den meisten Modulen Verwendung finden. Nicht alle Funktionen machen jedoch in jedem Modul Sinn. Generell sollte auch hier bei jeder Funktion der Modulname vorangestellt werden um ein einheitliches Namensschema zu gewährleisten. Hier die wichtigsten Modulfunktionen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Define|X_Define]] || Wird im Rahmen des &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehls aufgerufen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Undef|X_Undef]] || Wird im Rahmen des &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;-Befehls, sowie &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;-Befehl aufgerufen. Dient zum Abbau von offenen Verbindungen, Timern, etc.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Delete|X_Delete]] || Wird im Rahmen des beim &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;-Befehls aufgerufen wenn das Gerät endgültig gelöscht wird um weiterführende Aktionen vor dem Löschen durchzuführen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Get|X_Get]] || Wird im Rahmen des &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Befehls aufgerufen um Daten vom Gerät abzufragen&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Set|X_Set]]  || Wird im Rahmen des &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;-Befehls aufgerufen um Daten an das Gerät zu senden.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Attr|X_Attr]]  || Wird im Rahmen des &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls aufgerufen um Attributwerte zu prüfen)&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Read|X_Read]]  || Wird durch FHEM aufgerufen, wenn ein gelisteter Filedeskriptor in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; Daten zum Lesen bereitstellt.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Ready|X_Ready]]  || Wird unter Windows durch FHEM aufgerufen um zyklisch einen seriellen Filedeskriptor auf lesbare Daten zu prüfen. Unter Linux dient diese Funktion dem Wiederaufbau verlorener Verbindungen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Notify|X_Notify]]  || Verarbeitet Events von anderen Geräten innerhalb von FHEM&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Rename|X_Rename]] || Wird aufgerufen, wenn ein Gerät umbenannt wird.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Shutdown|X_Shutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_DelayedShutdown | X_DelayedShutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Initialize ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; im Namen muss dabei auf den Namen des Moduls bzw. des definierten Gerätetyps geändert werden. Im Modul mit der Datei &amp;lt;code&amp;gt;36_JeeLink.pm&amp;lt;/code&amp;gt; beispielsweise ist der Name der Funktion &amp;lt;code&amp;gt;JeeLink_Initialize&amp;lt;/code&amp;gt;. Die Funktion wird von fhem.pl nach dem Laden des Moduls aufgerufen und bekommt eine leere Hashreferenz für den Initialisierungsvorgang übergeben. &lt;br /&gt;
&lt;br /&gt;
Dieser Hash muss nun von X_Initialize mit allen modulrelevanten Funktionsnamen gefüllt werden. Anschließend wird dieser Hash durch fhem.pl im globalen Hash &amp;lt;code&amp;gt;%modules&amp;lt;/code&amp;gt; gespeichert. &amp;lt;code&amp;gt;$modules{ModulName}&amp;lt;/code&amp;gt; wäre dabei der Hash für das Modul mit dem Namen &amp;lt;code&amp;gt;ModulName&amp;lt;/code&amp;gt;. Es handelt sich also nicht um den oben beschriebenen Hash der Geräteinstanzen sondern einen Hash, der für jedes Modul existiert und modulspezifische Daten wie bspw. die implementierten Modulfunktionen enthält. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DefFn}                = &amp;quot;X_Define&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{UndefFn}              = &amp;quot;X_Undef&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{DeleteFn}             = &amp;quot;X_Delete&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{SetFn}                = &amp;quot;X_Set&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{GetFn}                = &amp;quot;X_Get&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AttrFn}               = &amp;quot;X_Attr&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ReadFn}               = &amp;quot;X_Read&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ReadyFn}              = &amp;quot;X_Ready&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NotifyFn}             = &amp;quot;X_Notify&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{RenameFn}             = &amp;quot;X_Rename&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ShutdownFn}           = &amp;quot;X_Shutdown&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{DelayedShutdownFn}    = &amp;quot;X_ DelayedShutdown&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine entsprechende Funktion in FHEM bekannt zu machen muss dazu der Funktionsname, wie er im Modul als &amp;lt;code&amp;gt;sub &amp;amp;lt;&#039;&#039;Funktionsname&#039;&#039;&amp;amp;gt;() { ... }&amp;lt;/code&amp;gt; definiert ist, als Zeichenkette in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; gesetzt werden. Dabei sollten die entsprechenden Funktionsnamen immer den Modulnamen (in diesem Beispiel &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;) als Präfix verwenden.&lt;br /&gt;
Auf diese Weise können sämtliche modulspezifisch implementierten Funktionen wie &amp;lt;code&amp;gt;X_Read&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X_Parse&amp;lt;/code&amp;gt; etc. durch Zuweisung an &amp;lt;code&amp;gt;$hash-&amp;gt;{ReadFn}&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;$hash-&amp;gt;{ParseFn}&amp;lt;/code&amp;gt; usw. bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sollten die vom Modul unterstützten Attribute definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{AttrList} =&lt;br /&gt;
  &amp;quot;do_not_notify:1,0 &amp;quot; . &lt;br /&gt;
  &amp;quot;header &amp;quot; .&lt;br /&gt;
  $readingFnAttributes;  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Auflistung aller unterstützten modulspezifischen Attribute erfolgt in Form einer durch Leerzeichen getrennten Liste in &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt;. Es gibt in FHEM globale Attribute, die in allen Gerätedefinitionen verfügbar sind und nur modulspezifische Attribute die jedes Modul via &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; über die eigene Initialize-Funktion setzt.  In fhem.pl werden dann die entsprechenden Attributwerte beim Aufruf eines &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehls in die globale Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&amp;lt;/code&amp;gt;, z.B. &amp;lt;code&amp;gt;$attr{$name}{header}&amp;lt;/code&amp;gt; für das Attribut &amp;lt;code&amp;gt;header&amp;lt;/code&amp;gt; gespeichert. Falls im Modul weitere Aktionen oder Prüfungen beim Setzen eines Attributs nötig sind, dann kann wie im Beispiel oben die [[#X_Attr|Attr]]-Funktion implementiert und in der Initialize-Funktion bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$readingFnAttributes&amp;lt;/code&amp;gt;, die im obigen Beispiel an die Liste der unterstützten Attribute angefügt wird, definiert Attributnamen, die dann zusätzlich gemacht werden, wenn das Modul zum Setzen von Readings die Funktionen &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]&amp;lt;/code&amp;gt; verwendet. In diesen Funktionen werden Attribute wie &amp;lt;code&amp;gt;event-min-interval&amp;lt;/code&amp;gt; oder auch &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; ausgewertet. Für Details hierzu siehe commandref zu {{Link2CmdRef|Anker=readingFnAttributes|Label=readingFnAttributes}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt; [[DevelopmentModuleAPI#parseParams|parseParams()]]&amp;lt;/code&amp;gt; unterstützt Modul-Autoren beim Parsen von Übergabeparametern, welche bei &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; Kommandos an die entsprechenden Modulfunktionen übergeben werden. Dadurch lassen sich auf einfache Weise insbesondere komplexe Parameter (wie bspw. Perl-Ausdrücke) sehr einfach parsen.&lt;br /&gt;
&lt;br /&gt;
Diese Zusatzfunktion kann man in der Initialize-Funktion einfach über folgenden Parameter für [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion modulweit aktivieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sobald es gesetzt ist wird automatisch durch fhem.pl &amp;lt;code&amp;gt;[[DevelopmentModuleAPI#parseParams|parseParams()]]&amp;lt;/code&amp;gt; aufgerufen und die an die [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion übergebenen Parameter ändern sich wie weiter unten in den jeweiligen Funktionen beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Define ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Define-Funktion eines Moduls wird von FHEM aufgerufen wenn der Define-Befehl für ein Geräte ausgeführt wird und das Modul bereits geladen und mit der Initialize-Funktion initialisiert ist. Sie ist typischerweise dazu da, die übergebenen Parameter zu prüfen und an geeigneter Stelle zu speichern sowie einen Kommunikationsweg zum Gerät zu öffnen (z.B. TCP-Verbindung, USB-Schnittstelle o.ä.) oder einen [[#Pollen_von_Geräten|Status-Timer]] zu starten.&lt;br /&gt;
Sie beginnt typischerweise mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	my @a = split( &amp;quot;[ \t][ \t]*&amp;quot;, $def );&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den die im &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl übergebenen Parameter. Welche bzw. wie viele Parameter &lt;br /&gt;
akzeptiert werden und welcher Syntax diese entsprechen müssen ist Sache dieser Funktion. Im obigen Beispiel wird die Argumentzeile &amp;lt;code&amp;gt;$def&amp;lt;/code&amp;gt; in ein Array aufgeteilt (durch Leerzeichen/Tabulator getrennt) und so können die vom Modul bzw. der Define-Funktion erwarteten Werte über das Array der Reihe nach verarbeitet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $name   = $a[0];&lt;br /&gt;
my $module = $a[1];&lt;br /&gt;
my $url    = $a[2];&lt;br /&gt;
my $inter  = 300;&lt;br /&gt;
&lt;br /&gt;
if(int(@a) == 4) { &lt;br /&gt;
	$inter = $a[3]; &lt;br /&gt;
	if ($inter &amp;lt; 5) {&lt;br /&gt;
		return &amp;quot;interval too small, please use something &amp;gt; 5s, default is 300 seconds&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit die übergebenen Werte auch anderen Funktionen zur Verfügung stehen und an die jeweilige Geräteinstanz gebunden sind, werden die Werte typischerweise als Internals im Hash der Geräteinstanz gespeichert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{url} 		= $url;&lt;br /&gt;
$hash-&amp;gt;{Interval}	= $inter;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald alle Parameter korrekt verarbeitet wurden, wird in der Regel die erste Verbindung zum Gerät aufgebaut. Je nach Art des Geräts kann das eine permanente Datenverbindung sein (z.B. serielle Schnittstelle oder TCP-Verbindung) oder das Starten eines regelmäßigen Timers, der zyklisch den Status z.B. via [[HttpUtils|HTTP]] ausliest.&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Define-Funktion Syntax-Probleme der Übergabeparameter festgestellt werden oder es kann bspw. keine Verbindung aufgebaut werden, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn alle Übergabeparameter akzeptiert werden, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Sobald eine Define-Funktion eine Fehlermeldung zurückmeldet, wird der define-Befehl durch FHEM zurückgewiesen und der User erhält die Fehlermeldung, welche die Define-Funktion produziert hat, als Ausgabe zurück.&lt;br /&gt;
&lt;br /&gt;
===== &amp;lt;u&amp;gt;Verfügbarkeit von Attributen&amp;lt;/u&amp;gt; =====&lt;br /&gt;
Während die Define-Funktion ausgeführt wird, sollte man nicht davon ausgehen, dass alle vom Nutzer konfigurierten Attribute via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verfügbar sind. Attribute stehen in der Define-Funktion nur dann zur Verfügung, wenn FHEM sich nicht in der Initialisierungsphase befindet (globale Variable &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; ist wahr; der Nutzer hat die Gerätedefinition modifiziert). Daher sollte man weiterführende Funktion, welche auf gesetzte Attribute angewiesen sind, nur dann in der Define-Funktion starten, wenn &amp;lt;code&amp;gt;$init_done&amp;lt;/code&amp;gt; zutrifft.&lt;br /&gt;
&lt;br /&gt;
Andernfalls sollte man den Aufruf in der Notify-Funktion durchführen sobald &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt; getriggert wurde:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	X_FunctionWhoNeedsAttr($hash) if($init_done);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
	my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
	my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
 &lt;br /&gt;
	return &amp;quot;&amp;quot; if(IsDisabled($ownName)); # Return without any further action if the module is disabled&lt;br /&gt;
 &lt;br /&gt;
	my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
	my $events = deviceEvents($dev_hash, 1);&lt;br /&gt;
&lt;br /&gt;
	if($devName eq &amp;quot;global&amp;quot; &amp;amp;&amp;amp; grep(m/^INITIALIZED|REREADCFG$/, @{$events}))&lt;br /&gt;
	{&lt;br /&gt;
		 X_FunctionWhoNeedsAttr($hash);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die Modulfunktion X_FunctionWhoNeedsAttr() nach dem Start erst aufgerufen, wenn alle Attribute aus der Konfiguration geladen wurden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Aufteilen und Parsen von &amp;lt;code&amp;gt;$def&amp;lt;/code&amp;gt; lässt sich die Funktion [[DevelopmentModuleAPI#parseParams|parseParams()]] verwenden um die einzelnen Argumente einfach zu parsen. Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird parseParams() automatisch aufgerufen und X_Define() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
==== X_Undef ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Undef ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Undef-Funktion wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird oder bei der Abarbeitung des Befehls &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu einliest. Entsprechend müssen in der Funktion typische Aufräumarbeiten durchgeführt werden wie das saubere Schließen von Verbindungen oder das Entfernen von internen Timern, sofern diese im Modul zum Pollen verwendet wurden (siehe Abschnitt [[#Pollen_von_Geräten|Pollen von Geräten]]). &lt;br /&gt;
&lt;br /&gt;
Zugewiesene Variablen im Hash der Geräteinstanz, Internals oder Readings müssen hier nicht gelöscht werden. In fhem.pl werden die entsprechenden Strukturen beim Löschen der Geräteinstanz ohnehin vollständig gelöscht.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Undef($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name) = @_;       &lt;br /&gt;
	DevIo_CloseDev($hash);         &lt;br /&gt;
	RemoveInternalTimer($hash);    &lt;br /&gt;
	return undef;                  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Undef-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn die Undef-Funktion erfolgreich durchgeführt wurde, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht bzw. neu angelegt. Sollte die Undef-Funktion jedoch eine Fehlermeldung zurückgeben, wird der entsprechende Vorgang (&amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;) für dieses Gerät abgebrochen. Es bleibt dann unverändert in FHEM bestehen.&lt;br /&gt;
&lt;br /&gt;
==== X_Delete ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Delete ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Delete-Funktion ist das Gegenstück zur Funktion [[#X_Define|X_Define]] und wird aufgerufen wenn ein Gerät mit dem Befehl &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Gerät in FHEM gelöscht wird, wird zuerst die Funktion [[#X_Undef|X_Undef]] aufgerufen um offene Verbindungen zu schließen, anschließend wird die Funktion X_Delete aufgerufen. Diese dient eher zum Aufräumen von dauerhaften Daten, welche durch das Modul evtl. für dieses Gerät spezifisch erstellt worden sind. Es geht hier also eher darum, alle Spuren sowohl im laufenden FHEM-Prozess, als auch dauerhafte Daten bspw. im physikalischen Gerät zu löschen die mit dieser Gerätedefinition zu tun haben.&lt;br /&gt;
&lt;br /&gt;
Dies kann z.B. folgendes sein:&lt;br /&gt;
&lt;br /&gt;
* Löschen von Dateien im Dateisystem die während der Nutzung dieses Geräts angelegt worden sind.&lt;br /&gt;
* Lösen von evtl. Pairings mit dem physikalischen Gerät &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Delete($$)    &lt;br /&gt;
{                     &lt;br /&gt;
	my ( $hash, $name ) = @_;       &lt;br /&gt;
&lt;br /&gt;
	# Löschen von Geräte-assoziiertem Temp-File&lt;br /&gt;
	unlink($attr{global}{modpath}.&amp;quot;/FHEM/FhemUtils/$name.tmp&amp;quot;;)&lt;br /&gt;
&lt;br /&gt;
	return undef;&lt;br /&gt;
}    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollten im Rahmen der Delete-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur die Delete-Funktion erfolgreich durchgeführt wurde, darf &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht. Sollte die Delete-Funktion eine Fehlermeldung zurückgeben, wird der Löschvorgang abgebrochen und das Gerät bleibt weiter in FHEM bestehen.&lt;br /&gt;
&lt;br /&gt;
==== X_Get ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get ($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $opt, @args ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Get-Funktion wird aufgerufen wenn der FHEM-Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; für eine Definition dieses Moduls ausgeführt wird. Mit &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; werden typischerweise Werte von einem Gerät abgefragt. In vielen Modulen wird auf diese Weise auch der Zugriff auf generierte Readings ermöglicht. Der Get-Funktion wird dabei der Definitions-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;, der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;, sowie die Aufrufparameter &amp;lt;code&amp;gt;$opt&amp;lt;/code&amp;gt; plus optional weiterer Parameter &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; übergeben. Als Rückgabewert &amp;lt;code&amp;gt;$result&amp;lt;/code&amp;gt; wird das Ergebnis des entsprechenden Befehls in Form einer Zeichenkette zurückgegeben. Der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; hat hierbei keine besondere Bedeutung und wird behandelt wie eine leere Zeichenkette &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $opt, @args ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;get $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($opt));&lt;br /&gt;
&lt;br /&gt;
	if($opt eq &amp;quot;status&amp;quot;) &lt;br /&gt;
	{&lt;br /&gt;
	   ...&lt;br /&gt;
	}&lt;br /&gt;
	elsif($opt eq &amp;quot;power&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   ...&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of status power [...]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine unbekannte Option an die Get-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Get-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf &amp;lt;code&amp;gt;get &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;&amp;lt;NAME&amp;gt;&#039;&#039;&amp;lt;/font&amp;gt; &amp;lt;u&amp;gt;&#039;&#039;&#039;?&#039;&#039;&#039;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;, welche durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;unknown&#039;&#039;&#039; argument &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Parameter]&amp;lt;/font&amp;gt;&#039;&#039; &#039;&#039;&#039;choose one of&#039;&#039;&#039; &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Liste möglicher Optionen]&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Get-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort &amp;quot;unknown&amp;quot; vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt &amp;quot;choose one of&amp;quot; mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;return &amp;quot;unknown argument $opt choose one of status temperature humidity&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden als mögliche Optionen für einen Get-Befehl folgende Parameter angegeben:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde in folgenden, mögliche Get-Befehle für einen User resultieren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;get &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im weiteren Verlauf der Get-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert direkt abfragen und diesen als Return-Wert der Get-Funktion zurückgeben. Vielfach werden aber auch die vorhandenen Readings zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Get() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Get($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
==== X_Set ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set ($$@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
	return ($error, $skip_trigger);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Set-Funktion ist das Gegenteil zur [[#X_Get|Get]]-Funktion. Sie ist dafür gedacht, Daten zum physischen Gerät zu schicken, bzw. entsprechende Aktionen im Gerät selber auszulösen. Ein Set-Befehl dient daher der direkten Steuerung des physikalischen Gerätes in dem es bspw. Zustände verändert (wie &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;). Der Set-Funktion wird dabei der Definitions-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;, der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;, sowie die Aufrufparameter &amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; und optional weitere Argumente &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; übergeben. Als Rückgabewert &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; kann eine Fehlermeldung in Form Zeichenkette zurückgegeben werden. Der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; bedeutet hierbei, dass der Set-Befehl erfolgreich durchgeführt wurde. Eine Set-Funktion gibt daher nur im Fehlerfall eine Rückmeldung mit einer entsprechenden Fehlermeldung. Der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; wird als &amp;quot;erfolgreich&amp;quot; interpretiert. &lt;br /&gt;
&lt;br /&gt;
Standardmäßig wird jeder Set-Befehl, welcher erfolgreich ausgeführt wurde (&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;), als Event getriggert um dies bspw. in einem FileLog festzuhalten. Dieses Verhalten kann optional unterbunden werden indem der optionale zweite Rückgabewert &amp;lt;code&amp;gt;$skip_trigger&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; gesetzt wird. Damit wird das Generieren eines Events für das erfolgreich ausgeführte Set-Kommando unterbunden. Falls nicht gesetzt, wird ein Event erzeugt (&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; mit sämtlichen &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Rückmeldungen (Fehler) von set-Befehlen sämtlicher Module, die im Rahmen der Ausführung eines getriggerten [[Notify]] auftreten, werden im FHEM Logfile festgehalten.&lt;br /&gt;
&lt;br /&gt;
Falls nur interne Daten, die ausschließlich für das Modul relevant sind, gesetzt werden müssen, so sollte statt Set die [[#X_Attr|Attr]]-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht, da sie nur zu Steuerungszwecken im laufenden Betrieb von FHEM dienen.&lt;br /&gt;
 &lt;br /&gt;
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch in der Regel weitere zusätzliche Parameter (&amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;) übergeben um Zustände zu setzen/ändern. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;set $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($cmd));&lt;br /&gt;
&lt;br /&gt;
	if($cmd eq &amp;quot;status&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   if($args[0] eq &amp;quot;up&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   elsif($args[0] eq &amp;quot;down&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   else&lt;br /&gt;
	   {&lt;br /&gt;
	      return &amp;quot;Unknown value $args[0] for $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	   }   &lt;br /&gt;
	}&lt;br /&gt;
	elsif($cmd eq &amp;quot;power&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
	   if($args[0] eq &amp;quot;on&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }&lt;br /&gt;
	   elsif($args[0] eq &amp;quot;off&amp;quot;)&lt;br /&gt;
	   {&lt;br /&gt;
	      ...&lt;br /&gt;
	   }  &lt;br /&gt;
	   else&lt;br /&gt;
	   {&lt;br /&gt;
	      return &amp;quot;Unknown value $args[0] for $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	   }       &lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		return &amp;quot;Unknown argument $cmd, choose one of status power&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine unbekannte Option an die Set-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Set-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf &amp;lt;code&amp;gt;set &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;&amp;lt;NAME&amp;gt;&#039;&#039;&amp;lt;/font&amp;gt; &amp;lt;u&amp;gt;&#039;&#039;&#039;?&#039;&#039;&#039;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;, welcher durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;unknown&#039;&#039;&#039; argument &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Parameter]&amp;lt;/font&amp;gt;&#039;&#039; &#039;&#039;&#039;choose one of&#039;&#039;&#039; &#039;&#039;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;[Liste möglicher Optionen]&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Set-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort &amp;quot;unknown&amp;quot; vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt &amp;quot;choose one of&amp;quot; mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;return &amp;quot;unknown argument $cmd choose one of status power&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden als mögliche Optionen für einen Set-Befehl folgende Parameter angegeben:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;power&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies würde in folgenden, mögliche Set-Befehle für einen User resultieren:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; status&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; power&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von SetExtensions.pm&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dem Nutzer zusätzlich zu den Set-Befehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; auch weiterführende Befehle wie &amp;lt;code&amp;gt;on-for-timer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;on-till&amp;lt;/code&amp;gt;, usw. anbieten möchte, obwohl die zu steuernde Hardware solche Kommandos nicht unterstützt, kann man dies über das Hilfsmodul SetExtensions.pm realisieren.&lt;br /&gt;
&lt;br /&gt;
Das Hilfsmodul SetExtensions.pm bietet weiterführende Set-Kommandos basierend auf den Befehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; an. Dabei werden durch interne Timer bzw. eigens angelegten [[at]]-Definitionen diese Befehle durch FHEM selber umgesetzt. Je nach ausgeführtem Befehl wird der &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;- bzw. &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl dann durch FHEM zum richtigen Zeitpunkt ausgeführt. Vorausgesetzt das Modul unterstützt in der Set-Funktion die Befehle &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;, so werden durch den Einsatz von SetExtensions.pm folgende Befehle zusätzlich unterstützt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Set-Kommando !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-for-timer &#039;&#039;&amp;amp;lt;Dauer&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-for-timer 120&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-Befehl ein und nach der angegebenen Dauer in Sekunden via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-for-timer &#039;&#039;&amp;amp;lt;Dauer&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-for-timer 120&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl aus und nach der angegebenen Dauer in Sekunden via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; wieder ein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till 16:30&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;-Befehl ein und zum angegebenen Zeitpunkt via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till 16:30&amp;lt;/code&amp;gt; || Schaltet das Gerät sofort mit dem &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;-Befehl aus und zum angegebenen Zeitpunkt via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; wieder ein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till-overnight &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;on-till-overnight 01:00&amp;lt;/code&amp;gt; || Ähnlich wie &amp;lt;code&amp;gt;on-till&amp;lt;/code&amp;gt;. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till-overnight &#039;&#039;&amp;amp;lt;Zeitpunkt&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;off-till-overnight 01:00&amp;lt;/code&amp;gt; || Ähnlich wie &amp;lt;code&amp;gt;off-till&amp;lt;/code&amp;gt;. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;blink &#039;&#039;&amp;amp;lt;Anzahl&amp;amp;gt; &amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;  || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;blink 3 1&amp;lt;/code&amp;gt; || Schaltet das Gerät via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; für &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; Sekunden ein und anschließend via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder aus. Nach &amp;lt;code&amp;gt;&#039;&#039;&amp;amp;lt;Interval&amp;amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; Sekunden wird das ganze wiederholt, solange bis die angegebene Anzahl erreicht ist.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;intervals &#039;&#039;&amp;amp;lt;Start&amp;amp;gt;-&amp;amp;lt;Ende&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Start&amp;amp;gt;-&amp;amp;lt;Ende&amp;amp;gt;&#039;&#039; ...&amp;lt;/code&amp;gt; || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;intervals 07:00-08:00 16:30-18:00&amp;lt;/code&amp;gt; || Schaltet das Gerät innerhalb der übergebenen Zeiträumen via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; ein. Sobald die aktuelle Zeit ausserhalb dieser Zeiträume liegt, wird das Gerät via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; wieder ausgeschaltet. Es können dabei beliebig viele Zeiträume angegeben werden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt;  || Sofern der aktuelle Status &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; ist, wird das Gerät via &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; ausgeschaltet. Andernfalls wird es via &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; eingeschaltet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine kurze Beschreibung zu den möglichen Befehlen durch SetExtensions.pm gibt es auch in der commandref zum {{Link2CmdRef|Anker=set|Label=set-Befehl}}.&lt;br /&gt;
&lt;br /&gt;
Um SetExtensions.pm in der Set-Funktion nutzen zu können müssen folgende Aktionen durchgeführt werden:&lt;br /&gt;
&lt;br /&gt;
# Laden von SetExtensions.pm via &amp;lt;code&amp;gt;use SetExtensions;&amp;lt;/code&amp;gt; am Anfang des Moduls&lt;br /&gt;
# Aufruf und Rückgabe der Funktion [[DevelopmentModuleAPI#SetExtensions|SetExtensions()]] sofern die Set-Funktion mit dem übergebenen Befehl nichts anfangen kann.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use SetExtensions;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $name, $cmd, @args ) = @_;&lt;br /&gt;
	my $cmdList = &amp;quot;on off&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;\&amp;quot;set $name\&amp;quot; needs at least one argument&amp;quot; unless(defined($cmd));&lt;br /&gt;
&lt;br /&gt;
	if($cmd eq &amp;quot;on&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		# Gerät einschalten...&lt;br /&gt;
	}&lt;br /&gt;
	elsif($cmd eq &amp;quot;off&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		# Gerät ausschalten...&lt;br /&gt;
	}&lt;br /&gt;
	...&lt;br /&gt;
	else # wenn der übergebene Befehl nicht durch X_Set() verarbeitet werden kann, Weitergabe an SetExtensions()&lt;br /&gt;
	{&lt;br /&gt;
		return SetExtensions($hash, $cmdList, $name, $cmd, @args);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte der übergebene Set-Befehl auch für SetExtensions unbekannt sein (bspw. &amp;lt;code&amp;gt;set &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; ?&amp;lt;/code&amp;gt;), so generiert SetExtensions() eine entsprechende Usage-Meldung, welche innerhalb der Set-Funktion an FHEM zurückgegeben werden muss.&lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Beschreibung zu der Funktion SetExtensions() gibt es in der  [[DevelopmentModuleAPI#SetExtensions|API-Referenz]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von parseParams()&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn in [[#X_Initialize|X_Initialize()]] &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Set() ändert sich wie folgt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Set($$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $a, $h ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nutzung von FHEMWEB-Widgets&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das GUI-Modul [[FHEMWEB]] kann für die einzelnen Set-Optionen, die das Modul versteht, automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht der GUI kann der Anwender dann die jeweiligen Werte komfortabel auswählen. Dafür muss die Set-Funktion, wenn sie mit der Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; aufgerufen wird, nicht nur einen Text mit  &amp;lt;code&amp;gt;&amp;quot;Unknown ... choose one of ...&amp;quot;&amp;lt;/code&amp;gt; zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt entsprechende Zusatzinformationen anhängen.&lt;br /&gt;
Meist prüft man in den Modulen gar nicht auf die Option &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; sondern gibt generell bei unbekannten Optionen diesen Text zurück. Das Modul FHEMWEB ermittelt die Syntax eines Gerätes jedoch immer mit dem Befehl:&lt;br /&gt;
 set &#039;&#039;&amp;amp;lt;NAME&amp;amp;gt;&#039;&#039; ?&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
	return &amp;quot;Unknown argument $cmd, choose one of status:up,down power:on,off on:noArg off:noArg&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Kommata getrennte Werte ergeben eine Drop-Down Liste, mit der der User die Werte auswählen kann&lt;br /&gt;
&amp;lt;pre&amp;gt;timer:30,120,300&lt;br /&gt;
mode:verbose,ultra,relaxed&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Doppelpunkt zum Kommando angegeben, so wird eine Eingabezeile angezeigt, die die freie Eingabe eines Wertes erlaubt.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch die Eingabe-/Auswahlmöglichkeiten durch Widgets vereinfachen. Dazu gibt man hinter dem Doppelpunkt einen Widgetnamen und widgetspezifische Parameter an. Es existieren mehrere solcher Widgets in FHEMWEB. Die gebräuchlichsten sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zusatz !! Beispiel !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;noArg&#039;&#039;&#039; || &amp;lt;code&amp;gt;reset:noArg&amp;lt;/code&amp;gt;|| Es werden keine weiteren Argumente mehr benötigt. In so einem Fall wird bei der Auswahl keine Textbox oder ähnliches angezeigt, da keine weiteren Argumente für diesen Befehl notwendig sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;slider&#039;&#039;&#039;,&amp;lt;min&amp;gt;,&amp;lt;step&amp;gt;,&amp;lt;max&amp;gt; || &amp;lt;code&amp;gt;dim:slider,0,1,100&amp;lt;/code&amp;gt;|| Es wird ein Schieberegler angezeigt um den Parameter auszuwählen. Dabei werden als Zusatzparameter Minimum, Schrittweite und Maximum angegeben.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;colorpicker&#039;&#039;&#039; || &amp;lt;code&amp;gt;rgb:colorpicker,RGB&amp;lt;/code&amp;gt;|| Es wird ein Colorpicker angezeigt, der dem Anwender die Auswahl einer Farbe ermöglicht. Die genaue Parametersyntax kann man dem Artikel zum  [[Color#Colorpicker|Colorpicker]] entnehmen.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;multiple&#039;&#039;&#039; || &amp;lt;code&amp;gt;group:multiple,Telefon,Multimedia,Licht,Heizung&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte durch klicken auswählen kann. Optional kann man in einem Freitext eigene Werte ergänzen. dieser Dialog wird bspw. bei der Raum-Auswahl (Attribut &amp;quot;room&amp;quot;) oder der Gruppen-Auswahl (Attribut &amp;quot;group&amp;quot;) in FHEMWEB genutzt. &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;sortable&#039;&#039;&#039; || &amp;lt;code&amp;gt;command:sortable,monday,tuesday,...&amp;lt;/code&amp;gt; || Es erscheint ein Auswahldialog, wo man verschiedene Werte auswählen und sortieren kann. Man kann dabei Werte durch Klicken auswählen und durch Drag&#039;n&#039;Drop sortieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt noch weitere solcher Widgets. Eine genaue Auflistung dazu findet sich in der {{Link2CmdRef|Anker=widgetOverride}} unter widgetOverride zu FHEMWEB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Damit in einer Eingabe bereits der aktuelle Wert vorbelegt bzw. in einer Auswahlliste der aktuelle Wert vorselektiert ist, muss es im Modul bzw. Gerät ein Reading mit dem gleichen Namen wie die Set-Option geben. Der Wert des gleichnamigen Readings wird dann als Vorbelegung / Vorselektion verwendet. &lt;br /&gt;
* Der User kann sich in der Raumübersicht nach wie vor via [[WebCmd|webCmd]] eine entsprechende Steuerung anlegen.&lt;br /&gt;
&lt;br /&gt;
==== X_Attr ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Attr($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $cmd, $name, $attrName, $attrValue  ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion dient der Prüfung von Attributen, welche über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl gesetzt werden können. Sobald versucht wird, ein Attribut für ein Gerät zu setzen, wird vorher die Attr-Funktion des entsprechenden Moduls aufgerufen um zu prüfen, ob das Attribut aus Sicht des Moduls korrekt ist.&lt;br /&gt;
Liegt ein Problem mit dem Attribut bzw. dem Wert vor, so muss die Funktion eine aussagekräftige Fehlermeldung zurückgeben, welche dem User angezeigt wird.&lt;br /&gt;
Sofern das übergebene Attribut samt Inhalt korrekt ist, gibt die Attr-Funktion den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurück. Erst dann wird das Attribut in der globalen Datenstruktur &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt; gespeichert und ist somit erst aktiv.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Attr($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $cmd, $name, $attrName, $attrValue ) = @_;&lt;br /&gt;
    &lt;br /&gt;
  	# $cmd  - Vorgangsart - kann die Werte &amp;quot;del&amp;quot; (löschen) oder &amp;quot;set&amp;quot; (setzen) annehmen&lt;br /&gt;
	# $name - Gerätename&lt;br /&gt;
	# $attrName/$attrValue sind Attribut-Name und Attribut-Wert&lt;br /&gt;
    &lt;br /&gt;
	if ($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
		if ($aName eq &amp;quot;Regex&amp;quot;) {&lt;br /&gt;
			eval { qr/$aVal/ };&lt;br /&gt;
			if ($@) {&lt;br /&gt;
				Log3 $name, 3, &amp;quot;X ($name) - Invalid regex in attr $name $aName $aVal: $@&amp;quot;;&lt;br /&gt;
				return &amp;quot;Invalid Regex $aVal: $@&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist es möglich auch übergebene Attributwerte zu verändern bzw. zu korrigieren, indem man im Parameterarray &amp;lt;code&amp;gt;@_&amp;lt;/code&amp;gt; den ursprünglichen Wert anpasst. Dies erfolgt im Beispiel über die Modifikation des Wertes mit Index 3 (entspricht dem 4. Element) im Parameterarray, also &amp;lt;code&amp;gt;$_[3]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Da das Attribut zum Zeitpunkt des Aufrufs der Attr-Funktion noch nicht gespeichert ist, wird der neue Wert zu diesem Zeitpunkt noch nicht via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] zurückgegeben. Erst, wenn die Attr-Funktion mit &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; beendet ist, wird der neue Wert in FHEM gespeichert und steht dann via AttrVal() zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie normalerweise keine Werte dort speichern muss, sondern lediglich das Attribut auf Korrektheit prüfen muss.&lt;br /&gt;
Im obigen Beispiel wird für ein Attribut mit Namen &amp;quot;Regex&amp;quot; geprüft ob der reguläre Ausdruck fehlerhaft ist. Sofern dieser OK ist, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben und fhem.pl speichert den Wert des Attributs in &amp;lt;code&amp;gt;%attr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Attributnamen mit Platzhaltern&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man Attribute in der [[#X_Initialize|Initialize]]-Funktion mit Platzhaltern definiert (Wildcard-Attribute) wie z.B.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
      &amp;quot;reading[0-9]*Name &amp;quot; .&lt;br /&gt;
    # usw.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken in der Web-Oberfläche, da FHEMWEB nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muss solche Attribute manuell über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt;-Befehl eingeben.&lt;br /&gt;
&lt;br /&gt;
Man kann jedoch in der Attr-Funktion neu gesetzte Ausprägungen von Wildcard-Attributen an die gerätespezifische userattr-Variable anfügen. Dann können bereits gesetzte Attribute in FHEMWEB durch Klicken ausgewählt und geändert werden.&lt;br /&gt;
Dazu reicht ein Aufruf der Funktion [[DevelopmentModuleAPI#addToDevAttrList|addToDevAttrList()]]: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
    addToDevAttrList($name, $aName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Read ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Read ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die X_Read-Funktion wird aufgerufen, wenn ein dem Gerät zugeordneter Filedeskriptor (serielle Schnittstelle, TCP-Verbindung, ...) Daten zum Lesen bereitgestellt hat. Die Daten müssen nun eingelesen und interpretiert werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Serial-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion [[DevIo#DevIo_SimpleRead()|DevIo_SimpleRead()]] gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann.&lt;br /&gt;
Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten in einem eigenen Puffer (idealerweise in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) zwischenspeichern (siehe auch [[DevIo#Hinweis bei der Datenverarbeitung (Buffering)|DevIo]]). Im Beispiel ist dies &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{BUFFER}&amp;lt;/code&amp;gt; an den die aktuell gelesenen Daten angehängt werden, bis die folgende Prüfung ein für das jeweilige Protokoll vollständige Frame erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Read($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	&lt;br /&gt;
	# einlesen der bereitstehenden Daten&lt;br /&gt;
	my $buf = DevIo_SimpleRead($hash);		&lt;br /&gt;
	return &amp;quot;&amp;quot; if ( !defined($buf) );&lt;br /&gt;
	Log3 $name, 5, &amp;quot;X ($name) - received data: &amp;quot;.$buf;    &lt;br /&gt;
&lt;br /&gt;
	# Daten in Hex konvertieren und an den Puffer anhängen&lt;br /&gt;
	$hash-&amp;gt;{helper}{BUFFER} .= unpack (&#039;H*&#039;, $buf);	&lt;br /&gt;
	Log3 $name, 5, &amp;quot;X ($name) - current buffer content: &amp;quot;.$hash-&amp;gt;{helper}{BUFFER};&lt;br /&gt;
&lt;br /&gt;
	# prüfen, ob im Buffer ein vollständiger Frame zur Verarbeitung vorhanden ist.&lt;br /&gt;
	if ($hash-&amp;gt;{helper}{BUFFER} =~ &amp;quot;ff1002(.{4})(.*)1003(.{4})ff(.*)&amp;quot;) {&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die zu lesenden Nutzdaten können dann je nach Protokoll des Geräts beispielsweise an einer festgelegten Stelle im Frame (dann in &amp;lt;code&amp;gt;$hash-&amp;gt;{helper}{BUFFER}&amp;lt;/code&amp;gt;) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und via [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] in Readings gespeichert werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert der Read-Funktion wird nicht geprüft und hat daher keinerlei Bedeutung.&lt;br /&gt;
&lt;br /&gt;
==== X_Ready ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Ready ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
    &lt;br /&gt;
	return $success;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird im Main-Loop aufgerufen falls das Modul in der globalen Liste &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; existiert. Diese Funktion hat, je nachdem auf welchem OS FHEM ausgeführt wird, unterschiedliche Aufgaben:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;UNIX-artiges Betriebssystem:&#039;&#039;&#039; prüfen, ob eine Verbindung nach einem Verbindungsabbruch wieder aufgebaut werden kann. Sobald der Verbindungsaufbau erfolgreich war, muss die Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. &amp;quot;1&amp;quot;) und den eigenen Eintrag entsprechend aus &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; löschen.&lt;br /&gt;
* &#039;&#039;&#039;Windows-Betriebssystem:&#039;&#039;&#039; prüfen, ob lesbare Daten für ein serielles Device (via COM1, COM2, ...) vorliegen. Sofern lesbare Daten vorliegen, muss Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. &amp;quot;1&amp;quot;). Zusätzlich dazu muss die Funktion, wie bei UNIX-artigen Betriebssystem, ebenfalls bei einem Verbindungsabbruch einen neuen Verbindungsversuch initiieren. Der Eintrag in &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; bleibt solange erhalten, bis die Verbindung seitens FHEM beendet wird.&lt;br /&gt;
&lt;br /&gt;
Der Windows-spezifische Teil zur Datenprüfung ist dabei nur zu implementieren, wenn das Modul über eine serielle Verbindung kommuniziert.&lt;br /&gt;
&lt;br /&gt;
Bei der Nutzung des Moduls [[DevIo]] wird dem Modulentwickler der Umgang mit &amp;lt;code&amp;gt;%readyfnlist&amp;lt;/code&amp;gt; abgenommen, da DevIo sich selbst um die entsprechenden Einträge kümmert und diese selbstständig wieder entfernt.&lt;br /&gt;
&lt;br /&gt;
In der Regel sieht eine Ready-Funktion immer gleich aus.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Ready($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
      &lt;br /&gt;
	# Versuch eines Verbindungsaufbaus, sofern die Verbindung beendet ist.&lt;br /&gt;
	return DevIo_OpenDev($hash, 1, undef ) if ( $hash-&amp;gt;{STATE} eq &amp;quot;disconnected&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	# This is relevant for Windows/USB only&lt;br /&gt;
	if(defined($hash-&amp;gt;{USBDev})) {&lt;br /&gt;
		my $po = $hash-&amp;gt;{USBDev};&lt;br /&gt;
		my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po-&amp;gt;status;&lt;br /&gt;
		return ( $InBytes &amp;gt; 0 );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Notify ====&lt;br /&gt;
&lt;br /&gt;
Die X_Notify-Funktion wird aus der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] in fhem.pl heraus aufgerufen sobald ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind dabei das [[FileLog]]-Modul oder das [[notify]]-Modul.&lt;br /&gt;
&lt;br /&gt;
Die Notify-Funktion bekommt dafür zwei Hash-Referenzen übergeben: den Hash des eigenen Geräts und den Hash des Geräts, das die Events erzeugt hat. &lt;br /&gt;
Über den Hash des eigenen Geräts kann die Notify-Funktion beispielsweise auf die Internals oder Attribute des eigenen Geräts zugreifen.&lt;br /&gt;
Über den Hash des Gerätes und der [[DevelopmentModuleAPI#deviceEvents|deviceEvents()]]-Funktion kann man auf die generierten Events zugreifen. Über den zweiten Parameter dieser Routine lässt sich bestimmen ob für das Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; ein &#039;normales&#039; Event (d.h. in der form &amp;lt;code&amp;gt;state: &amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;) erzeugen soll (Wert: 1) oder ob z.b. aus Gründen der Rückwärtskompatibilität ein Event ohne &amp;lt;code&amp;gt;state: &amp;lt;/code&amp;gt; erzeugt werden soll. Falls dem Anwender die Wahl des verwendeten Formats überlassen werden soll ist hierzu das {{Link2CmdRef|Anker=addStateEvent|Lang=de|Label=addStateEvent-Attribut}} vorzusehen.&lt;br /&gt;
&lt;br /&gt;
Der direkte Zugriff auf &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; ist nicht mehr zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Notify($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($own_hash, $dev_hash) = @_;&lt;br /&gt;
  my $ownName = $own_hash-&amp;gt;{NAME}; # own name / hash&lt;br /&gt;
&lt;br /&gt;
  return &amp;quot;&amp;quot; if(IsDisabled($ownName)); # Return without any further action if the module is disabled&lt;br /&gt;
&lt;br /&gt;
  my $devName = $dev_hash-&amp;gt;{NAME}; # Device that created the events&lt;br /&gt;
&lt;br /&gt;
  my $events = deviceEvents($dev_hash,1);&lt;br /&gt;
  return if( !$events );&lt;br /&gt;
&lt;br /&gt;
  foreach my $event (@{$events}) {&lt;br /&gt;
    $event = &amp;quot;&amp;quot; if(!defined($event));&lt;br /&gt;
&lt;br /&gt;
    # Examples:&lt;br /&gt;
    # $event = &amp;quot;readingname: value&amp;quot; &lt;br /&gt;
    # or&lt;br /&gt;
    # $event = &amp;quot;INITIALIZED&amp;quot; (for $devName equal &amp;quot;global&amp;quot;)&lt;br /&gt;
    #&lt;br /&gt;
    # processing $event with further code&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Begrenzung der Aufrufe auf bestimmte Geräte&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Notify-Funktion für jedes definierte Gerät mit all seinen Events aufgerufen wird, muss sie in einer Schleife jedesmal prüfen und entscheiden, ob es mit dem jeweiligen Event etwas anfangen kann. Ein Gerät, das die Notify-Funktion implementiert, sieht dafür typischerweise einen regulären Ausdruck vor, welcher für die Filterung verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Wenn man nur gezielt von bestimmten Definitionen Events erhalten will, kann man diese auch in Form einer {{Link2CmdRef|Lang=de|Anker=devspec|Label=devspec}} in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; angeben. Bspw. kann man in der Define-Funktion diesen Wert setzen. Dadurch wird die Notify-Funktion nur aufgerufen wenn eine der Definitionen, auf welche die devspec passt, ein Event erzeugt hat. Ein typischer Fall ist die Begrenzung von Events auf &amp;quot;global&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
in der Define-Funktion:&lt;br /&gt;
&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,Definition_.*&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,Definition_A,Definition_B&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{NOTIFYDEV} = &amp;quot;global,TYPE=CUL_HM&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies schont insbesondere bei grossen Installationen Ressourcen, da die Notify-Funktion nicht sämtliche Events, sondern nur noch Events der gewünschten Definitionen erhält. Dadurch erfolgen deutlich weniger Aufrufe der Notify-Funktion, was Systemressourcen schont.&lt;br /&gt;
&lt;br /&gt;
Sofern in der [[#X_Define|Define-Funktion]] eine Regexp als Argument übergeben wird, die ähnlich wie beim Modul [[notify]] auf Events wie &amp;lt;code&amp;gt;&amp;amp;lt;Definitionsname&amp;amp;gt;&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;&amp;amp;lt;Definitionsname&amp;amp;gt;:&amp;amp;lt;Event&amp;amp;gt;&amp;lt;/code&amp;gt; reagiert, so sollte man in der Define-Funktion die Funktion [[DevelopmentModuleAPI#notifyRegexpChanged|notifyRegexpChanged()]] verwenden. Diese versucht einen passenden Eintrag für &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; basierend auf der übergebenen Regexp zu setzen, sofern dies möglich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Reihenfolge für den Aufruf der Notify-Funktion beeinflussen&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald ein Event ausgelöst wurde, stellt sich FHEM eine Liste aller relevanten Geräte-Hashes zusammen, welche via Notify-Funktion prüfen müssen, ob das Event relevant ist. Dabei wird die Liste nach &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; sortiert. Diese enthält ein Order-Präfix in Form einer Ganzzahl, sowie den Namen der Definition (Bsp: &amp;lt;code&amp;gt;&#039;&#039;&#039;50&#039;&#039;&#039;-Lampe_Wohnzimmer&amp;lt;/code&amp;gt;). Dadurch kann man jedoch nicht sicherstellen, dass Events von bestimmten Modulen zuerst verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn das eigene Modul bei der Eventverarbeitung gegenüber den anderen Modulen eine bestimmte Reihenfolge einhalten muss, kann man in der [[#X_Initialize|Initialize]]-Funktion durch Setzen von &amp;lt;code&amp;gt;$hash-&amp;gt;{NotifyOrderPrefix}&amp;lt;/code&amp;gt; diese Reihenfolge beeinflussen. Standardmäßig werden Module immer mit einem Order-Präfix von &amp;quot;50-&amp;quot; in FHEM registriert. Durch die Veränderung dieses Präfixes kann man das eigene Modul in der Reihenfolge gegenüber anderen Modulen bei der Eventverarbeitung beeinflussen. &lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	$hash-&amp;gt;{NotifyOrderPrefix} = &amp;quot;45-&amp;quot;  # Alle Definitionen des Moduls X werden bei der Eventverarbeitung zuerst geprüft&lt;br /&gt;
	&lt;br /&gt;
	# oder...&lt;br /&gt;
	&lt;br /&gt;
	$hash-&amp;gt;{NotifyOrderPrefix} = &amp;quot;55-&amp;quot;  # Alle Definitionen des Moduls X werden bei der Eventverarbeitung als letztes geprüft&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Da dieses Präfix bei eventverarbeitenden Definitionen in &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; dem Definitionsnamen vorangestellt wird bewirkt es bei einer normalen aufsteigenden Sortierung nach &amp;lt;code&amp;gt;$hash-&amp;gt;{NTFY_ORDER}&amp;lt;/code&amp;gt; eine veränderte Reihenfolge. Alle Module die in der Initialize-Funktion nicht &amp;lt;code&amp;gt;$hash-&amp;gt;{NotifyOrderPrefix}&amp;lt;/code&amp;gt; explizit setzen, werden mit &amp;quot;50-&amp;quot; als Standardwert vorbelegt.&lt;br /&gt;
&lt;br /&gt;
==== X_Rename ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Rename($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $new_name, $old_name) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Rename-Funktion wird ausgeführt, nachdem ein Gerät umbenannt wurde. Auf diese Weise kann ein Modul auf eine Namensänderung reagieren, wenn das Gerät &amp;lt;code&amp;gt;$old_name&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;$new_name&amp;lt;/code&amp;gt; umbenannt wurde. Ein typischer Fall ist das Umsetzen der Namensänderungen bei Daten die mittels [[DevelopmentModuleAPI#setKeyValue|setKeyValue()]] gespeichert wurden. Hierbei müssen die Daten, welche unter dem alten Namen gespeichert sind, auf den neuen Namen geändert werden.&lt;br /&gt;
&lt;br /&gt;
Der Rename-Funktion wird lediglich der alte, sowie der neue Gerätename übergeben. Der Rückgabewert wird nicht ausgewertet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Rename($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $new_name, $old_name ) = @_;&lt;br /&gt;
&lt;br /&gt;
	my $old_index = &amp;quot;Module_X_&amp;quot;.$old_name.&amp;quot;_data&amp;quot;;&lt;br /&gt;
	my $new_index = &amp;quot;Module_X_&amp;quot;.$new_name.&amp;quot;_data&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	my ($err, $old_pwd) = getKeyValue($old_index);&lt;br /&gt;
	return undef unless(defined($old_pwd));&lt;br /&gt;
&lt;br /&gt;
	setKeyValue($new_index, $old_pwd);&lt;br /&gt;
	setKeyValue($old_index, undef);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_DelayedShutdown ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DelayedShutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $delay_needed;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit der X_DelayedShutdown Funktion kann eine Definition das Stoppen von FHEM verzögern um asynchron hinter sich aufzuräumen. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.), welcher mehrfache Requests/Responses benötigt. Als Übergabeparameter wird der Geräte-Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; bereitgestellt. Je nach Rückgabewert &amp;lt;code&amp;gt;$delay_needed&amp;lt;/code&amp;gt; wird der Stopp von FHEM verzögert. Ist ein verzögerter Stopp von FHEM notwendig, darf der Rückgabewert in diesem Fall nicht &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; sein.&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zur [[#X_Shutdown|Shutdown]]-Funktion steht vor einem bevorstehenden Stopp von FHEM für einen User-konfigurierbaren Zeitraum (global-Attribut: &amp;lt;code&amp;gt;maxShutdownDelay&amp;lt;/code&amp;gt; / Standard: 10 Sekunden) weiterhin die asynchrone FHEM Infrastruktur ([[DevIo]]/[[#X_Read|Read]]-Funktion und [[DevelopmentModuleAPI#InternalTimer|InternalTimer]]) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Sobald alle nötigen Maßnahmen erledigt sind, muss der Abschluss mit [[DevelopmentModuleAPI#CancelDelayedShutdown|CancelDelayedShutdown(&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;)]] an FHEM zurückgemeldet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DelayedShutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	# Aufräumen starten&lt;br /&gt;
	&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Shutdown ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Shutdown ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit der X_Shutdown Funktion kann ein Modul Aktionen durchführen bevor FHEM gestoppt wird. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.). Nach der Ausführung der Shutdown-Fuktion wird FHEM sofort beendet. Falls vor dem Herunterfahren von FHEM asynchrone Kommunikation (via [[DevIo]]/[[#X_Read|X_Read]]) notwendig ist um eine vorhandene Verbindung sauber zu beenden, sollte man [[#X_DelayedShutdownFn|X_DelayedShutdownFn]] verwenden.&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter wird der Geräte-Hash bereitgestellt. Der Rückgabewert einer Shutdown-Funktion wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Shutdown($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	# Verbindung schließen&lt;br /&gt;
	DevIo_CloseDev($hash);&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funktionen für zweistufiges Modulkonzept ===&lt;br /&gt;
&lt;br /&gt;
Für das [[#Zweistufiges_Modell_für_Module|zweistufige Modulkonzept]] gibt es weiterhin:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Funktionsname !! style=&amp;quot;text-align:left&amp;quot; class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Parse|X_Parse]] || Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] vom physischen Modul zum logischen Modul zwecks der Verarbeitung.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Write|X_Write]]|| Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|IOWrite()]] vom logischen zum physischen Modul um diese an die Hardware weiterzureichen.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Fingerprint|X_Fingerprint]] || Rückgabe eines &amp;quot;Fingerabdrucks&amp;quot; einer Nachricht. Dient der Erkennung von Duplikaten im Rahmen von [[DevelopmentModuleAPI#Dispatch|Dispatch()]]. Kann im physischen, als auch logischen Modul benutzt werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für das zweistufige Modulkonzept muss in einem logischen Modul eine [[#X_Parse|Parse]]-Funktion im Modul-Hash registriert werden. In einem physikalischen Modul muss eine [[#X_Write|Write]]-Funktion registriert sein. Diese dienen dem Datenaustausch in beide Richtungen und werden von dem jeweils anderen Modul indirekt aufgerufen.&lt;br /&gt;
&lt;br /&gt;
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{ParseFn}       = &amp;quot;X_Parse&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{WriteFn}       = &amp;quot;X_Write&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{FingerprintFn} = &amp;quot;X_Fingerprint&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
==== X_Parse ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen &amp;quot;X&amp;quot; ein &#039;&#039;&#039;logisches Modul&#039;&#039;&#039; im Sinne des zweistufigen Modulkonzepts ist, also Daten mit einem übergeordneten, physikalischen Modul austauscht.}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Parse ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_hash, $message) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $found;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_Parse wird aufgerufen, sobald von dem IO-Gerät &amp;lt;code&amp;gt;$io_hash&amp;lt;/code&amp;gt; eine Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] zur Verarbeitung angefragt wird. Die Parse-Funktion muss dann prüfen, zu welcher Gerätedefinition diese Nachricht gehört und diese entsprechend verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise enthält eine Nachricht immer eine Komponente durch welche sich die Nachricht einem Gerät zuordnen lässt (z.B. Adresse, ID-Nummer, ...). Eine solche Identifikation sollte man im Rahmen der [[#X_Define|Define]]-Funktion im logischen Modul an geeigneter Stelle speichern, um in der Parse-Funktion eine einfache Zuordnung von Adresse/ID einer Nachricht zur entsprechenden Gerätedefinition zu haben. Dazu wird in der Regel im Modul-Hash im modulspezifischen Bereich eine Liste &amp;lt;code&amp;gt;defptr&amp;lt;/code&amp;gt; (Definition Pointer) geführt, welche jede eindeutige Adresse/ID dem entsprechenden Geräte-Hash zuordnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Define ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def) = @_;&lt;br /&gt;
	my @a = split(&amp;quot;[ \t][ \t]*&amp;quot;, $def);&lt;br /&gt;
	my $name = $a[0];&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# erstes Argument ist die eindeutige Geräteadresse&lt;br /&gt;
	my $address = $a[1];&lt;br /&gt;
&lt;br /&gt;
	# Adresse rückwärts dem Hash zuordnen (für ParseFn)&lt;br /&gt;
	$modules{X}{defptr}{$address} = $hash;&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Basis dieses Definition Pointers kann die Parse-Funktion nun sehr einfach prüfen, ob für die empfangene Nachricht bereits eine entsprechende Gerätedefinition existiert. Sofern diese existiert, kann die Nachricht entsprechend verarbeitet werden. Sollte jedoch keine passende Gerätedefinition zu der empfangenen Nachricht existieren, so muss die Parse-Funktion den Gerätenamen &amp;quot;UNDEFINED&amp;quot; zusammen mit den Argumenten für einen &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl zurückgeben, welcher ein passendes Gerät in FHEM anlegen würde (durch [[autocreate]]).&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Parse ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_hash, $message) = @_;&lt;br /&gt;
	&lt;br /&gt;
	# Die Stellen 10-15 enthalten die eindeutige Identifikation des Geräts&lt;br /&gt;
	my $address = substr($message, 10, 5); &lt;br /&gt;
&lt;br /&gt;
	# wenn bereits eine Gerätedefinition existiert (via Definition Pointer aus Define-Funktion)&lt;br /&gt;
	if(my $hash = $modules{X}{defptr}{$address}) &lt;br /&gt;
	{&lt;br /&gt;
		...  # Nachricht für $hash verarbeiten&lt;br /&gt;
		&lt;br /&gt;
		# Rückgabe des Gerätenamens, für welches die Nachricht bestimmt ist.&lt;br /&gt;
		return $hash-&amp;gt;{NAME}; &lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		# Keine Gerätedefinition verfügbar&lt;br /&gt;
		# Daher Vorschlag define-Befehl: &amp;lt;NAME&amp;gt; &amp;lt;MODULNAME&amp;gt; &amp;lt;ADDRESSE&amp;gt;&lt;br /&gt;
		return &amp;quot;UNDEFINED X_&amp;quot;.$address.&amp;quot; X $address&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Write ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen &amp;quot;X&amp;quot; ein &#039;&#039;&#039;physisches Modul&#039;&#039;&#039; im Sinne des zweistufigen Modulkonzepts ist, also Daten mit untergeordneten logischen Modulen austauscht. }}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Write ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @arguments) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Write-Funktion wird durch die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] aufgerufen, sobald eine logische Gerätedefinition Daten per IO-Gerät an die Hardware übertragen möchte. Dazu kümmert sich die Write-Funktion um die Übertragung der Nachricht in geeigneter Form an die verbundene Hardware. Als Argumente wird der Hash des physischen Gerätes übertragen, sowie alle weiteren Argumente, die das logische Modul beim Aufruf von IOWrite() mitgegeben hat. Im Normalfall ist das ein Skalar mit der zu sendenden Nachricht in Textform. Es kann aber auch sein, dass weitere Daten zum Versand notwendig sind (evtl. Schlüssel, Session-Key, ...). Daher ist die Parametersyntax einer zu schreibenden Nachricht via IOWrite-/Write-Funktion zwischen logischem und physikalischem Modul abzustimmen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Write ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $message, $address) = @_;&lt;br /&gt;
	&lt;br /&gt;
	DevIo_SimpleWrite($hash, $address.$message, 2);&lt;br /&gt;
&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Fingerprint ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Fingerprint($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $io_name, $msg ) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return ( $io_name, $fingerprint );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fingerprint-Funktion dient der Erkennung von Duplikaten empfangener Nachrichten. Diese Funktion kann dabei sowohl im physischen, als auch im logischen Modul implementiert sein - je nachdem auf welcher Ebene man für eine Nachricht einen Fingerprint bilden kann. &lt;br /&gt;
&lt;br /&gt;
Als Parameter wird der Name des IO-Geräts &amp;lt;code&amp;gt;$io_name&amp;lt;/code&amp;gt; übergeben, sowie die Nachricht &amp;lt;code&amp;gt;$msg&amp;lt;/code&amp;gt;, welche empfangen wurde. Nun muss aus dieser Nachricht ein eindeutiger Fingerprint gebildet werden. Dies bedeutet, dass alle variablen Inhalte, die aufgrund des Empfangs dieser Nachricht über unterschiedliche IO-Geräte enthalten sein können, entfernt werden müssen. Dies können bspw. Empfangsadressen von IO-Geräten sein oder Session-ID&#039;s die in der Nachricht enthalten sind. Alle Fingerprints sämtlicher Nachrichten, die innerhalb der letzten 500 Millisekunden (konfigurierbar via &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; Attribut &amp;lt;code&amp;gt;dupTimeout&amp;lt;/code&amp;gt;) empfangen wurden, werden gegen diesen generierten Fingerprint getestet. Sollte innerhalb dieser Zeit bereits eine Nachricht mit diesem Fingerprint verarbeitet worden sein, so wird sie als Duplikat erkannt und nicht weiter verarbeitet. In diesem Fall gibt [[DevelopmentModuleAPI#Dispatch|Dispatch()]] den Namen der Gerätedefinition zurück, welche eine Nachricht mit dem selben Fingerprint bereits verarbeitet hat. Es erfolgt dann kein Aufruf der [[#X_Parse|Parse]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Fingerprint($$)&lt;br /&gt;
{&lt;br /&gt;
  my ( $io_name, $msg ) = @_;&lt;br /&gt;
&lt;br /&gt;
  substr( $msg, 2, 2, &amp;quot;--&amp;quot; ); # entferne Empfangsadresse&lt;br /&gt;
  substr( $msg, 4, 1, &amp;quot;-&amp;quot; );  # entferne Hop-Count&lt;br /&gt;
&lt;br /&gt;
  return ( $io_name, $msg );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es wird zuerst, sofern implementiert, die Fingerprint-Funktion des physischen Moduls aufgerufen. Sollte sich hierdurch kein Duplikat erkennen lassen, wird die Fingerprint-Funktion jedes möglichen geladenen logischen Moduls aufgerufen, sofern implementiert. &lt;br /&gt;
&lt;br /&gt;
Sollte sowohl im physischen, als auch im logischen Modul keine Fingerprint-Funktion implementiert sein, so wird keinerlei Duplikatserkennung durchgeführt.&lt;br /&gt;
&lt;br /&gt;
=== FHEMWEB-spezifische Funktionen ===&lt;br /&gt;
&lt;br /&gt;
FHEMWEB bietet Modul-Autoren die Möglichkeit an durch spezielle Funktionsaufrufe in Modulen, eigene HTML-Inhalte zu verwenden. Dadurch können in Verbindung mit zusätzlichem JavaScript komplexe Dialoge/Inhalte/Steuermöglichkeiten dargestellt werden. &lt;br /&gt;
&lt;br /&gt;
Eine genaue Auflistung aller FHEMWEB-spezifischen Funktionsaufrufe gibt es in dem separaten Artikel [[DevelopmentFHEMWEB]]&lt;br /&gt;
&lt;br /&gt;
=== sonstige Funktionen ===&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt werden weitere Funktionen behandelt die zum Teil aus FHEM, aber auch aus anderen Modulen aufgerufen werden. Sie sind dabei nur in speziellen Anwendungsfällen relevant. Hier eine Auflistung aller sonstigen Modulfunktionen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Funktionsname !! class=&amp;quot;unsortable&amp;quot; | Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_DbLog_split|X_DbLog_split]] || Wird durch das Modul 93_DbLog.pm aufgerufen. Dient dem korrekten Split eines moduleigenen Events in Name/Wert/Einheit für die Nutzung einer Datenbank.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Except|X_Except]]|| Wird aufgerufen, sobald ein ein geöffneter Filedescriptor in [[#Wichtige_globale_Variablen_aus_fhem.pl|&amp;lt;code&amp;gt;%selectlist&amp;lt;/code&amp;gt;]], der unter &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt; im Geräte-Hash gesetzt ist, einen Interrupt bzw. Exception auslöst.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Copy|X_Copy]]|| Wird durch das Modul 98_copy.pm aufgerufen im Rahmen des &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt;-Befehls sobald ein Gerät kopiert wurde.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_State|X_State]]|| Wird aufgerufen im Rahmen des &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt;-Befehls bevor der Status einer Gerätedefinition bzw. eines zugehörigen Readings gesetzt wird.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_AsyncOutput|X_AsyncOutput]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht die asynchrone Ausgabe von Daten via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an einen einzelnen verbundenen Client.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_ActivateInform|X_ActivateInform]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht das Aktivieren des inform-Mechanismus zum Senden von Events für einen einzelnen verbundenen Client.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Authorize|X_Authorize]]|| Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authorized|Authorized()]] um eine gewünschte Vorgangs-Art zu autorisieren.&lt;br /&gt;
|-&lt;br /&gt;
| [[#X_Authenticate|X_Authenticate]]||  Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authenticate|Authenticate()]] um eine Authentifizierung zu prüfen und ggf. zu genehmigen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{DbLog_splitFn} = &amp;quot;X_DbLog_split&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ExceptFn} = &amp;quot;X_Except&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{CopyFn} = &amp;quot;X_Copy&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AsyncOutputFn} = &amp;quot;X_AsyncOutput&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{ActivateInformFn} = &amp;quot;X_ActivateInform&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{StateFn} = &amp;quot;X_State&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AuthorizeFn} = &amp;quot;X_Authorize&amp;quot;;&lt;br /&gt;
$hash-&amp;gt;{AuthenticateFn} = &amp;quot;X_Authenticate&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.&lt;br /&gt;
==== X_DbLog_split ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DbLog_split ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $event, $device_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
    &lt;br /&gt;
	return  ( $reading, $value, $unit );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die DbLog_split-Funktion wird durch das Modul [[DbLog]] aufgerufen, sofern der Nutzer DbLog benutzt. Sofern diese Funktion implementiert ist, kann der Modul-Autor das Auftrennen von Events in den Reading-Namen, -Wert und der Einheit selbst steuern. Andernfalls nimmt DbLog diese Auftrennung selber mittels Trennung durch Leerzeichen sowie vordefinierten Regeln zu verschiedenen Modulen vor. Je nachdem, welche Readings man in seinem Modul implementiert, passt diese standardmäßige Trennung jedoch nicht immer.&lt;br /&gt;
&lt;br /&gt;
Der Funktion werden folgende Eingangsparameter übergeben:&lt;br /&gt;
# Das generierte Event (Bsp: &amp;lt;code&amp;gt;temperature: 20.5 °C&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Der Name des Geräts, welche das Event erzeugt hat (Bsp: &amp;lt;code&amp;gt;Temperatursensor_Wohnzimmer&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es ist nicht möglich in der DbLog_split-Funktion auf die verarbeitende DbLog-Definition zu referenzieren.&lt;br /&gt;
&lt;br /&gt;
Als Rückgabewerte muss die Funktion folgende Werte bereitstellen:&lt;br /&gt;
# Name des Readings (Bsp: &amp;lt;code&amp;gt;temperature&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Wert des Readings (Bsp: &amp;lt;code&amp;gt;20.5&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Einheit des Readings (Bsp: &amp;lt;code&amp;gt;°C&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_DbLog_splitFn($$)&lt;br /&gt;
{&lt;br /&gt;
	my ($event, $device) = @_;&lt;br /&gt;
	my ($reading, $value, $unit);&lt;br /&gt;
        my $devhash = $defs{$device}&lt;br /&gt;
&lt;br /&gt;
	if($event =~ m/temperature/) {&lt;br /&gt;
	   $reading = &#039;temperature&#039;;&lt;br /&gt;
	   $value = substr($event,12,4);&lt;br /&gt;
	   $unit = &#039;°C&#039;;&lt;br /&gt;
	}   &lt;br /&gt;
        &lt;br /&gt;
        return ($reading, $value, $unit);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Except ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Except ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_Except-Funktion wird durch fhem.pl aufgerufen, wenn die Gerätedefinition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]&amp;lt;/code&amp;gt; aufgeführt ist und der Filedeskriptor in &amp;lt;code&amp;gt;$hash-&amp;gt;{EXCEPT_FD}&amp;lt;/code&amp;gt; eine Exception bzw. Interrupt auslöst. &lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use IO::File;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
sub X_Except ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	# Filehandle aus Filedescriptor erstellen&lt;br /&gt;
	my $filehandle = IO::File-&amp;gt;new_from_fd($hash-&amp;gt;{EXCEPT_FD}, &#039;r&#039;);&lt;br /&gt;
	seek($filehandle,0,0);	&lt;br /&gt;
&lt;br /&gt;
	# aktuellen Inhalt auslesen&lt;br /&gt;
	my $current_value = $filehandle-&amp;gt;getline;&lt;br /&gt;
&lt;br /&gt;
	if($current_value eq &amp;quot;1&amp;quot;)&lt;br /&gt;
	{&lt;br /&gt;
		...&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		...&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Copy ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Copy ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $old_name, $new_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_Copy-Funktion wird durch das Modul [[copy]] aufgerufen nachdem ein Nutzer eine Gerätedefinition über den Befehl &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; kopiert hat. Dazu werden als Funktionsparameter die Definitionsnamen der alten und neuen Gerätedefinition übergeben. Es dient dazu zusätzliche Daten aus der zu kopierenden Gerätedefinition in die neue Definition zu übernehmen. Der Befehl &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; überträgt lediglich &amp;lt;code&amp;gt;$hash-&amp;gt;{DEF}&amp;lt;/code&amp;gt; in die neue Definition sowie sämtliche gesetzte Attribute. Weitere Daten müssen dann durch die X_Copy-Funktion übertragen werden. &lt;br /&gt;
&lt;br /&gt;
Die X_Copy-Funktion wird erst nach dem erfolgtem Kopiervorgang aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sub X_Copy ($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $old_name, $new_name ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	my $old_hash = $defs{$old_name};&lt;br /&gt;
	my $new_hash = $defs{$new_name};&lt;br /&gt;
&lt;br /&gt;
	# copy also temporary session key&lt;br /&gt;
	$new_hash-&amp;gt;{helper}{SESSION_KEY} = $old_hash-&amp;gt;{helper}{SESSION_KEY};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_AsyncOutput ====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_AsyncOutput ($)&lt;br /&gt;
{&lt;br /&gt;
	my ( $client_hash, $text ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_AsyncOutput wird durch [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] von anderen Modulen aufgerufen. Es erlaubt diesen anderen Modulen die Ausgabe von asynchronen Befehlsergebnissen &amp;lt;code&amp;gt;$text&amp;lt;/code&amp;gt; zuvor ausgeführter set-/get-Befehle an den entsprechenden Client (identifiziert durch den Client-Hash &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; der temporären Definition) zurückzugeben. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Client einen set-/get-Befehl ausführt, wird der Client-Hash bei der Ausführung dieser Befehle an die jeweiligen Module übermittelt. Sobald ein Befehl ausgeführt wird, der seine Ausgabe asynchron ausführen möchte und die Client-Verbindung des Server-Moduls dies unterstützt (&amp;lt;code&amp;gt;$client_hash-&amp;gt;{canAsyncOutput}&amp;lt;/code&amp;gt; ist gesetzt), merkt sich das befehlsausführende Modul den Client-Hash und gibt das Ergebnis des Befehls zu späterer Zeit via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an den ursprünglichen Client zurück. Die Funktion X_AsyncOutput des Server-Moduls kümmert sich darum das Ergebnis dem entsprechenden Client in der notwendigen Form zuzustellen.&lt;br /&gt;
&lt;br /&gt;
Der Rückgabewert von X_AsyncOutput() wird als Rückgabewert für asyncOutput() verwendet. Man kann hier im Fehlerfall eine Fehlermeldung angeben und im Erfolgsfall &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;. Der Rückgabewert wird aber aktuell nicht ausgewertet.&lt;br /&gt;
&lt;br /&gt;
==== X_ActivateInform====&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_ActivateInform($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $client_hash, $arg ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion X_ActivateInform wird aktuell nur durch den [[update]]-Befehl aufgerufen, sofern ein Client eines Frontend-Moduls diesen Befehl aufgerufen hat um den Inform-Mechanismus (Senden von Events) zu aktivieren. Dadurch wird im Falle von [[update]] die umgehende Anzeige der Logmeldungen für den ausführenden Client aktiviert. In [[FHEMWEB]] geschieht das über den Event-Monitor, bei telnet mit der direkten Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Da diese Funktion aktuell nur speziell für den update-Befehl implementiert ist, kann man aktuell keine genaue Angaben zu den möglichen Werten von &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; geben. Dieser Parameter dient dazu genauer zu spezifizieren was exakt an Events an den entsprechenden Client &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; zu senden ist. Aktuell wird dazu die Parametersyntax des inform-Befehls verwendet (on|off|log|raw|timer|status).&lt;br /&gt;
&lt;br /&gt;
==== X_State ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_State($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $time, $readingName, $value ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	return $error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die X_State-Funktion wird durch fhem.pl aufgerufen, sobald über den Befehl &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; versucht wird ein Wert für ein Reading oder den Status (&amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt;) einer Gerätedefinition zu setzen. Dieser Befehl wird primär beim Starten von FHEM aufgerufen sobald das State-File eingelesen wird. Je nachdem, ob im gegebenen Fall ein Reading oder der Definitionsstatus gesetzt wird, haben die Übergabeparameter verschiedene Werte:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Funktionsparameter!! Wert beim Setzen eines Readings !! Wert beim Setzen eines Definitionsstatus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; || colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | Die Hashreferenz der betreffenden Gerätedefinition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$time&amp;lt;/code&amp;gt;|| Der Zeitstempel auf welchen das Reading &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt; gesetzt werden soll. Das Ergebnis entspricht dem Rückgabewert der Funktion || Der aktuelle Zeitstempel zum jetzigen Zeitpunkt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt;|| Der Name des Readings, welches auf einen neuen Wert gesetzt werden soll. || Statischer Wert &amp;quot;STATE&amp;quot; um anzuzeigen, dass es sich um den Definitionsstatus handelt, welcher gesetzt werden soll (&amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; || Den Wert, welchen das Reading &amp;lt;code&amp;gt;$readingName&amp;lt;/code&amp;gt; annehmen soll. || Den Wert, welchen die Gerätedefinition als Status annehmen soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn via &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; ein Reading gesetzt wird, kann die X_State-Funktion das Setzen dieses Readings durch die Rückgabe einer aussagekräftigen Fehlermeldung unterbinden. Sofern &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben wird, wird das entsprechende Reading auf den übergebenen Status gesetzt.&lt;br /&gt;
&lt;br /&gt;
Wenn via &amp;lt;code&amp;gt;setstate&amp;lt;/code&amp;gt; der Definitionsstatus gesetzt wird, wird die X_State-Funktion erst nach dem Setzen des Status aufgerufen. Man kann dabei zwar eine Fehlermeldung zurückgeben, der Status wird aber dennoch übernommen. Die Fehlermeldung wird lediglich dem Nutzer angezeigt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_State($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $time, $readingName, $value ) = @_;&lt;br /&gt;
&lt;br /&gt;
	return undef if($readingName &amp;quot;STATE&amp;quot; || $value ne &amp;quot;inactive&amp;quot;);&lt;br /&gt;
	readingsSingleUpdate($hash, &amp;quot;state&amp;quot;, &amp;quot;inactive&amp;quot;, 1);&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== X_Authorize ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Authorize($$$$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $client_hash, $type, $arg ) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	return $authorized;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Authorize-Funktion wird von fhem.pl aufgerufen um zu erfragen, ob ein bestimmter Client &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; die Aktion &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; ausführen darf. Auf diese Weise können Module Einfluss nehmen, welcher User welche Funktionen in FHEM nutzen darf. Wenn ein Client eine Aktion ausführen möchte, werden alle Module, die eine Authorize-Funktion implementiert haben, gefragt, ob diese Aktion ausgeführt werden darf. Als Rückgabewert wird das Ergebnis der Überprüfung zurückgegeben, wobei &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (unbekannt / nicht zuständig), &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (erlaubt) oder &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; (verboten) zurückgegeben werden können.&lt;br /&gt;
&lt;br /&gt;
Es gibt aktuell folgende &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; Kombinationen, mit denen die Authorize-Funktion aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! $type !! $arg !! Überschrift&lt;br /&gt;
|- &lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$type&#039;&#039;&#039; = &amp;quot;cmd&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Befehlsausführung&#039;&#039;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;set Lampe on&amp;quot;&amp;lt;/code&amp;gt; || Jeglicher FHEM-Befehl, der ausgeführt werden soll, wird in &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; hinterlegt, sodass innerhalb einer Authorize-Funktion der Befehl genauer geparst werden kann um zu entscheiden, ob dieser Befehl erlaubt ist, oder nicht.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;perl&amp;quot;&amp;lt;/code&amp;gt; || Ausführen von Perl-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;{ReadingsVal(&amp;quot;Lampe&amp;quot;, &amp;quot;state&amp;quot;, &amp;quot;off&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;shell&amp;quot;&amp;lt;/code&amp;gt; || Ausführen von Shell-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;&amp;quot;/opt/fhem/myScript.sh&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&#039;&#039;&#039;$type&#039;&#039;&#039; = &amp;quot;devicename&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sichtbarkeit von Geräten/Definitionen&#039;&#039; &lt;br /&gt;
| style=&amp;quot;white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&#039;&#039;&#039;$arg&#039;&#039;&#039; = &amp;quot;Licht_Wohnzimmer&amp;quot;&amp;lt;/code&amp;gt; || Sichtbarkeit des jeweiligen Gerät/Definition in FHEM. Dies bedeutet konkret die Auffindbarkeit im &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;-Befehl, sowie der Suche via [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wird eine solche Anfrage durch die Authorize-Funktion abgelehnt, ist das entsprechende Gerät bzw. Definition für den jeweiligen Client nicht sichtbar.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== X_Authenticate ====&lt;br /&gt;
{{Link2Forum|Topic=72757|Message=644098}}&lt;br /&gt;
&lt;br /&gt;
== Bereitstellen eines eigenen Befehls (Befehlsmodul) ==&lt;br /&gt;
&lt;br /&gt;
Ein Modul kann primär einen neuen FHEM-Befehl bereitstellen. Man spricht in so einem Fall nicht von einem Gerätemodul, sondern einem Befehlsmodul. Ein solches Befehlsmodul stellt nur einen einzelnen Befehl bereit, der dem Modulnamen entsprechen muss. Nur, wenn der Modulname dem Befehlsname entspricht, kann FHEM das Modul beim ersten Ausführen dieses unbekannten Befehls finden und nachladen.&lt;br /&gt;
&lt;br /&gt;
Der entsprechende Befehl wird dazu in der [[#X_Initialize|Initialize]]-Funktion im globalen Hash &amp;lt;code&amp;gt;[[DevelopmentModuleIntro#Wichtige_globale_Variablen_aus_fhem.pl|%cmds]]&amp;lt;/code&amp;gt; registriert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($$) {&lt;br /&gt;
&lt;br /&gt;
    $cmds{X} = { Fn           =&amp;gt; &amp;quot;CommandX&amp;quot;,&lt;br /&gt;
                 Hlp          =&amp;gt; &amp;quot;&amp;lt;argument1&amp;gt; [optional_argument2], print something very useful&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
                 # optionaler Filter für Clientmodule als regulärer Ausdruck&lt;br /&gt;
                 ClientFilter =&amp;gt; &amp;quot;FHEMWEB&amp;quot;&lt;br /&gt;
                };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird der neue Befehl &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; in FHEM registriert. Die Funktion mit dem Namen &amp;lt;code&amp;gt;CommandX&amp;lt;/code&amp;gt; setzt diesen Befehl innerhalb des Moduls um. Desweiteren wird eine kurze Aufrufsyntax mitgegeben, welche beim Aufruf des &amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt;-Befehls dem Nutzer angezeigt wird um als Gedankenstütze zu dienen. Optional kann man mittels &amp;lt;code&amp;gt;ClientFilter&amp;lt;/code&amp;gt; (regulärer Ausdruck für Modulnamen) die Ausführbarkeit nur auf bestimmte Client-Module (wie FHEMWEB oder telnet) beschränken. &lt;br /&gt;
&lt;br /&gt;
Nun muss noch die Funktion &amp;lt;code&amp;gt;CommandX&amp;lt;/code&amp;gt; im Rahmen des Moduls implementiert werden, welche den Befehl &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; umsetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
sub CommandX($$)&lt;br /&gt;
{&lt;br /&gt;
 	my ($client_hash, $arguments) = @_;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	return $output;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei werden der Befehlsfunktion zwei Parameter übergeben. Zuerst die Hash-Referenz des aufrufenden Clients (sofern manuell ausgeführt, ansonsten &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;) zwecks Rechteprüfung via [[allowed|allowed-Definitionen]]. Anschließend folgen die Aufrufparameter als zusammenhängende Zeichenkette. Die Trennung der einzelnen Argumente obligt der Funktion (bspw. via [[DevelopmentModuleAPI#parseParams|parseParams()]]). Als Funktionsrückgabewert wird eine Ausgabemeldung erwartet, die dem Nutzer angezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
== Pollen von Geräten ==&lt;br /&gt;
Wenn Geräte von sich aus keine Informationen senden sondern abgefragt werden müssen, kann man im Modul die Funktion [[DevelopmentModuleAPI#InternalTimer|InternalTimer()]] verwenden um einen Funktionsaufruf zu einem späteren Zeitpunkt durchführen zu können. Man übergibt dabei den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, sowie den zu übergebenden Parameter. Als zu übergebender Parameter wird üblicherweise der Hash der betroffenen Geräteinstanz verwendet. Damit hat die aufgerufene Funktion Zugriff auf alle wichtigen Daten der Geräteinstanz. Eventuell zusätzlich benötigte Werte können einfach als weitere Internals über den Hash zugänglich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise könnte man für das Abfragen eines Geräts in der [[#X_Define|Define]]-Funktion den Timer folgendermaßen setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
InternalTimer(gettimeofday()+2, &amp;quot;X_GetUpdate&amp;quot;, $hash);	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch in der [[#X_Notify|Notify]]-Funktion auf das Event &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt; reagieren und erst dort, den Timer anstoßen, sobald die Konfiguration komplett eingelesen wurde. Dies ist insbesondere notwendig, wenn man sicherstellen will, dass alle Attribute aus der Konfiguration gesetzt sind, sobald man einen Status-Update initiiert.&lt;br /&gt;
&lt;br /&gt;
In der Funktion &amp;lt;code&amp;gt;X_GetUpdate&amp;lt;/code&amp;gt; selbst wird dann der Timer neu gesetzt, so dass nach einem Intervall die Funktion erneut aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_GetUpdate($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
	Log3 $name, 4, &amp;quot;X: GetUpdate called ...&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# neuen Timer starten in einem konfigurierten Interval.&lt;br /&gt;
	InternalTimer(gettimeofday()+$hash-&amp;gt;{Interval}, &amp;quot;X_GetUpdate&amp;quot;, $hash);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innerhalb der Funktion kann man nun das Gerät abfragen und die abgefragten Werte in Readings speichern. Falls das Abfragen der Werte jedoch zu einer Verzögerung und damit zu einer Blockade von FHEM führen kann, ist es möglich, in der GetUpdate-Funktion nur die Aufforderung zum Senden bestimmter Daten an das angeschlossene Gerät zu senden und dann das Lesen über die oben beschriebene [[#X_Read|Read]]-Funktion zu implementieren.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Beschreibung der Timer-Funktion gibt es [[DevelopmentModuleAPI#Timer|hier im Wiki]]&lt;br /&gt;
&lt;br /&gt;
== Logging / Debugging ==&lt;br /&gt;
Um Innerhalb eines Moduls eine Log-Meldung in die FHEM-Logdatei zu schreiben, wird die Funktion [[DevelopmentModuleAPI#Log3|Log3()]] aufgerufen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log3 $name, 3, &amp;quot;X ($name) - Problem erkannt ...&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine genaue Beschreibung zu der Funktion inkl. Aufrufparameter findet man [[DevelopmentModuleAPI#Log3|hier]]. Es ist generell ratsam in der Logmeldung sowohl den Namen des eigenen Moduls zu schreiben, sowie den Namen des Geräts, welche diese Logmeldung produziert, da die Meldung, so wie sie ist, direkt in das Logfile wandert und es für User ohne diese Informationen schwierig ist, die Meldungen korrekt zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Log3() verwendet den Namen der Geräteinstanz um das &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;-Attribut zu prüfen. In der Regel wird bei Modulfunktionen jedoch immer nur der Gerätehash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; übergeben. Um den Namen der Definition zu ermitteln ist es daher notwendig sich diesen aus dem Hash extrahieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für eine einzelne Geräteinstanz das Verbose-Level zu erhöhen, ohne gleich für das gesamte FHEM den globalen Verbose-Level zu erhöhen und damit alle Meldungen zu erzeugen, kann man den Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;NAME&amp;gt; verbose&amp;lt;/code&amp;gt; verwenden. Beispielsweise &amp;lt;code&amp;gt;attr Lichtschalter_Wohnzimmer verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logmeldungen sollten je nach Art und Wichtigkeit für den Nutzer in unterschiedlichen Loglevels erzeugt werden. Es gibt insgesamt 5 Stufen in denen geloggt werden kann. Standardmäßig steht der systemweite Loglevel (&amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;-Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;) auf der Stufe 3. Die Bedeutung der jeweiligen Stufen ist in der {{Link2CmdRef|Lang=de|Anker=verbose}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
Während der Entwicklung eines Moduls kann man für eigene Debug-Zwecke auch die Funktion [[DevelopmentModuleAPI#Debug|Debug()]] verwenden um schnell und einfach Debug-Ausgaben in das Log zu schreiben. Diese sollten in der endgültigen Fassung jedoch nicht mehr vorhanden sein. Sie dienen ausschließlich zum Debugging während der Entwicklung.&lt;br /&gt;
&lt;br /&gt;
Eine genaue Beschreibung der Log-Funktion gibt es [[DevelopmentModuleAPI#Logging|hier im Wiki]].&lt;br /&gt;
&lt;br /&gt;
== Zweistufiges Modell für Module ==&lt;br /&gt;
[[Datei:Zweistufiges Modulkonzept.jpg|mini|rechts|Schematische Darstellung am Beispiel CUL]]&lt;br /&gt;
Es gibt viele Geräte, welche die Kommunikation mit weiteren Geräten mit tlw. unterschiedlichen Protokollen ermöglichen. Das typischste Beispiel bietet hier der [[CUL]], welcher via Funk mit verschiedenen Protokollen weitere Geräte ansprechen kann (z.B. Aktoren, Sensoren, ...). Hier bildet ein Gerät eine Brücke durch die weitere Geräte in FHEM zugänglich gemacht werden können. Dabei werden über einen Kommunikationsweg (z.B. serielle Schnittstelle, TCP, ...) beliebig viele Geräte gesteuert. Typische Beispiele dazu sind:&lt;br /&gt;
&lt;br /&gt;
* [[CUL]]: stellt Geräte mit verschiedenen Kommunikationsprotokollen via Funk bereit (u.a. [[FS20]], [[HomeMatic]], [[Funk-Heizkörperregler_Kurz-Bedienungsanleitung_FHT|FHT]], [[MAX]], ...)&lt;br /&gt;
* [[HMLAN]]: stellt HomeMatic Geräte via Funk bereit&lt;br /&gt;
* [[MAX#MAXLAN|MAXLAN]]: stellt [[MAX|MAX!]] Geräte via Funk bereit&lt;br /&gt;
* [[PanStamp#panStick.2FShield|panStamp]]: stellt weitere panStamp Geräte via Funk bereit&lt;br /&gt;
&lt;br /&gt;
Dabei wird die Kommunikation in 2 Stufen unterteilt:&lt;br /&gt;
* physisches Modul - z.B. 00_CUL.pm - zuständig für die physikalische Kommunikation mit der Hardware. Empfangene Daten müssen einem logischen Modul zugeordnet werden.&lt;br /&gt;
* logische Modul(e) - z.B. 10_FS20.pm - interpretiert protokollspezifische Nachrichten. Sendet protokollspezifische Daten über das physische Modul an die Hardware.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;physisches Modul&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das physische Modul öffnet die Datenverbindung zum Gerät (z.B. CUL) und verarbeitet sämtliche Daten. Es kümmert sich um den Erhalt der Verbindung (bsp. durch Keep-Alives) und konfiguriert das Gerät so, dass eine Kommunikation mit allen weiteren Geräten möglich ist (bsp. Frequenz, Modulation, Kanal, etc.).&lt;br /&gt;
&lt;br /&gt;
Empfangene Nutzdaten werden als Zeichenkette über die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] an logische Module weitergegeben.&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt eine [[#Die_Match-Liste|Match-Liste]] bereit, anhand FHEM die Nachricht einem Modul zuordnen kann, sofern dieses noch nicht geladen sein sollte. Die Match-Liste enthält eine Liste von regulären Ausdrücken und ordnet diese einem Modul zu. Wenn eine Nachricht auf einen solchen regulären Ausdruck passt und das Modul noch nicht geladen ist, lädt FHEM dieses automatisch nach, zwecks Verarbeitung der Nachricht. &lt;br /&gt;
&lt;br /&gt;
Anhand einer bereitgestellten [[#Die_Client-Liste|Client-Liste]] (Auflistung von logischen Modulen) kann FHEM feststellen, welche logischen Module mit dem physischen Modul kommunizieren können. Nur die hier aufgelisteten, logischen Module werden beim Aufruf von [[DevelopmentModuleAPI#Dispatch|Dispatch()]] angesprochen.&lt;br /&gt;
&lt;br /&gt;
Das Modul stellt eine [[#X_Write|Write]]-Funktion zur Verfügung, über die logische Module Daten in beliebiger Form an die Hardware übertragen können. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;logisches Modul&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das logische Modul interpretiert die via Dispatch() übergebene Nachricht (Zeichenkette) durch eine bereitgestellte [[#X_Parse|Parse]]-Funktion und erzeugt entsprechende Readings/Events. Es stellt über &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;-/&amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Kommandos Steuerungsmöglichkeiten dem Nutzer zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Es stellt FHEM einen [[#Der_Match-Ausdruck|Match-Ausdruck]] (regulärer Ausdruck) zur Verfügung anhand [[DevelopmentModuleAPI#Dispatch|Dispatch()]] ermitteln kann, ob die Nachricht durch das logische Modul verarbeitet werden kann. Nur Nachrichten, welche auf diesen Ausdruck passen, werden an das logische Modul weitergegeben (Aufruf [[#X_Parse|Parse]]-Funktion).&lt;br /&gt;
&lt;br /&gt;
=== Die Client-Liste ===&lt;br /&gt;
&lt;br /&gt;
Die Client-Liste ist eine Auflistung von Modulnamen (genauer: regulären Ausdrücken die auf Modulnamen passen) die in einem physischen Modul gesetzt ist. Damit wird definiert, mit welchen logischen Modulen das physikalische Modul  kommunizieren kann. &lt;br /&gt;
&lt;br /&gt;
Eine Client-Liste ist eine Zeichenkette, welche aus allen logischen Modulnamen besteht. Die einzelnen Namen werden durch einen Doppelpunkt getrennt. Anstatt kompletter Modulnamen können auch reguläre Ausdrücke verwendet werden, die auf mehrere Modulnamen passen (z.B. &amp;lt;code&amp;gt;CUL_.*&amp;lt;/code&amp;gt; um die logischen Module CUL_HM, CUL_MAX, etc. zu verwenden).&lt;br /&gt;
&lt;br /&gt;
Bsp.: Die Client-Liste von dem Modul CUL lautet daher wie folgt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FS20:FHT.*:KS300:USF1000:BS:HMS:CUL_EM:CUL_WS:CUL_FHTTK:CUL_HOERMANN:ESA2000:CUL_IR:CUL_TX:Revolt:IT:UNIRoll:SOMFY:STACKABLE_CC:CUL_RFR:CUL_TCM97001:CUL_REDIRECT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle hier aufgelisteten Module können über das Modul CUL Daten empfangen bzw. senden.&lt;br /&gt;
&lt;br /&gt;
Die Client-Liste hat generell folgende Funktion:&lt;br /&gt;
* Die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur Module, welche in der Client-Liste enthalten sind, ob diese die Nachricht verarbeiten können (Prüfung via [[#Der Match-Ausdruck|Match-Ausdruck]])&lt;br /&gt;
* Die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] prüft anhand sämtlicher Client-Listen in FHEM, welches IO-Gerät für ein logisches Gerät nutzbar ist.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise wird die Client-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{Clients} = &amp;quot;FS20:KS300:FHT.*&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann die Client-Liste jedoch auch pro physikalisches Gerät setzen. Eine gesetzte Client-Liste in einem Gerät hat immer Vorrang vor der Liste im Modul-Hash. Eine gerätespezifische Client-Liste wird dann verwendet, wenn bspw. ein Gerät je nach Konfiguration nur bestimmte logische Module bedienen kann. Bspw. kann ein CUL je nach RF-Einstellungen FS20, uvm. oder nur HomeMatic bedienen. In einem solchen Fall wird die Client-Liste im Geräte-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, $def ) = @_;&lt;br /&gt;
	...&lt;br /&gt;
	$hash-&amp;gt;{Clients} = &amp;quot;CUL_HM&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
	# ggf.&lt;br /&gt;
	$hash-&amp;gt;{ClientsKeepOrder} = 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In vielen Modulen, welche nach dem zweistufigem Konzept arbeiten, beginnt und endet die Client-Liste mit einem Doppelpunkt. Dies ist ein historisches Überbleibsel, da der Prüfmechanismus die Client-Liste früher auf das Vorhandensein von &amp;lt;code&amp;gt;&#039;&#039;&#039;&amp;lt;u&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt;&amp;lt;/u&amp;gt;&#039;&#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039;&#039;&amp;lt;u&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt;&amp;lt;/u&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt; prüfte. Dies ist nun nicht mehr notwendig. Die einzelnen Modulnamen müssen lediglich durch einen Doppelpunkt getrennt werden.&lt;br /&gt;
&lt;br /&gt;
Wird das Internal &amp;quot;ClientsKeepOrder&amp;quot; auf 1 gesetzt, können in &amp;quot;Clients&amp;quot; keine regulären Ausdrücke mehr angegeben werden. Dies hat einen erheblichen Einfluss, auf die Verarbeitungsdauer und sollte in Betracht gezogen werden.&lt;br /&gt;
&lt;br /&gt;
=== Die Match-Liste ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;lt;u&amp;gt;&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;:&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
Sämtliche regulären Ausdrücke in der Match-Liste werden &amp;quot;case insensitive&amp;quot; überprüft. Das bedeutet, dass Groß-/Kleinschreibung nicht berücksichtigt wird.&lt;br /&gt;
&lt;br /&gt;
Um dennoch in einem regulären Ausdruck auf Groß-/Kleinschreibung zu prüfen, kann man dieses mit dem Modifizierer &amp;lt;code&amp;gt;(?-i)&amp;lt;/code&amp;gt; wieder aktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my %matchListFHEMduino = (&lt;br /&gt;
    ....&lt;br /&gt;
    &amp;quot;5:FHEMduino_PT2262&amp;quot;   =&amp;gt; &amp;quot;^(?-i)IR.*\$&amp;quot;,&lt;br /&gt;
    ....&lt;br /&gt;
    &amp;quot;13:IT&amp;quot;                =&amp;gt; &amp;quot;^(?-i)i......\$&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe dazu Forumsbeitrag: {{Link2Forum|Topic=33422}}&lt;br /&gt;
}}&lt;br /&gt;
Die Match-Liste ordnet eine Nachrichtensyntax (regulärer Ausdruck) einem Modulnamen zu und wird in einem physikalischen Modul gesetzt. Sollte eine Nachricht vom physikalischen Gerät empfangen werden, die durch kein geladenes Modul verarbeitet werden kann ([[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur alle bisher geladenen Module aus der [[#Die Client-Liste|Client-Liste]]), so wird über die Match-Liste geprüft, welches Modul diese Nachricht verarbeiten kann. Dieses Modul wird anschließend geladen und die Nachricht durch dieses direkt durch Aufruf der [[#X_Parse|Parse]]-Funktion verarbeitet. In dieser Liste findet mittels regulärem Ausdruck eine Zuordnung der Nachrichtenstruktur zum verarbeitenden logischen Modul statt.&lt;br /&gt;
&lt;br /&gt;
Diese Liste wird ausschließlich in der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion verwendet. Sollte keine passendes Modul, welches bereits geladen ist, zur Verarbeitung einer Nachricht gefunden werden, so wird mithilfe der Match-Liste aufgrund der vorliegenden Nachricht das entsprechende Modul ermittelt. Dieses Modul wird dann direkt geladen und die Nachricht wird via [[#X_Parse|Parse]]-Funktion verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Die Match-Liste ist eine Zuordnung von einem Sortierpräfix + Modulname zu einem regulären Ausdruck:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;1:FS20&amp;quot;  =&amp;gt; &amp;quot;^81..(04|0c)..0101a001&amp;quot;,&lt;br /&gt;
    &amp;quot;2:KS300&amp;quot; =&amp;gt; &amp;quot;^810d04..4027a001&amp;quot;,&lt;br /&gt;
    &amp;quot;3:FHT&amp;quot;   =&amp;gt; &amp;quot;^81..(04|09|0d)..(0909a001|83098301|c409c401)..&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Sortierpräfix (&amp;lt;code&amp;gt;&amp;lt;u&amp;gt;1:&amp;lt;/u&amp;gt;&amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;FS20&amp;lt;/font&amp;gt;&amp;lt;/code&amp;gt;) dient als Sortierhilfe um so die Reihenfolge der Prüfung festzulegen. Bei der Prüfung wird die Match-Liste mittels sort() nach dem Schlüssel (Sortierpräfix + Modulname) sortiert und die regulären Ausdrücke werden dann nacheinander getestet. Daher sollten die präzisesten Ausdrücke immer zuerst getestet werden, sofern es weniger präzise Ausdrücke in der Match-Liste gibt. Dabei ist zu beachten, dass der Sortierpräfix nicht nach numerischen Regeln sortiert wird, sondern zeichenbasierend.&lt;br /&gt;
&lt;br /&gt;
Üblicherweise wird die Match-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
   my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
   $hash-&amp;gt;{MatchList} = { &amp;quot;1:FS20&amp;quot;      =&amp;gt; &amp;quot;^81..(04|0c)..0101a001&amp;quot;,&lt;br /&gt;
                          &amp;quot;2:KS300&amp;quot;     =&amp;gt; &amp;quot;^810d04..4027a001&amp;quot;,&lt;br /&gt;
                          &amp;quot;3:FHT&amp;quot;       =&amp;gt; &amp;quot;^81..(04|09|0d)..(0909a001|83098301|c409c401)..&amp;quot; };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann die Match-Liste, ähnlich wie bei der Client-Liste, auch pro physikalisches Gerät setzen. Dabei hat auch hier die Match-Liste eines Gerätes immer Vorrang vor der Match-Liste aus dem Modul-Hash:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Define($$)&lt;br /&gt;
{&lt;br /&gt;
   my ($hash, $def) = @_;&lt;br /&gt;
&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
   $hash-&amp;gt;{MatchList} = { &amp;quot;1:CUL_HM&amp;quot; =&amp;gt; &amp;quot;^A....................&amp;quot; };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Der Match-Ausdruck ===&lt;br /&gt;
&lt;br /&gt;
Ein Match-Ausdruck wird in einem logischen Modul gesetzt und dient der Prüfung, ob eine Nachricht durch das eigene Modul via [[#X_Parse|Parse]]-Funktion verarbeitet werden kann. Es handelt sich hierbei um einen einzelnen regulären Ausdruck, den FHEM innerhalb der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion prüft. Nur wenn eine Nachricht via Dispatch() auf diesen Audruck matcht, wird die Parse-Funktion des eigenen Moduls aufgerufen um die Nachricht zu verarbeiten. &lt;br /&gt;
&lt;br /&gt;
Der Hintergrund, warum man den Aufruf mit einem solchen Ausdruck vorher abprüft, liegt in der Möglichkeit, dass ein physikalisches Modul mehrere unterschiedliche logische Module ansprechen kann. So kann FHEM jedes geladene Modul durch diesen Match-Ausdruck prüfen, ob es diese Nachricht verarbeiten kann. Erst, wenn alle geladenen Module, aufgrund einer Prüfung des Ausdrucks, die Nachricht nicht verarbeiten können, wird via [[#Die_Match-Liste|Match-Liste]] ermittelt, welches Modul geladen werden muss um die Nachricht zu verarbeiten. &lt;br /&gt;
&lt;br /&gt;
Der Match-Ausdruck wird in der [[#X_Initialize|Initialize]]-Funktion zur Verfügung gestellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
	...&lt;br /&gt;
	&lt;br /&gt;
	# Dieses Modul verarbeitet FS20 Nachrichten&lt;br /&gt;
	$hash-&amp;gt;{Match} = &amp;quot;^81..(04|0c)..0101a001&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Die vollständige Implementierung ===&lt;br /&gt;
&lt;br /&gt;
Hier nun eine Zusammenfassung beim zweistufigen Modulkonzept in der jeweiligen Stufe implementiert werden muss, damit die Kommunikation funktioniert.&lt;br /&gt;
&lt;br /&gt;
==== physisches Modul ====&lt;br /&gt;
&lt;br /&gt;
Das physische Modul, welches als Kommunikationsbrücke zwischen der Hardware und logischen Modulen fungieren wird, sollte mindestens folgende Funktionen implementieren:&lt;br /&gt;
&lt;br /&gt;
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.&lt;br /&gt;
* [[#X_Define|Define]]-Funktion - Zum öffnen der Datenverbindung zur Hardware (IP-Adresse/serielle Schnittstelle/...).&lt;br /&gt;
* [[#X_Read|Read]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.&lt;br /&gt;
* [[#X_Read|Ready]]-Funktion - Zum Wiederaufbau der Verbindung bei Verbindungsabbruch, bzw. Prüfung auf lesbare Daten bei serieller Schnittstelle unter Windows.&lt;br /&gt;
* [[#X_Write|Write]]-Funktion - Zum Senden von Daten, welche logische Module via [[DevelopmentModuleAPI#IOWrite|IOWrite()]] an die Hardware übertragen möchten.&lt;br /&gt;
* [[#X_Undef|Undef]]-Funktion - Schließen der Verbindung zur Hardware beim Löschen via &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [[#X_Shutdown|Shutdown]]-Funktion - Schließen der Verbindung zur Hardware beim Stopp von FHEM via &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [[#X_DelayedShutdown | DelayedShutdown]]-Funktion - Verzögertes beenden zum Schließen der Verbindung zur Hardware beim Stopp von FHEM via &amp;lt;code&amp;gt;shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:&lt;br /&gt;
&lt;br /&gt;
* [[#Die_Client-Liste|Client-Liste]] - Auflistung aller logischen Module, die über dieses Modul kommunizieren können&lt;br /&gt;
* [[#Die_Match-Liste|Match-Liste]] - Zuordnung von Nachrichtensyntax zu Modul zwecks Autoload-Funktionalität.&lt;br /&gt;
&lt;br /&gt;
==== logisches Modul ====&lt;br /&gt;
&lt;br /&gt;
Das logische Modul, bildet ein einzelnes Gerät ab, über das mit einem physikalisches Modul kommuniziert werden kann. Es sollte mindestens folgende Funktionen implementieren:&lt;br /&gt;
&lt;br /&gt;
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.&lt;br /&gt;
* [[#X_Define|Define]]-Funktion - Speichern des Definition Pointers (siehe [[#X_Parse|Parse-Funktion]])&lt;br /&gt;
* [[#X_Parse|Parse]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.&lt;br /&gt;
* [[#X_Undef|Undef]]-Funktion - Löschen des Definition Pointers beim Löschen via &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:&lt;br /&gt;
&lt;br /&gt;
* [[#Der_Match-Ausdruck|Match-Ausdruck]] - Prüfausdruck, ob eine Nachricht durch dieses Modul verarbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von der Hardware bis zu den logischen Modulen ===&lt;br /&gt;
&lt;br /&gt;
Die Gerätedefinition des physischen Moduls öffnet eine Verbindung zur Hardware (z.B. via [[DevIo]]). Die [[#X_Read|Read]]-Funktion wird bei anstehenden Daten aus der Hauptschleife von fhem.pl aufgerufen.&lt;br /&gt;
&lt;br /&gt;
Die Read-Funktion stellt dabei sicher, dass die Daten&lt;br /&gt;
* komplett (in der Regel über einen internen Puffer in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;) und&lt;br /&gt;
* korrekt (z.B. via Prüfung mittels regulärem Ausdruck)&lt;br /&gt;
sind und ruft die globale Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] mit einer kompletten Nachricht auf.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() prüft alle geladenen Module aus der [[#Die_Client-Liste|Client-Liste]] des physikalischen Moduls nach möglichen logischen Modulen zur Verarbeitung. Alle zum Zeitpunkt geladenen Module, die in der Client-Liste aufgeführt sind, werden über den [[#Der_Match-Ausdruck|Match-Ausdruck]] geprüft, ob sie mit der Nachricht etwas anfangen können. Sollte bei einem logischen Modul der Match-Ausdruck passen, so wird die entsprechende [[#X_Parse|Parse]]-Funktion des logischen Moduls aufgerufen. Sofern keine passendes Modul gefunden wurde, um die Nachricht zu verarbeiten, wird in der [[#Die_Match-Liste|Match-Liste]] im Geräte- bzw. Modul-Hash der physischen Gerätedefinition nach dem passenden Modul gesucht. Sollte es darin ein Modul geben, was diese Art von Nachricht verarbeiten kann, so wird versucht dieses Modul zu laden um nun die Nachricht via Parse-Funktion zu verarbeiten. Es erfolgt in diesem Fall keine Vorprüfung durch den Match-Ausdruck.&lt;br /&gt;
&lt;br /&gt;
Durch Dispatch() wird nun die [[#X_Parse|Parse]]-Funktion des gefundenen logischen Moduls aufgerufen. Diese&lt;br /&gt;
* interpretiert die übergebene Nachricht,&lt;br /&gt;
* versucht eine existierende Gerätedefinition in FHEM zu finden (z.B. mittels Definition Pointer), für welche die Nachricht addressiert ist,&lt;br /&gt;
* setzt alle [[#Readings|Readings]] für die gefundene Gerätedefinition via [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen,&lt;br /&gt;
* gibt den Namen der logischen Definition zurück, welche die Nachricht verarbeitet hat.&lt;br /&gt;
&lt;br /&gt;
Sollte keine passende Gerätedefinition für die entsprechende Nachricht existieren (Adresse/ID/Kanal/...), wird der Gerätename &amp;quot;UNDEFINED&amp;quot; inkl. einem passenden &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Statement zurückgegeben, um die Definition durch [[autocreate]] erzeugen zu lassen.&lt;br /&gt;
&lt;br /&gt;
Es findet während der Verarbeitung einer Nachricht durch Dispatch()/Parse-Funktion keine sofortige Eventverarbeitung (via [[DevelopmentModuleAPI#Dispatch|DoTrigger()]]) statt, wenn die [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen verwendet werden.&lt;br /&gt;
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() triggert das Event-Handling für das von der Parse-Funktion zurückgegebene logische Device selbstständig nach Abschluss der Parse-Funktion.&lt;br /&gt;
&lt;br /&gt;
Optional führt die Funktion Dispatch() eine Überprüfung auf Nachrichtenduplikate beim Einsatz von mehreren IO-Geräten durch. Dazu wird eine implementierte [[#X_Fingerprint|Fingerprint]]-Funktion im physischen oder logischen Modul benötigt. Sollte der Fingerprint einer Nachricht innerhalb einer bestimmten Zeit (globales Attribut &amp;lt;code&amp;gt;dupTimeout&amp;lt;/code&amp;gt;, standardmäßig 500ms) bereits empfangen worden sein, so wird die Nachricht verworfen. Dies ist insbesondere bei funkbasierter Hardware notwendig, wenn mehrere Empfänger die selbe Nachricht empfangen.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von den logischen Modulen bis zur Hardware ===&lt;br /&gt;
&lt;br /&gt;
Um von einem logischen Modul eine Nachricht an die Hardware senden zu können, muss zunächst im logischen Gerät ein passenden IO-Gerät ausgewählt sein. Dazu muss die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] ein entsprechendes IO-Gerät auswählen und in &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt; setzen. Dieser Aufruf wird üblicherweise in der [[#X_Define|Define]]-Funktion des logischen Moduls ausgeführt. Erst, wenn ein IO-Gerät ausgewählt wurde, können Daten über das physikalische Gerät an die Hardware übermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Senden von Daten ruft das logische Modul die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] samt Daten auf. Diese ruft für das entsprechende IO-Gerät die [[#X_Write|Write]]-Funktion auf und übergibt die Daten zum Schreiben an das physikalische Modul. Die Write-Funktion kümmert sich nun um die Übertragung der Daten an die Hardware. &lt;br /&gt;
&lt;br /&gt;
Keine direkten Zugriffe zwischen dem logischen und dem physischen Gerät gibt (d.h. keine direkten Aufrufe von Funktionen, kein direktes Überprüfen von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;-Inhalten, ...), so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie bei der [[RFR_CUL|RFR]]-Funktionalität) oder mittels [[FHEM2FHEM]] im RAW-Modus zwei FHEM-Installationen verbunden werden und die logischen Geräte können dennoch kommunizieren.&lt;br /&gt;
&lt;br /&gt;
=== Automatisches Anlegen von logischen Gerätedefinitionen (autocreate) ===&lt;br /&gt;
&lt;br /&gt;
Das logische Modul kann im Rahmen der [[#X_Parse|Parse]]-Funktion eine neue Gerätedefinition anlegen, sofern eine passende Definition nicht existieren sollte. Die Parse-Funktion gibt generell den Namen der logischen Gerätedefinition zurück, für welche die Nachricht verarbeitet wurde. Sollte keine passende Definition gefunden werden, so muss die Parse-Funktion folgenden Rückgabewert liefern (zusammenhängende Zeichenkette):&lt;br /&gt;
&lt;br /&gt;
 UNDEFINED &#039;&#039;&amp;amp;lt;Namensvorschlag&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Modulname&amp;amp;gt;&#039;&#039; &#039;&#039;&amp;amp;lt;Define-Parameter...&amp;amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sollte also bspw. im Rahmen der Parse-Funktion zu Modul X eine Nachricht nicht einer existierenden Gerätedefinition zugeordnet werden können, so muss ein Namensvorschlag erstellt werden der eine eindeutige Komponente wie bspw. eine Adresse/ID/Kanal-Nr enthält. In der Regel wird hier immer der Modulname zusammen mit der eindeutigen Komponente, durch einen Unterstrich getrennt, verwendet (Bsp: &amp;lt;code&amp;gt;X_4834&amp;lt;/code&amp;gt;). Der Modulname ist in der Regel immer der, des eigenen Moduls. In besonderen Fällen kann man hier auch einen abweichenden Modulnamen angeben. Dies wird bspw. bei den [[PanStamp#FHEM-Module.2FDevice_Definition_Files|SWAP-Modulen]] eingesetzt. Als Define-Parameter müssen alle notwendigen Parameter angegeben werden, die beim Aufruf des &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehls notwendig sind, damit eine neu angelegte Gerätedefinition Nachrichten zu dieser eindeutigen Adresse Daten verarbeitet. Dazu muss mind. die eindeutige Adresse mitgegeben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel für FS20:&lt;br /&gt;
&lt;br /&gt;
 UNDEFINED FS20_0ae42f8 FS20 0ae42 f8&lt;br /&gt;
&lt;br /&gt;
Sobald [[DevelopmentModuleAPI#Dispatch|Dispatch()]] einen solchen Rückgabewert von einer [[#X_Parse|Parse]]-Funktion erhält, wird diese Zeichenkette so wie sie ist via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] als Event für die Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; getriggert.&lt;br /&gt;
&lt;br /&gt;
Sofern der Nutzer das Modul [[autocreate]] verwendet (definiert hat), kümmert sich dieses nun um das Anlegen einer entsprechenden Gerätedefinition. Es lauscht dabei auf generierte Events der Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; via [[#X_Notify|Notify]]-Funktion. Der Nutzer kann dabei das Verhalten von autocreate durch entsprechende Parameter beeinflussen.&lt;br /&gt;
&lt;br /&gt;
Das Modul, für welches autocreate eine neue Definition anlegen möchte, kann das Verhalten durch entsprechende Parameter im Modul-Hash beeinflussen. Dabei gilt, dass gesetzte Attribute durch den Nutzer generell Vorrang haben. Die entsprechenden Parameter werden dabei im Rahmen der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
 &lt;br /&gt;
	...&lt;br /&gt;
 &lt;br /&gt;
	$hash-&amp;gt;{AutoCreate} = {&amp;quot;X_.*&amp;quot;  =&amp;gt; { ATTR   =&amp;gt; &amp;quot;event-on-change-reading:.* event-min-interval:.*:300&amp;quot;,&lt;br /&gt;
	                                    FILTER =&amp;gt; &amp;quot;%NAME&amp;quot;,&lt;br /&gt;
	                                    GPLOT  =&amp;gt; &amp;quot;temp4hum4:Temp/Hum,&amp;quot;,&lt;br /&gt;
	                                    autocreateThreshold =&amp;gt; &amp;quot;2:140&amp;quot;&lt;br /&gt;
					  }&lt;br /&gt;
	                      };&lt;br /&gt;
			    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei wird unterhalb von &amp;lt;code&amp;gt;$hash-&amp;gt;{AutoCreate}&amp;lt;/code&amp;gt; eine Liste angelegt, wo einem regulären Ausdruck für einen anzulegenden Definitionsnamen entsprechende Optionen zugeordnet werden. Sobald durch autocreate eine Gerätedefintion angelegt wird, auf den ein hier gelisteter Ausdruck matcht, so werden die zugeordneten Optionen berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
Hier eine Auflistung aller möglichen Optionen und ihrer Bedeutung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Optionsname !! Beispiel !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;ATTR&amp;lt;/code&amp;gt;|| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&amp;quot;event-on-change-reading:.* event-min-interval:.*:300&amp;quot;&amp;lt;/code&amp;gt; || Eine Auflistung von Attributen, die nach dem Anlegen einer Definition zusätzlich gesetzt werden. Es handelt sich hierbei um eine Leerzeichen-separierte Liste von Doppelpunkt-getrennten Tupels mit Attributname und -wert.&lt;br /&gt;
&lt;br /&gt;
Für das dargestellte Beispiel bedeutet dies, dass nach dem Anlegen der Definition folgende FHEM-Befehle zusätzlich ausgeführt werden:&lt;br /&gt;
&lt;br /&gt;
 attr &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; event-on-change-reading .*&lt;br /&gt;
 attr &#039;&#039;&amp;amp;lt;Name&amp;amp;gt;&#039;&#039; event-min-interval .*:300&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;&amp;quot;%NAME&amp;quot;&amp;lt;/code&amp;gt;|| Sofern in der autocreate-Definiton das Attribut &amp;lt;code&amp;gt;filelog&amp;lt;/code&amp;gt; entsprechend durch den Nutzer gesetzt ist, wird eine zugehörige FileLog-Definition angelegt. Diese Option setzt den dabei benutzten Filter-Regexp, der beim Anlegen der FileLog-Definition gesetzt wird. &lt;br /&gt;
&lt;br /&gt;
Dabei werden folgende Platzhalter durch die entsprechenden Werte der neu angelegten Gerätedefinition ersetzt:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;%NAME&amp;lt;/code&amp;gt; - wird ersetzt durch den Definitionsnamen&lt;br /&gt;
* &amp;lt;code&amp;gt;%TYPE&amp;lt;/code&amp;gt; - wird ersetzt durch den Modulnamen&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&amp;quot;temp4hum4:Temp/Hum,&amp;quot;&amp;lt;/code&amp;gt; || Sofern eine FileLog-Definition angelegt wurde, kann man weiterführend dazu eine passende SVG-Definition erzeugen um Daten aus dem erzeugten FileLog zu visualisieren. Ein typischer Fall sind hierbei Temperatursensoren, wo es sinnvoll sein kann, einen passenden SVG-Plot mit Temperatur/Luftfeuchtigkeit direkt anzulegen.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich hierbei um eine kommaseparierte Auflistung von gplot-Dateinamen und optionalen Label-Texten durch einen Doppelpunkt getrennt. Im genannten Beispiel entspricht &amp;lt;code&amp;gt;temp4hum4&amp;lt;/code&amp;gt; der zu verwendenden GnuPlot-Datei und &amp;lt;code&amp;gt;Temp/Hum&amp;lt;/code&amp;gt; dem zu verwendenden Label ([[SVG]] Attribut &amp;lt;code&amp;gt;label&amp;lt;/code&amp;gt;). Das Label wird auch durch FileLog verwendet als Link-Text zum entsprechenden SVG Plot. Alternativ kann auch nur die entsprechende GnuPlot-Datei anegeben werden ohne Label. Für jede angegebene GnuPlot-Datei wird anschließend eine entsprechende SVG-Definition erzeugt mit der vorher erzeugten FileLog-Definition als Datenquelle.&lt;br /&gt;
&lt;br /&gt;
Der gesamte Inhalt der &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt;-Option wird beim Anlegen einer FileLog-Definition dem Attribut &amp;lt;code&amp;gt;logtype&amp;lt;/code&amp;gt; als Wert plus dem Text &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; zugewiesen. Daher muss der Inhalt der Option &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; immer mit einem Komma enden. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; || style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;&amp;quot;2:10&amp;quot;&amp;lt;/code&amp;gt; || Definiert, wie viele Aufrufe (im Bsp: &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;) von autocreate innerhalb welcher Zeit (im Bsp: &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; Sek.) stattfinden müssen, bevor die Gerätedefinition tatsächlich durch autocreate angelegt wird. Dadurch kann das ungewollte Anlegen von Geräten verhindert werden die tatsächlich nicht in Echt existieren. Aufgrund von Funkstörungen kann es durchaus zum ungewollten Anlegen einer Definition kommen. Diese Funktion lässt eine Definition erst zu wenn innerhalb einer vorgegeben Zeit eine Mindestzahl an Nachrichten eintrifft.&lt;br /&gt;
&lt;br /&gt;
Die erste Zahl stellt dabei die Mindestanzahl an Nachrichten dar. Die Zweite Zahl stellt die Zeit in Sekunden dar, in der die Mindestanzahl an Nachrichten erreicht werden muss um eine entsprechende Gerätedefinition anzulegen. &lt;br /&gt;
&lt;br /&gt;
Sofern diese Option nicht gesetzt ist, wird standardmäßig &amp;lt;code&amp;gt;2:60&amp;lt;/code&amp;gt; verwendet.&lt;br /&gt;
&lt;br /&gt;
Diese Option kann durch den Anwender über das Attribut &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; übersteuert werden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; | &amp;lt;code&amp;gt;noAutocreatedFilelog&amp;lt;/code&amp;gt;|| style=&amp;quot;vertical-align:top; white-space: nowrap;&amp;quot; |  &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;|| Flag. Sofern gesetzt, wird keine FileLog- und ggf. SVG-Definition erzeugt. Selbst wenn der Nutzer durch entsprechende Attribute das Anlegen wünscht. Diese Option ist sinnvoll für Module bzw. Geräte die keine Readings erzeugen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ergänzende Hinweise ==&lt;br /&gt;
Die Wahl der vorangestellten Nummer für den Dateinamen eines neuen Moduls hat keine Bedeutung mehr, es sei denn die Nummer ist 99. Module, die mit 99_ beginnen, werden von FHEM automatisch geladen. Module mit einer anderen Nummer nur wenn ein &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Befehl dafür sorgt, dass das Modul geladen wird.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Modul Initialisierungsdaten benötigt, sollten diese im Modul selbst enthalten sein. Eine zusätzliche Datei oder sogar ein Unterverzeichnis mit mehreren Dateien ist bei FHEM nicht üblich und sollte bei Modulen, die mit FHEM ausgeliefert werden nur in Rücksprache mit Rudolf König angelegt werden, da sie sonst bei einem Update nicht verteilt werden.&lt;br /&gt;
&lt;br /&gt;
== Weitere Informationen ==&lt;br /&gt;
Wenn man weitere Details wissen möchte, ist ein erster sinnvoller Schritt ein Blick in die Datei fhem.pl. Dort sieht man im Perl-Code wie die Module aufgerufen werden, was vorher passiert und was danach. Am Anfang der Datei (ca. ab Zeile 130) findet man beispielsweise eine Liste der globalen Variablen, die den Modulen zur Verfügung stehen sowie Details zu den wichtigen Hashes %modules und %defs. Wer mit Perl noch nicht so gut klar kommt, dem hilft eventuell ein Blick auf die Perldoc Website[http://perldoc.perl.org/] oder in das Perl-Buch seiner Wahl. Auch die FHEM {{Link2CmdRef}} sollte nicht unterschätzt werden. Es stehen oft mehr interessante Details auch für Modulentwickler darin als man zunächst vermuten könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Hello World&amp;quot; Beispiel ==&lt;br /&gt;
&lt;br /&gt;
98_Hello.pm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
package main;&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my %Hello_gets = (&lt;br /&gt;
	&amp;quot;whatyouwant&amp;quot;	=&amp;gt; &amp;quot;can&#039;t&amp;quot;,&lt;br /&gt;
	&amp;quot;whatyouneed&amp;quot;	=&amp;gt; &amp;quot;try sometimes&amp;quot;,&lt;br /&gt;
	&amp;quot;satisfaction&amp;quot;  =&amp;gt; &amp;quot;no&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
sub Hello_Initialize($) {&lt;br /&gt;
    my ($hash) = @_;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{DefFn}      = &#039;Hello_Define&#039;;&lt;br /&gt;
    $hash-&amp;gt;{UndefFn}    = &#039;Hello_Undef&#039;;&lt;br /&gt;
    $hash-&amp;gt;{SetFn}      = &#039;Hello_Set&#039;;&lt;br /&gt;
    $hash-&amp;gt;{GetFn}      = &#039;Hello_Get&#039;;&lt;br /&gt;
    $hash-&amp;gt;{AttrFn}     = &#039;Hello_Attr&#039;;&lt;br /&gt;
    $hash-&amp;gt;{ReadFn}     = &#039;Hello_Read&#039;;&lt;br /&gt;
&lt;br /&gt;
    $hash-&amp;gt;{AttrList} =&lt;br /&gt;
          &amp;quot;formal:yes,no &amp;quot;&lt;br /&gt;
        . $readingFnAttributes;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Define($$) {&lt;br /&gt;
    my ($hash, $def) = @_;&lt;br /&gt;
    my @param = split(&#039;[ \t]+&#039;, $def);&lt;br /&gt;
    &lt;br /&gt;
    if(int(@param) &amp;lt; 3) {&lt;br /&gt;
        return &amp;quot;too few parameters: define &amp;lt;name&amp;gt; Hello &amp;lt;greet&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    my $hash-&amp;gt;{name}  = $param[0];&lt;br /&gt;
    my $hash-&amp;gt;{greet} = $param[2];&lt;br /&gt;
    &lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Undef($$) {&lt;br /&gt;
    my ($hash, $arg) = @_; &lt;br /&gt;
    # nothing to do&lt;br /&gt;
    return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Get($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;get Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	if(!$Hello_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if($attr{$name}{formal} eq &#039;yes&#039;) {&lt;br /&gt;
	    return $Hello_gets{$opt}.&#039;, sir&#039;;&lt;br /&gt;
    }&lt;br /&gt;
	return $Hello_gets{$opt};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub Hello_Set($@) {&lt;br /&gt;
	my ($hash, @param) = @_;&lt;br /&gt;
	&lt;br /&gt;
	return &#039;&amp;quot;set Hello&amp;quot; needs at least one argument&#039; if (int(@param) &amp;lt; 2);&lt;br /&gt;
	&lt;br /&gt;
	my $name = shift @param;&lt;br /&gt;
	my $opt = shift @param;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @param);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($Hello_gets{$opt})) {&lt;br /&gt;
		my @cList = keys %Hello_gets;&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of &amp;quot; . join(&amp;quot; &amp;quot;, @cList);&lt;br /&gt;
	}&lt;br /&gt;
    $hash-&amp;gt;{STATE} = $Hello_gets{$opt} = $value;&lt;br /&gt;
    &lt;br /&gt;
	return &amp;quot;$opt set to $value. Try to get it.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub Hello_Attr(@) {&lt;br /&gt;
	my ($cmd,$name,$attr_name,$attr_value) = @_;&lt;br /&gt;
	if($cmd eq &amp;quot;set&amp;quot;) {&lt;br /&gt;
        if($attr_name eq &amp;quot;formal&amp;quot;) {&lt;br /&gt;
			if($attr_value !~ /^yes|no$/) {&lt;br /&gt;
			    my $err = &amp;quot;Invalid argument $attr_value to $attr_name. Must be yes or no.&amp;quot;;&lt;br /&gt;
			    Log 3, &amp;quot;Hello: &amp;quot;.$err;&lt;br /&gt;
			    return $err;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
		    return &amp;quot;Unknown attr $attr_name&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return undef;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
1;&lt;br /&gt;
&lt;br /&gt;
=pod&lt;br /&gt;
=begin html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;Hello&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Hello&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;i&amp;gt;Hello&amp;lt;/i&amp;gt; implements the classical &amp;quot;Hello World&amp;quot; as a starting point for module development. &lt;br /&gt;
    You may want to copy 98_Hello.pm to start implementing a module of your very own. See &lt;br /&gt;
    &amp;lt;a href=&amp;quot;http://wiki.fhem.de/wiki/DevelopmentModuleIntro&amp;quot;&amp;gt;DevelopmentModuleIntro&amp;lt;/a&amp;gt; for an &lt;br /&gt;
    in-depth instruction to your first module.&lt;br /&gt;
    &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-define&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Define&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; Hello &amp;amp;lt;greet&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Example: &amp;lt;code&amp;gt;define HELLO Hello TurnUrRadioOn&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        The &amp;quot;greet&amp;quot; parameter has no further meaning, it just demonstrates&lt;br /&gt;
        how to set a so called &amp;quot;Internal&amp;quot; value. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#define&amp;quot;&amp;gt;commandref#define&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the define command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-set&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Set&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;set &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;set&amp;lt;/i&amp;gt; any value to any of the following options. They&#039;re just there to &lt;br /&gt;
        &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; them. See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#set&amp;quot;&amp;gt;commandref#set&amp;lt;/a&amp;gt; &lt;br /&gt;
        for more info about the set command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Options:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;satisfaction&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;no&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouwant&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;can&#039;t&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
              &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;whatyouneed&amp;lt;/i&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
                  Defaults to &amp;quot;try sometimes&amp;quot;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-get&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Get&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;get &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;option&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        You can &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; the value of any of the options described in &lt;br /&gt;
        &amp;lt;a href=&amp;quot;#Helloset&amp;quot;&amp;gt;paragraph &amp;quot;Set&amp;quot; above&amp;lt;/a&amp;gt;. See &lt;br /&gt;
        &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#get&amp;quot;&amp;gt;commandref#get&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the get command.&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;a id=&amp;quot;Hello-attr&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Attributes&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;code&amp;gt;attr &amp;amp;lt;name&amp;amp;gt; &amp;amp;lt;attribute&amp;amp;gt; &amp;amp;lt;value&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        See &amp;lt;a href=&amp;quot;http://fhem.de/commandref.html#attr&amp;quot;&amp;gt;commandref#attr&amp;lt;/a&amp;gt; for more info about &lt;br /&gt;
        the attr command.&lt;br /&gt;
        &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        Attributes:&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;&amp;lt;i&amp;gt;formal&amp;lt;/i&amp;gt; no|yes&amp;lt;br&amp;gt;&lt;br /&gt;
                When you set formal to &amp;quot;yes&amp;quot;, all output of &amp;lt;i&amp;gt;get&amp;lt;/i&amp;gt; will be in a&lt;br /&gt;
                more formal language. Default is &amp;quot;no&amp;quot;.&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=end html&lt;br /&gt;
&lt;br /&gt;
=cut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der HTML-Code zwischen den Tags &amp;lt;code&amp;gt;=pod&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;=cut&amp;lt;/code&amp;gt; dient zur Generierung der commandref.html. Der HTML-Inhalt wird automatisch beim Verteilen des Moduls im Rahmen des Update-Mechanismus aus jedem Modul extrahiert und daraus die Commandref in verschiedenen Sprachen erstellt. Eine detaillierte Beschreibung wie ein Commandref-Abschnitt in einem Modul definiert wird, siehe: [[Guidelines zur Dokumentation]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=37100</id>
		<title>DevelopmentModuleAPI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=37100"/>
		<updated>2022-01-12T21:25:43Z</updated>

		<summary type="html">&lt;p&gt;Sidey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Randnotiz|RNTyp=r|RNText=Bitte beachten: Diese Auflistung von Funktionen wird nicht aktiv durch alle Entwickler gepflegt. Es kann daher keine Garantie auf Vollständigkeit und Korrektheit gegeben werden. Letztendlich entscheidend ist immer der Perl-Code, Unstimmigkeiten sollten im [https://forum.fhem.de/index.php/board,80.0.html FHEM-Forum] angemerkt werden!&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
Please note: This list of functions is not officially maintained by all developers. So there is no guarantee for completeness and correctness. In the end it is always the Perl code itself that is relevant; please report errors and omissions in the [https://forum.fhem.de/index.php/board,80.0.html FHEM forum]!&lt;br /&gt;
}}&lt;br /&gt;
Diese Seite soll eine Beschreibung der für Moduleentwickler verfügbaren Funktionen enthalten, um für Modulentwickler &lt;br /&gt;
* Wiederverwendbare Routinen leichter identifizieren zu können&lt;br /&gt;
* Durch Wiederverwendung mehr Einheitlichkeit zu erzeugen&lt;br /&gt;
* Aufwand zu verringern&lt;br /&gt;
* Bei Änderungen auch betroffene Module leichter identifizieren zu können&lt;br /&gt;
&lt;br /&gt;
Natürlich hat diese Seite keinen Anspruch auf Vollständigkeit und jeder ist aufgefordert mitzuarbeiten, sobald er beim Stöbern über eine Funktion stolpert, die auch andere interessieren könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FHEM-Befehlsausführung ==&lt;br /&gt;
&lt;br /&gt;
=== AnalyzeCommand ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$error = AnalyzeCommand($client_hash, $cmd);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AnalyzeCommand() ermöglicht das Parsen und die Ausführung eines einzelnen FHEM-Befehls.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Definition-Hash, welcher für die Ausführung dieses Kommandos verantwortlich ist. Dies dient zur Prüfung, ob diese Definition das Kommando &amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;). Der Definition-Hash muss in &amp;lt;code&amp;gt;SNAME&amp;lt;/code&amp;gt; den zum Attribut &amp;lt;code&amp;gt;validFor&amp;lt;/code&amp;gt; (im zugehörigen allowed-Device) passenden Devicenamen tragen, damit die Prüfung durchgeführt wird. Wenn anstatt eines Definitions-Hashes der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wird, erfolgt keine Prüfung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Ein einzelnes Kommando, welches ausgeführt werden soll (ACHTUNG: keine Kommando-Ketten!!!).&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;define dummy1 dummy&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;{Log3(undef, 1, &amp;quot;Hallo&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehlermeldungen, die beim Ausführen des Kommandos aufgetreten sind. Wenn keine Fehlermeldungen aufgetreten sind, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AnalyzeCommandChain ===&lt;br /&gt;
AnalyzeCommandChain() ermöglicht die Ausführung von FHEM-Befehlsketten. Dabei werden mehrere FHEM-Kommandos durch ein Semikolon getrennt und nacheinander mittels AnalyzeCommand() ausgeführt.&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$errors = AnalyzeCommandChain ($client_hash, $cmds)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Definition-Hash, welcher für die Ausführung dieser Kommandos verantwortlich ist. Dies dient zur Prüfung, ob diese Definition die Kommandos &amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt; ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;).Der Definition-Hash muss in &amp;lt;code&amp;gt;SNAME&amp;lt;/code&amp;gt; den zum Attribut &amp;lt;code&amp;gt;validFor&amp;lt;/code&amp;gt; (im zugehörigen allowed-Device) passenden Devicenamen tragen, damit die Prüfung durchgeführt wird. Wenn anstatt eines Definitions-Hashes der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wird, erfolgt keine Prüfung.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Kommandokette, welche ausgeführt werden soll, durch &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; getrennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;define dummy1 dummy; list dummy1; {Log(3,&amp;quot;dummy created&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$errors&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehlermeldungen, die beim ausführen der Kommandos aufgetreten sind. Wenn keine Fehlermeldungen aufgetreten sind, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AnalyzePerlCommand ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$errors = AnalyzePerlCommand ($client_hash, $cmds);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AnalyzePerlCommand() ermöglicht die Ausführung von Perl-Kommandos/Routinen. Sofern &amp;quot;$client_hash&amp;quot; angegeben wurde, wird die  Authorisierung geprüft (man kann mit allowed die Ausfuehrung von perl untersagen). &lt;br /&gt;
Mehrere Kommandos sind innerhalb von &amp;quot;$cmds&amp;quot; durch Semikolon zu trennen. &lt;br /&gt;
&lt;br /&gt;
Sollten Warnung bei der Ausführung der Perl-Kommandos auftreten, werden sie im FHEM-Logfile mit verbose-Level &amp;quot;1&amp;quot; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Sind [[#EvalSpecials|EvalSpecials()]] definiert, können diese Definitionen innerhalb des übergebenen Perl-Codes verwendet werden.&lt;br /&gt;
Ebenfalls werden die Variablen $we (siehe holiday2we), $sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst (siehe Perl localtime) sowie $hms (Zeit im sprintf-Format &amp;quot;hh:mm:ss&amp;quot;) generiert und können somit im auszuführenden Code verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Definition-Hash, welcher für die Ausführung dieser Kommandos verantwortlich ist. Dies dient zur Prüfung, ob diese Definition die Kommandos &amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt; ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;).Der Definition-Hash muss in &amp;lt;code&amp;gt;SNAME&amp;lt;/code&amp;gt; den zum Attribut &amp;lt;code&amp;gt;validFor&amp;lt;/code&amp;gt; (im zugehörigen allowed-Device) passenden Devicenamen tragen, damit die Prüfung durchgeführt wird. Wenn anstatt eines Definitions-Hashes der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wird, erfolgt keine Prüfung.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Perl-Kommando(s), welche ausgeführt werden sollen, durch &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; getrennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt; my $ignore; if($we) {$ignore=1} &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$errors&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehlermeldungen, die beim Ausführen der Kommandos aufgetreten sind. Wenn keine Fehlermeldungen aufgetreten sind, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== EvalSpecials ===&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$final_cmd = EvalSpecials($cmd, %specials);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
EvalSpecials() ermöglicht die Ersetzung von Platzhaltern in FHEM-Befehlen, welche durch AnalyzeCommandChain() zur Ausführung gebracht werden sollen. Dabei werden alle Schlüssel von &amp;lt;code&amp;gt;%specials&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; gesucht und durch die entsprechenden Werte aus &amp;lt;code&amp;gt;%specials&amp;lt;/code&amp;gt; ersetzt. &lt;br /&gt;
&lt;br /&gt;
Diese Funktion hat je nach gewähltem Featurelevel (globales Attribut &amp;lt;code&amp;gt;featurelevel&amp;lt;/code&amp;gt;) unterschiedliches Verhalten um die Kompatibilität mit früheren FHEM-Versionen und deren Konfiguration zu wahren.&lt;br /&gt;
&lt;br /&gt;
In jedem Falle muss der zurückgegebene String mit AnalyzeCommandChain() zur Ausführung gebracht werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Eine gültige FHEM-Kommando-Kette welche mit etwaigen Platzhaltern versehen ist, die ersetzt werden sollen.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;set $NAME power on; {Log(3, &amp;quot;power on $NAME for $ADDRESS&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;%specials&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Hash, welcher als Schlüssel die zu ersetzenden Platzhalter-Namen den zu ersetzenden Werten zuordnet. Jeder Schlüssel ist aus historischen Gründen mit einem Prozentzeichen zu beginnen. Die Platzhalter müssen zusammenhängend sein und dürfen nur aus Zahlen, Buchstaben und Unterstrichen (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) bestehen. Generell sollten die Schlüssel aber nur aus Großbuchstaben bestehen.&lt;br /&gt;
&lt;br /&gt;
Bspw: &amp;lt;code&amp;gt;(&amp;quot;%NAME&amp;quot; =&amp;gt; &amp;quot;Definition_A&amp;quot;, &amp;quot;%ADDRESS&amp;quot; =&amp;gt; &amp;quot;192.168.0.2&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$final_cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Das fertige Kommando, welches so direkt an AnalyzeCommandChain() übergeben werden muss.&lt;br /&gt;
&lt;br /&gt;
Ab Featurelevel 5.7 sind die Platzhalter in diesem String nicht ersetzt. Die Ersetzung wird in diesem Fall in AnalyzeCommandChain() vorgenommen, wo die einzelnen Platzhalter ersetzt werden. Die Funktion EvalSpecials() speichert in diesem Falle nur den Hash im Hintergrund, die eigentliche Ersetzung wird dann durch AnalyzeCommandChain() und deren untergeordneten Funktionen übernommen.&lt;br /&gt;
&lt;br /&gt;
In Featurelevel 5.6 und vorher wird ein Suchen/Ersetzen der Platzhalter in EvalSpecials() selbst vorgenommen. Hierbei ist der zurückgegebene String das finale Kommando, welches keine Platzhalter mehr beinhaltet. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== parseParams ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;my($a, $h) = parseParams($cmd);&lt;br /&gt;
my($a, $h) = parseParams($cmd, $separator, $joiner, $keyvalueseparator);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parseParams() ermöglicht das Parsen von Kommandozeilenargumenten und lässt sich z.B. für die Parameter von define ([[DevelopmentModuleIntro#X_Define|DefineFn]]), get ([[DevelopmentModuleIntro#X_Get|GetFn]]) und set ([[DevelopmentModuleIntro#X_Set|SetFn]]) verwenden. Beim Parsen werden erkannt:&lt;br /&gt;
* einfache, durch den Separator getrennte, Zeichenfolgen&lt;br /&gt;
* benannte Parameter der Form &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;=&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Werte können in einfache (&amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;) oder doppelte (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;) Anführungszeichen eingeschlossen sein, um so den jeweiligen Separator zu enthalten&lt;br /&gt;
** Ein solches Pärchen aus gleichen Anführungszeichen an Anfang und Ende eines Wertes wird beim Parsen entfernt.&lt;br /&gt;
* in &amp;lt;code&amp;gt;{...}&amp;lt;/code&amp;gt; eingeschlossener Perlcode. Hier wird nach der ersten öffnenden bis zur zugehörigen schliessenden Klammer gesucht. D.h. bis die gleiche Anzahl öffnender und schliessender Klammern erreicht ist. &lt;br /&gt;
&lt;br /&gt;
In der Modul &amp;lt;code&amp;gt;X_Initialize&amp;lt;/code&amp;gt; Routine lässt sich mit &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; festlegen, dass parseParams für die define, get und set Argumente automatisch aufgerufen und das Ergebnis an die DefFn, GetFn und SetFn übergeben wird.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Argumente des Kommandos als String oder als Array-Referenz. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$separator&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Der Separator, an dem die Parameterzeile in einzelne Parameter gesplittet werden soll. Dieser Parameter wird nur beachtet, wenn die Argumente als Zeichenkette übergeben werden. &lt;br /&gt;
&lt;br /&gt;
Standardwert: &#039; &#039; &#039;&#039;(Leerzeichen)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;code&amp;gt;$joiner&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;code&amp;gt;$keyvalueseparator&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|Trennzeichen, das &amp;lt;name&amp;gt;- von &amp;lt;wert&amp;gt;-Paaren trennt, Standardwert ist &#039;=&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Eine Referenz auf ein Array, das alle nicht benannten Parameter in der Reihenfolge ihres Vorkommens enthält.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$h&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Eine Referenz auf einen Hash, der die Werte aller benannten Parameter mit ihrem Namen als Key enthält. (Achtung: Ein Hash ist nicht sortiert!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel: Die Zeile &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; test1 test2=abc test3 &amp;quot;test4 test4&amp;quot; test5=&amp;quot;test5 test5&amp;quot; test6=&#039;test6=test6&#039; test7= test8=&amp;quot;&#039;&amp;quot; test9=&#039;&amp;quot;&#039; {my $x = &amp;quot;abc&amp;quot;} test10={ { my $abc =&amp;quot;xyz&amp;quot; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
wird in die folgenden Elemente geparst:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
# Die nicht benannten Parameter:&lt;br /&gt;
$a = [&lt;br /&gt;
          &#039;set&#039;,&lt;br /&gt;
          &#039;&amp;lt;name&amp;gt;&#039;,&lt;br /&gt;
          &#039;test1&#039;,&lt;br /&gt;
          &#039;test3&#039;,&lt;br /&gt;
          &#039;test4 test4&#039;,&lt;br /&gt;
          &#039;{my $x = &amp;quot;abc&amp;quot;}&#039;&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
# Die benannten Parameter:&lt;br /&gt;
$h = {&lt;br /&gt;
          &#039;test10&#039; =&amp;gt; &#039;{ { my $abc =&amp;quot;xyz&amp;quot; } }&#039;,&lt;br /&gt;
          &#039;test5&#039; =&amp;gt; &#039;test5 test5&#039;,&lt;br /&gt;
          &#039;test8&#039; =&amp;gt; &#039;\&#039;&#039;,&lt;br /&gt;
          &#039;test2&#039; =&amp;gt; &#039;abc&#039;,&lt;br /&gt;
          &#039;test7&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
          &#039;test9&#039; =&amp;gt; &#039;&amp;quot;&#039;,&lt;br /&gt;
          &#039;test6&#039; =&amp;gt; &#039;test6=test6&#039;&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== asyncOutput ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;asyncOutput($client_hash, $message);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion asyncOutput() kann man an einen bestimmten Client (FHEMWEB oder telnet) gezielt Daten übermitteln, die auf diesem Client angezeigt werden sollen. Damit können Kommandos via FHEMWEB oder Telnet gestartet werden und das Ergebnis zu einem späteren Zeitpunkt zurückgegeben werden. Ebenso können so Daten angefordert werden und erst zum Zeitpunkt des Eintreffens via asyncOutput() an den entsprechenden Client weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
Um diese Funktion nutzen zu können, muss das Modul, über das eine Client-Verbindung besteht, eine [[DevelopmentModuleIntro#X_AsyncOutputFn|AsyncOutputFn]] bereitstellen. Dies wird aktuell nur in [[FHEMWEB]] und telnet unterstützt. Man kann die Unterstützung für eine asynchrone Datenübermittlung vorab mittels einer if-Abfrage auf&amp;lt;code&amp;gt;$client_hash-&amp;gt;{canAsyncOutput}&amp;lt;/code&amp;gt; prüfen, da es durchaus passieren kann, dass unter bestimmten Umständen keine asynchrone Übertragung möglich ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Client-Instanz (telnet- oder FHEMWEB-Instanz), auf das die Ausgabe erfolgen soll. Dieser Client-Hash wird beim Aufruf der [[DevelopmentModuleIntro#X_Set|SetFn]] und [[DevelopmentModuleIntro#X_Get|GetFn]] unter &amp;lt;code&amp;gt;$hash-&amp;gt;{CL}&amp;lt;/code&amp;gt; bereitgestellt. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Daten als Zeichenkette, welche ausgegeben werden sollen. &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SetExtensions ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$error = SetExtensions($hash, $usage_list, @set_args);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion SetExtensions() wird durch das Hilfsmodul SetExtensions.pm bereitgestellt und implementiert weiterführende Set-Befehle basierend auf den Grundbefehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Sie wird ausschließlich im Rahmen der Modulprogrammierung in der [[DevelopmentModuleIntro#X_Set|Set]]-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
Ein Implementierungsbeispiel gibt es im Wiki-Artikel zur [[DevelopmentModuleIntro#X_Set|Set]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Die Hash-Referenz der Gerätedefinition, für die gerade die [[DevelopmentModuleIntro#X_Set|Set]]-Funktion ausgeführt wird.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$usage_list&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Die Auflistung aller möglichen Kommandos als Zeichenkette, welche innerhalb der Set-Funktion unterstützt werden. Es handelt sich hierbei nur reinweg um die Auflistung der Kommandos ohne das Präfix &amp;lt;code&amp;gt;unknown command &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;[...]&#039;&#039;&amp;lt;/font&amp;gt; choose one of&amp;lt;/code&amp;gt;. Diese Liste muss mind. die Befehle &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; enthalten, damit SetExtensions() zusätzliche Set-Befehle anbieten kann. Es können hierbei FHEMWEB-spezifische Widget-Optionen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;on off statusRequest&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;on:noArg off:noArg input:av1,av2,av3 volume&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@set_args&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Sämtliche Argumente, welche an die Set-Funktion übergeben wurden (ausser &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;). Dieses Array entspricht einem Array aus den Parametern &amp;lt;code&amp;gt;($name, $cmd, @args)&amp;lt;/code&amp;gt; aus dem [[DevelopmentModuleIntro#X_Set|Artikel zur Set-Funktion]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehler- bzw. Usage-Meldung, die beim Ausführen von SetExtensions() aufgetreten ist. Diese Rückmeldung muss direkt als Rückgabewert der Set-Funktion verwendet werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[DevelopmentModuleAPI#SetExtensionsCancel|SetExtensionsCancel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Time / Timestamp ==&lt;br /&gt;
&lt;br /&gt;
=== FmtDateTimeRFC1123===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestampGMT = FmtDateTimeRFC1123($timestamp);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Gibt den übergebenen UNIX-Timestamp (Sekunden seit EPOCH-Beginn) formatiert nach RFC 1123 zurück.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Zeitangabe wie sie von der &amp;lt;code&amp;gt;time()&amp;lt;/code&amp;gt; Funktion zurückgegeben wird&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestampGMT &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel GMT (Greenwich Mean Time) wie er in RFC 1123 beschrieben wird. Diese werden zum Beispiel bei http verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Sat, 05 Mar 2016 18:17:48 GMT&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FmtDateTime===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = FmtDateTime($time);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wandelt einen UNIX-Timestamp (Sekunden seit Beginn der UNIX-Epoche: 01.01.1970 00:00:00 UTC) in eine formatierte Angabe in der lokalen Zeitzone um.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$time&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Zeitangabe wie sie von der &amp;lt;code&amp;gt;time()&amp;lt;/code&amp;gt; Funktion zurückgegeben wird.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel in lokaler Zeitzone im Format&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TimeNow ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = TimeNow();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion TimeNow() gibt die aktuelle lokale Zeit als formatierte Zeichenkette zurück. Diese Funktion hat keine Übergabeparameter.&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel der aktuellen Uhrzeit in lokaler Zeitzone im Format&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzt die Funktion &amp;lt;code&amp;gt;FmtDateTime()&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== fhemTimeGm===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = fhemTimeGm($sec, $min, $hour, $mday, $month, $year);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wandelt einen Zeitpunkt als Greenwich Mean Time (GMT) basierend auf den einzelnen Datumsangaben, wie er bspw. durch die Perl-Funktion &amp;lt;code&amp;gt;gmtime()&amp;lt;/code&amp;gt; erzeugt wird, in einen UNIX-Timestamp um.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$sec&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Sekunden-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$min&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Minuten-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hour&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Stunden-Komponente als Ganzzahl zwischen 0 und 23.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$mday&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Tag-Komponente als Ganzzahl zwischen 1 und 31.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$month&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Monats-Komponente als Ganzzahl zwischen 0 und 11. Hier erfolgt eine andere Zuordnung. Der Januar entspricht der 0, Februar der 1, usw. Der Dezember entspricht dem Wert 11.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$year&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Jahres-Komponente. Das Jahr wird dabei nicht als komplette Jahreszahl angegeben, sondern als Differenz seit dem Jahr 1900. Das Jahr 2016 entspricht demnach dem Wert 116.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel als UNIX-Timestamp (Sekunden seit EPOCH-Beginn) &amp;lt;br&amp;gt;&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== fhemTimeLocal===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = fhemTimeLocal($sec, $min, $hour, $mday, $month, $year);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wandelt einen Zeitpunkt in lokaler Zeit basierend auf den einzelnen Datumsangaben wie er bspw. durch die Perl-Funktion &amp;lt;code&amp;gt;localtime()&amp;lt;/code&amp;gt; erzeugt wird in einen UNIX-Timestamp um.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$sec&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Sekunden-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$min&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Minuten-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hour&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Stunden-Komponente als Ganzzahl zwischen 0 und 23.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$mday&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Tag-Komponente als Ganzzahl zwischen 1 und 31.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$month&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Monats-Komponente als Ganzzahl zwischen 0 und 11. Hier erfolgt eine andere Zuordnung. Der Januar entspricht der 0, Februar der 1, usw. Der Dezember entspricht dem Wert 11.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$year&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Jahres-Komponente. Das Jahr wird dabei nicht als komplette Jahreszahl angegeben, sondern als Differenz seit dem Jahr 1900. Das Jahr 2016 entspricht demnach dem Wert 116.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel als UNIX-Timestamp (Sekunden seit EPOCH-Beginn) &amp;lt;br&amp;gt;&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings / Events ==&lt;br /&gt;
&lt;br /&gt;
=== readingsBeginUpdate ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion readingsBeginUpdate() bereitet die Definition mit dem Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; auf ein Update von Readings vor. Dies betrifft insbesondere das Setzen von Umgebungsvariablen sowie dem aktuellen Zeitstempel als Änderungszeitpunkt. Der Aufruf dieser Funktion ist notwendig um eigentliche Updates mit der Funktion readingsBulkUpdate() auf der gewünschten Definition durchführen zu können. &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Hash-Referenz der Definition, wo Readings geupdatet werden sollen &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsBulkUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$rv = readingsBulkUpdate($hash, $reading, $value);&lt;br /&gt;
$rv = readingsBulkUpdate($hash, $reading, $value, $changed);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsBulkUpdate() führt ein Update eines einzelnen Readings für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; durch. Dabei wird das Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; auf den Wert &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; gesetzt. Bevor diese Funktion benutzt werden kann, muss readingsBeginUpdate() zuvor aufgerufen werden, ansonsten werden keine Updates durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo Readings geupdatet werden sollen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Wert, welchen das Reading annehmen soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$changed&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Flag, ob ein Event für dieses Update erzeugt werden soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Oder ob definitiv kein Event erzeugt werden soll (Wert: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;). Wenn nicht gesetzt, wird aufgrund entsprechender Attribute in der Definition von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; entschieden, ob ein Event zu erzeugen ist, oder nicht (Attribute: [[event-on-change-reading]], [[event-on-update-reading]], [[event-min-interval]], ...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$rv&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette bestehend aus Reading und Wert getrennt durch einen Doppelpunkt, welcher anzeigt, auf welchen Wert das Reading tatsächlich gesetzt wurde.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsBulkUpdateIfChanged ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$rv = readingsBulkUpdateIfChanged($hash, $reading, $value);&lt;br /&gt;
$rv = readingsBulkUpdateIfChanged($hash, $reading, $value, $changed);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsBulkUpdateIfChanged() führt ein Update eines einzelnen Readings für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; durch, sofern sich der neue Wert &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; gegenüber dem vorherigen Wert verändert. Dabei wird das Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; auf den Wert &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; gesetzt. Bevor diese Funktion benutzt werden kann, muss readingsBeginUpdate() zuvor aufgerufen werden, ansonsten werden keine Updates durchgeführt. Nur, sobald sich der Wert des Readings verändert, wird die Funktion readingsBulkUpdate() ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo Readings geupdatet werden sollen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Wert, welchen das Reading annehmen soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$changed&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Flag, ob ein Event für dieses Update erzeugt werden soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Oder ob definitiv kein Event erzeugt werden soll (Wert: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;). Wenn nicht gesetzt, wird aufgrund entsprechender Attribute in der Definition von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; entschieden, ob ein Event zu erzeugen ist, oder nicht (Attribute: event-on-change-reading, event-on-update-reading, event-min-interval, ...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$rv&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette bestehend aus Reading und Wert getrennt durch einen Doppelpunkt, welcher anzeigt, auf welchen Wert das Reading tatsächlich gesetzt wurde. Sofern der alte Wert dem neuen Wert entspricht, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsEndUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsEndUpdate($hash, $do_trigger);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsEndUpdate() beendet den Bulk-Update Prozess durch die Funktionen readingsBeginUpdate() &amp;amp; readingsBulkUpdate() und triggert optional die entsprechenden Events sämtlicher erzeugter Readings für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;. Desweiteren werden nachgelagerte Tasks wie bspw. die Erzeugung von User-Readings (Attribut: &amp;lt;code&amp;gt;userReadings&amp;lt;/code&amp;gt;), sowie die Erzeugung des STATE aufgrund des Attributs &amp;lt;code&amp;gt;stateFormat&amp;lt;/code&amp;gt; durchgeführt. Sofern &amp;lt;code&amp;gt;$do_trigger&amp;lt;/code&amp;gt; gesetzt ist, werden alle anstehenden Events nach Abschluss getriggert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo Readings geupdatet wurden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$do_trigger&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Flag, ob entsprechende Events der einzelnen Readings getriggert werden sollen (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Wenn dieses Flag den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, werden keine Events für alle Readings die seit dem Aufruf von readingsBeginUpdate() mittels readingsBulkUpdate() gesetzt wurden, erzeugt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsSingleUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$rv = readingsSingleUpdate($hash, $reading, $value, $do_trigger);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsSingleUpdate() führt ein einzelnes Reading-Update mithilfe der Funktionen readingsBeginUpdate(), readingsBulkUpdate() und readingsEndUpdate() durch. Es entspricht dabei einem Aufruf aller 3 Funktionen nacheinander mit den entsprechenden einzelnen Parametern in den jeweiligen Funktionen.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo das Reading geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Wert, welchen das Reading annehmen soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$do_trigger&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Flag, ob evtl. ein Event für das Reading getriggert werden soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, Event ist abhängig von den Attributen: event-on-change-reading, event-on-update-reading, event-min-interval, ...). Wenn dieses Flag den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, wird kein Event erzeugt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$rv&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette bestehend aus Reading und Wert getrennt durch einen Doppelpunkt, welcher anzeigt, auf welchen Wert das Reading tatsächlich gesetzt wurde.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsDelete ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsDelete($hash, $reading);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsDelete() löscht das Reading &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; aus der Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo das Reading gelöscht werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches gelöscht werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DoTrigger ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = DoTrigger($name, $new_state);&lt;br /&gt;
$ret = DoTrigger($name, $new_state, $no_replace);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion DoTrigger() triggert alle angesammelten Events in &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; sowie zusätzlich das Event &amp;lt;code&amp;gt;$new_state&amp;lt;/code&amp;gt; für die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; und führt alle verarbeitenden Aktionen in allen Empfängern zu diesem Event aus. Wenn in &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; keine zu bearbeitenden Änderungen enthalten sind, wird lediglich &amp;lt;code&amp;gt;$new_state&amp;lt;/code&amp;gt; getriggert (sofern gesetzt).&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird implizit in der Funktion readingsEndUpdate() aufgerufen und muss daher nicht nochmal aufgerufen werden. &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name der Definition deren Events durchgeführt werden sollen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$new_state&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Das Event welches zusätzlich zu bereits anstehenden Events aus &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; getriggert werden soll. Wenn dieser Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; ist, werden nur alle Events aus &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; bearbeitet, sofern &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; gefüllt ist.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$no_replace&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Optionales Flag, welches die Ersetzung von Events durch das Attribut &amp;lt;code&amp;gt;eventMap&amp;lt;/code&amp;gt; verhindert (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette welche alle Return-Werte aller aufgerufenen Notify-Funktionen beinhaltet, sofern diese einen Fehler melden. Diese Meldung wird parallel im FHEM-Logfile ausgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== deviceEvents ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$events = deviceEvents($hash, $with_state);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion deviceEvents() gibt alle anstehenden Events für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; als Array-Referenz zurück. Diese Funktion ist bei der Modulentwicklung primär zur Nutzung in der [[DevelopmentModuleIntro#X_Notify|NotifyFn]] vorgesehen, um die anstehenden Events zu ermitteln. &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, deren anstehende Events zurückgegeben werden sollen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$with_state&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Flag, ob das Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; mit dem Readingnamen in der zurückgegebenen Event-Liste erscheinen soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) oder nur der Wert ohne dem vorangestellten Readingnamen &amp;quot;&amp;lt;code&amp;gt;state: &amp;lt;/code&amp;gt;&amp;quot; (Wert: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) in der Event-Liste angezeigt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$events&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Eine Array-Referenz, welche alle anstehenden Events als Liste bereitstellt. Sofern keine Events anstehen, ist der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bsp. (mit &amp;lt;code&amp;gt;$with_state = 0&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[ &lt;br /&gt;
    &amp;quot;humidity: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;T: 10.5 H: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;temperature: 10.5&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bsp. (mit &amp;lt;code&amp;gt;$with_state = 1&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[ &lt;br /&gt;
    &amp;quot;humidity: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;state: T: 10.5 H: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;temperature: 10.5&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== notifyRegexpChanged ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
notifyRegexpChanged($hash, $event_regexp);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion notifyRegexpChanged() setzt für &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; einen passenden Eintrag in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; basierend auf dem regulären Ausdruck &amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt;, welcher üblicherweise in der [[DevelopmentModuleIntro#X_Define|Define-Funktion]] als Argument übergeben wird. Dadurch wird die [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] nur für Events der entsprechenden Gerätedefinition aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Je nach dem, wie &amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt; formuliert ist, setzt notifyRegexpChanged() einen Eintrag in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt;. Es kann durchaus vorkommen, dass kein Eintrag in NOTIFYDEV gesetzt wird, da nicht zweifelsfrei zwischen Definitionsnamen und Event unterschieden werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diese Funktion kann nur verwendet werden, wenn &#039;&#039;&#039;&amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt;&#039;&#039;&#039; auf &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;amp;lt;Definitionsnamen&amp;amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;amp;lt;Definitionsnamen&amp;amp;gt;:&amp;amp;lt;Event&amp;amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; matcht (Event Regexp-Syntax aus [[notify]]).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Hash-Referenz der Definition, für welche eine neue Event-Regexp gesetzt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Regexp, welche für &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; gesetzt wurde (i.d.R via [[DevelopmentModuleIntro#X_Define|Define-Funktion]])&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== goodReadingName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$valid = goodReadingName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion goodReadingName() prüft, ob der Readingname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; ein gültiger Bezeichner innerhalb von FHEM ist. Ein gültiger Readingname besteht aus folgenden Zeichen bzw. Zeichengruppen:&lt;br /&gt;
&lt;br /&gt;
* Normale Buchstaben ohne deutsche Sonderzeichen (A-Z, groß/klein)&lt;br /&gt;
* Zahlen (0-9)&lt;br /&gt;
* Punkt &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
* Unterstrich &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bindestrich &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&lt;br /&gt;
* Schrägstrich &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte der Readingname gültig sein, gibt die Funktion als Rückgabewert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein Readingname aus gültigen Zeichen besteht.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Readingname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$return&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Wahrheitswert, ob der übergebene Readingname zulässig ist.&lt;br /&gt;
Folgende Werte sind möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Readingname enthält unzulässige Zeichen&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Readingname besteht aus zulässigen Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== makeReadingName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$validName = makeReadingName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion makeReadingName() entfernt aus dem übergebenen Readingname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; alle ungültigen Zeichen und ersetzt diese durch einen Unterstrich &amp;quot;_&amp;quot;. Als Rückgabewert erhält man nun einen konformen Readingname in dem nur noch erlaubte Zeichen (Buchstaben, Zahlen, Punkt sowie Unterstrich) enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Readingname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$validName&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der modifizierte Name, welcher übergeben wurde, ohne ungültige Zeichen. Alle evtl. ungültigen Zeichen sind durch einen Unterstrich ersetzt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== zweistufige Modulkommunikation ==&lt;br /&gt;
&lt;br /&gt;
=== AssignIoPort ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
AssignIoPort($hash);&lt;br /&gt;
AssignIoPort($hash, $proposedName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion AssignIoPort() sucht nach einem passenden IO-Gerät (physikalische Definition) nach folgender Vorgehensweise:&lt;br /&gt;
&lt;br /&gt;
# Sofern &amp;lt;code&amp;gt;$proposedName&amp;lt;/code&amp;gt; angegeben ist und der Gerätename existiert und nicht disabled ist (Attribute &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; auf 1 gesetzt), wird &amp;lt;code&amp;gt;$proposedName&amp;lt;/code&amp;gt; als IO-Gerät ausgewählt. &lt;br /&gt;
# Sofern der Nutzer über das Attribut &amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt; einen Gerätenamen konfiguriert hat, wird dieser als IO-Gerät ausgewählt.&lt;br /&gt;
# Es werden alle Module geprüft, die entsprechende Nachrichten des Modultyps von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; als IO-Gerät annehmen (via [[DevelopmentModuleIntro#Die_Client-Liste|Client-Liste]]). Die passende Definition, welche als letztes definiert wurde, wird als IO-Gerät ausgewählt.&lt;br /&gt;
&lt;br /&gt;
In den Fällen 1 und 2 wird keine Prüfung durchgeführt, ob das gewählte IO-Gerät überhaupt von dem eigenen Modul Daten verarbeiten kann. Im Fehlerfall wird beim Aufruf von [[#IOWrite|IOWrite()]] eine Fehlermeldung im Logfile erzeugt.&lt;br /&gt;
&lt;br /&gt;
Das gefundene IO-Gerät wird mittels Hash-Referenz unter &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt; gespeichert. Sollte kein passendes IO-Gerät gefunden werden, wird eine Meldung im Logfile produziert.&lt;br /&gt;
&lt;br /&gt;
Generell sollte bei logischen Modulen die Funktion AssignIoPort() im Rahmen der [[DevelopmentModuleIntro#X_Define|Define]]-Funktion aufgerufen werden, da sonst kein Senden von Daten via [[#IOWrite|IOWrite()]] möglich ist. Für den Empfang ist &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt; ohne Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Hash-Referenz der Definition, für welche ein IO-Gerät zugewiesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$proposedName&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
| Der Gerätename, welcher als IO-Gerät verwendet werden soll. Übersteuert die interne Suche nach einem passenden Gerät. Sollte nur verwendet werden, wenn bei mehreren IO-Geräten die Kommunikation nur bspw. über das empfangene IO-Gerät durchgeführt werden kann.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dispatch ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$found = Dispatch($hash, $message);&lt;br /&gt;
$found = Dispatch($hash, $message, $additional_values, $no_unknown);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() versucht die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;, welche die Definition mit dem Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; erhalten hat, an eine untergeordnete logische Definition weiterzureichen. Über diese Funktion werden Daten von einer physischen Definition an logische Definitionen verteilt. Optional können zur reinen Nachricht auch zusätzliche Daten in &amp;lt;code&amp;gt;$additional_values&amp;lt;/code&amp;gt; mitgegeben werden (z.B. Empfangspegel, Signalqualität, ...). Diese Daten werden bei der gefundenen logischen Gerätedefinition als zusätzliche Internals gesetzt. Bei gesetzem Attribut &amp;lt;code&amp;gt;addvaltrigger&amp;lt;/code&amp;gt; in der physischen Definition werden für diese Daten zusätzlich Events erzeugt (keine Readings!). Über das Flag &amp;lt;code&amp;gt;$no_unknown&amp;lt;/code&amp;gt; kann man verhindern, dass für diese Nachricht im Falle einer nicht gefundenen logischen Gerätedefinition, ein entsprechendes [[DevelopmentModuleIntro#Automatisches_Anlegen_von_logischen_Ger.C3.A4tedefinitionen_.28autocreate.29|Event]] erzeugt (und ggf. das zugehörige Modul nachgeladen) wird. &lt;br /&gt;
&lt;br /&gt;
Die Funktion prüft dabei alle Module aus der [[DevelopmentModuleIntro#Die_Client-Liste|Client-Liste]], ob diese mit der Nachricht etwas anfangen können (via Match-Regexp), führt eine optionale Duplikatserkennung via [[DevelopmentModuleIntro#X_Fingerprint|Fingerprint]]-Funktion durch und gibt den Definitionsnamen zurück, welcher die Nachricht erfolgreich via [[DevelopmentModuleIntro#X_Parse|Parse]]-Funktion verarbeiten konnte (z.B. Erzeugen von Readings, Logmeldungen, usw.). &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Hash-Referenz der Definition, welche eine Nachricht an andere Module (bzw. deren Definitionen) weiterreichen möchte.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Nachricht als Zeichenkette, welche durch ein anderes Modul verarbeitet werden soll. Hier sind nur Zeichenketten erlaubt, da die möglichen Empfängermodule über reguläre Ausdrücke die Nachricht prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$additional_values&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
| Zusätzliche Daten als Hash-Referenz, welche bei der gefundenen logischen Definition als Internals nach dem Schema &amp;lt;code&amp;gt;&amp;amp;lt;IO-Gerätname&amp;amp;gt;_&amp;amp;lt;Schlüssel&amp;amp;gt;: &amp;amp;lt;Wert&amp;amp;gt;&amp;lt;/code&amp;gt; gesetzt werden. Dies kann bspw. der Empfangspegel (RSSI) oder die Rohnachricht sein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$no_unknown&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
| Flag. Wenn gesetzt (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), wird &amp;lt;u&amp;gt;kein&amp;lt;/u&amp;gt; zugehöriges Modul basierend auf der [[DevelopmentModuleIntro#Die_Match-Liste|Match-Liste]] nachgeladen und &amp;lt;u&amp;gt;kein&amp;lt;/u&amp;gt; entsprechendes [[DevelopmentModuleIntro#Automatisches_Anlegen_von_logischen_Ger.C3.A4tedefinitionen_.28autocreate.29|Event]] erzeugt, sollte die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; nicht von bereits existierenden Definition verarbeitet werden können.  Wenn dieses Flag den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, wird ggf. das zugehörige Modul für die Nachricht basierend auf der [[DevelopmentModuleIntro#Die_Match-Liste|Match-Liste]] nachgeladen und ein entsprechendes [[DevelopmentModuleIntro#Automatisches_Anlegen_von_logischen_Ger.C3.A4tedefinitionen_.28autocreate.29|Event]] erzeugt, sollte keine passende Definition für diese Nachricht existieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$found &amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| Eine Array-Referenz, welcher die gefundene Definition zu der Nachricht enthält. Wenn keine Definition gefunden wurde, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IOWrite ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = IOWrite($hash, @arguments);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion IOWrite() übergibt die Daten &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; der logischen Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; an das ausgewählte IO-Gerät indem es die [[DevelopmentModuleIntro#X_Write|Write]]-Funktion mit den Daten &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; aufruft. In &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; ist üblicherweise eine Nachricht/Frame, sowie evtl. Zusatzdaten enthalten, welche das IO-Gerät nur noch an die verbundene Hardware übermitteln muss. Das kann ein einzelner Skalar mit der entsprechenden Nachricht sein, es können aber auch mehrere Werte übergeben werden. Die Aufrufsyntax muss dabei mit der [[DevelopmentModuleIntro#X_Write|Write]]-Funktion des entsprechenden physikalischen Moduls harmonieren. &lt;br /&gt;
&lt;br /&gt;
Damit IOWrite() funktionieren kann, muss zunächst ein IO-Gerät mittels [[#AssignIoPort|AssignIoPort()]] zugewiesen werden. Dieser Aufruf wird üblicherweise in der [[DevelopmentModuleIntro#X_Define|Define]]-Funktion oder der [[DevelopmentModuleIntro#X_Notify|Notify]]-Funktion (Trigger auf &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt;) durchgeführt. Erst nach dem Aufruf reicht IOWrite() die Daten an das entsprechende IO-Gerät weiter.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; wird nicht an die Write-Funktion übergeben. Sollte man &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; des logischen Gerätes auch im physikalischen Gerät benötigen, so kann man &amp;lt;code&amp;gt;$hash&amp;gt;&amp;lt;/code&amp;gt; mit in &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; übergeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Hash-Referenz der Definition, welche Daten an ihr IO-Gerät übertragen möchte.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die zu übertragenden Daten. Das Inhaltsschema muss dabei mit dem entgegennehmenden Modul harmonisieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| Der Rückgabewert der Write-Funktion des IO-Gerätes, welches die Daten verarbeitet hat.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
=== InternalTimer===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;InternalTimer($timestamp, $functionName, $arg);&lt;br /&gt;
InternalTimer($timestamp, $functionName, $arg, $waitIfInitNotDone);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion InternalTimer() ermöglicht das verzögerte Ausführen von einer bestimmten Funktion zu einem späteren Zeitpunkt. Die übergebene Funktion &amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt; wird dabei zum Zeitpunkt &amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt; mit dem Parameter &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Angabe eines UNIX-Timestamp, wann der Timer ausgeführt werden soll (bspw: &amp;lt;code&amp;gt;gettimeofday() + 30&amp;lt;/code&amp;gt; um in 30 Sekunden etwas zu starten)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Funktion als Zeichenkette, welche ausgeführt werden soll zum angegebenen Zeitpunkt (bspw: &amp;quot;MODULNAME_GetStatus&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Übergabeparameter welchen die genannte Funktion zum Ausführungszeitpunkt erhalten soll. Typischerweise ist das meistens $hash, kann aber auch eine Zeichenkette oder jeder weitere Datentyp sein, der mit einem Skalar übergeben werden kann (kein direktes Array/Hash).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$waitIfInitNotDone&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| &lt;br /&gt;
&#039;&#039;&#039;ACHTUNG: Dieser Parameter sollte unter keinen Umständen verwendet werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Parameter verändert das Verhalten von InternalTimer() während der Initialisierung von FHEM. Ist dieser Parameter auf 1 gesetzt und FHEM noch in der Initialisierungsphase (Konfiguration einlesen), so wird ein Sleep des Hauptprozess durchgeführt, bis der gewünschte Zeitpunkt &amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt; erreicht ist. Dadurch wird der gesamte FHEM-Prozess solange blockiert und ist in dieser Zeit nicht ansprechbar. Dieses Verhalten ist besonders relevant bei der Nutzung von InternalTimer() in der [[DevelopmentModuleIntro#X_Define|Define-Funktion]] eines Moduls und sollte daher so keinesfalls benutzt werden. Um Funktionsaufrufe zu verzögern, bis die Initialisierung beendet ist, sollte auf das Event &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; in der [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] gewartet werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== RemoveInternalTimer ===&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;RemoveInternalTimer($arg);&lt;br /&gt;
RemoveInternalTimer($arg, $functionName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion RemoveInternalTimer löscht möglicherweise noch anstehende Timer welche mit dem Übergabeparameter &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; gescheduled sind. Optional kann man zusätzlich die Suche auf eine bestimmte Funktion &amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt; weiter einschränken.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Übergabeparameter nach welchem gesucht wird. Alle Timer die mit diesem Übergabeparameter noch anstehen, werden dabei gelöscht.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Der Funktionsname der zusätzlich zu &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; gesucht werden soll.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SetExtensionsCancel ===&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;SetExtensionsCancel($hash);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion &#039;&#039;SetExtensionsCancel&#039;&#039; löscht möglicherweise noch anstehenden Timer, der durch ein &#039;&#039;on-for-timer&#039;&#039;, &#039;&#039;off-for-timer&#039;&#039;, ... über die &#039;&#039;SetExtensions&#039;&#039; angelegt wurde. Sollte in der [[DevelopmentModuleIntro#X_Set|SetFn]] aufgerufen werden, bevor der Devicezustand durch ein anderes Kommando geändert wird.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, durch die der Timer angelegt wurde.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Definitionen ==&lt;br /&gt;
&lt;br /&gt;
=== devspec2array ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
@list = devspec2array($devspec);&lt;br /&gt;
@list = devspec2array($devspec, $client_hash);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion devspec2array() gibt eine Array mit Definitionsnamen zurück die auf die übergebene Device-Specification &amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt; matchen. &lt;br /&gt;
&lt;br /&gt;
Sollte keine Definition auf die übergebene Spezifikation passen, so wird &amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt; als einziges zurückgegeben. Dieser Mechanismus ist aus historischen Gründen so gewählt um die Funktion devspec2array() transparent in Module einzufügen ohne große Änderungen im Code durchführen zu müssen. Daher ist es notwendig im Falle der Rückgabe eines einzelnen Elements dies nochmals auf Existenz in &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Die genaue Syntax einer Device-Specification ist in der {{Link2CmdRef|Anker=devspec}} erläutert. Die Funktion devspec2array() setzt diese Syntax um und gibt die gefundenen Definitions-Namen zurück.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Device-Specification zum Suchen nach Definitions-Namen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039; &lt;br /&gt;
|| Der Definitions-Hash der für den Aufruf verantwortlich ist. Dies dient zur Prüfung, ob diese Definition diesen Vorgang ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;devicename&amp;lt;/code&amp;gt;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@list&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Array mit einer Liste aller Definitions-Namen die zu der übergebenen Device-Specification passen. Sofern keine Definition auf die Spezifikation passt wird &amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt; unverändert zurückgegeben. Wenn &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; gesetzt ist und die Definition diesen Vorgang nicht ausführen darf, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== goodDeviceName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$valid = goodDeviceName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion goodDeviceName() prüft, ob der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; ein gültiger Bezeichner innerhalb von FHEM ist. Ein gültiger Definitionsname besteht aus folgenden Zeichen bzw. Zeichengruppen:&lt;br /&gt;
&lt;br /&gt;
* Normale Buchstaben ohne deutsche Sonderzeichen (A-Z, groß/klein)&lt;br /&gt;
* Zahlen (0-9)&lt;br /&gt;
* Punkt &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
* Unterstrich &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte der Definitionsname gültig sein, gibt die Funktion als Rückgabewert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein Definitionsname aus gültigen Zeichen besteht.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitionsname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$return&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Wahrheitswert, ob der übergebene Definitionsname zulässig ist.&lt;br /&gt;
Folgende Werte sind möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definitionsname enthält unzulässige Zeichen&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definitionsname besteht aus zulässigen Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== makeDeviceName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$validName = makeDeviceName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion makeDeviceName() entfernt aus dem übergebenen Definitionsnamen &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; alle ungültigen Zeichen und ersetzt diese durch einen Unterstrich &amp;quot;_&amp;quot;. Als Rückgabewert erhält man nun einen konformen Definitionsnamen in dem nur noch erlaubte Zeichen (Buchstaben, Zahlen, Punkt sowie Unterstrich) enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitionsname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$validName&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der modifizierte Name, welcher übergeben wurde, ohne ungültige Zeichen. Alle evtl. ungültigen Zeichen sind durch einen Unterstrich ersetzt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Daten abfragen/auslesen ==&lt;br /&gt;
&lt;br /&gt;
=== ReadingsVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = ReadingsVal($name, $reading, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion ReadingsVal() gibt den inhaltlichen Wert des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings welcher ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Inhalt des gewünschten Readings oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ReadingsTimestamp===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$timestamp = ReadingsTimestamp($name, $reading, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion ReadingsTimestamp() gibt den Zeitstempel des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Es handelt sich hierbei um den Zeitpunkt an dem das Reading zuletzt gesetzt/aktualisiert wurde. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Zeitstempel für das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings für welches der Zeitstempel ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeitstempel des gewünschten Readings in lokaler Zeitzone im Format&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ReadingsAge===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$seconds = ReadingsAge($name, $reading, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion ReadingsAge() gibt die Dauer in Sekunden seit der letzten Aktualisierung des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Es handelt sich hierbei um den Zeitpunkt an dem das Reading zuletzt gesetzt/aktualisiert wurde. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem die Dauer der letzten Aktualisierung für das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings für welches die Dauer der letzten Aktualisierung ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rückgabewert ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$seconds&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Sekunden als Ganzzahl, welche seit der letzten Aktualisierung vergangen sind&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ReadingsNum ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = ReadingsNum($name, $reading, $default, $round);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;ReadingsNum&amp;lt;/code&amp;gt; extrahiert den numerischen Teil des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; und gibt diesen zurück, wenn er existiert. Dabei werden Zeichenketten wie z.B. Einheiten eliminiert und nur die eigentliche Zahl (Ganzzahl- oder Fließkommazahl) zurückgegeben. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben. Sollte das gewünschte Reading existieren, jedoch keinen numerischen Wert enthalten, wird ebenfalls &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben. Es ist möglich, den Rückgabewert durch Angabe von &amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt; Stellen zu runden. Verwendet wird hierzu die FHEM-eigene Funktion &amp;lt;code&amp;gt;[https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/99_Utils.pm#L239 round]&amp;lt;/code&amp;gt;; überzählige Stellen werden mit 0 aufgefüllt - round ist daher kein round im strikt mathematischen Sinne, sondern bietet zusätzlich eine Formatierung.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123.45 °C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert));&lt;br /&gt;
# = 123.45&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(baz), q(Kein Wert));&lt;br /&gt;
# = &amp;quot;Kein Wert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 0);&lt;br /&gt;
# = 123&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 1);&lt;br /&gt;
# = 123.5&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 5);&lt;br /&gt;
# = 123.45000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123 °C&amp;quot;&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 5);&lt;br /&gt;
# = 123.00000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem ein Wert für das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings aus dem ein numerischer Wert ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert, bzw. keinen numerischen Wert enthält.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|Der ermittelte Wert, ob Standard oder aus einem Reading, wird auf &#039;&#039;$round&#039;&#039; Anzahl Stellen gerundet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rückgabewert ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Wert des gewünschten Readings oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert oder kein numerischer Teil ermittelt werden konnte.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Fallstricke ====&lt;br /&gt;
Der Rückgabewert muss nicht unbedingt ein numerischer Wert sein, wenn als &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; kein numerischer Wert oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wurde. Vergleiche mit numerischen Operatoren werden dann ggf. ein Warning erzeugen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123.45 °C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Lese aus dem Reading baz, nicht bar, wird fehlschlagen&lt;br /&gt;
if ( ReadingsNum(q(foo), q(baz), q(Kein Wert), 0) == 123.5 ) {&lt;br /&gt;
    say q(Wert ist 123.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Argument &amp;quot;Kein Wert&amp;quot; isn&#039;t numeric in numeric eq (==)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt; wird direkt, d.h. ohne Validierung, in den [https://perldoc.perl.org/functions/sprintf format string] in &amp;lt;code&amp;gt;[https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/99_Utils.pm#L239 round]&amp;lt;/code&amp;gt; übernommen und ausgewertet.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123.45 °C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), q{%%p});&lt;br /&gt;
# Evaluiert %p zu einer Speicheradresse, z.B. 7fa1fb03d738f&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), q(foo));&lt;br /&gt;
# = 123oof&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AttrVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = AttrVal($name, $attribute, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion AttrVal() gibt den aktuell konfigurierten Inhalt des Attribut &amp;lt;code&amp;gt;$attribute&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte das gewünschte Attribut nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem das gewünschte Attribut ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$attribute&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Attributs, dessen Wert ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Attribut nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Inhalt des gewünschten Attributs oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== InternalVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = InternalVal($name, $internal, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion InternalVal() gibt den aktuellen Inhalt eines Internals &amp;lt;code&amp;gt;$internal&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte das gewünschte Internal nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem das gewünschte Internal ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$internal&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Internals, dessen Wert ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Internal nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Inhalt des gewünschten Internal oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Value===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = Value($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Value() gibt den aktuellen Status von Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte die gewünschte Definition nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Status ausgelesen werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Status der gewünschten Definition&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OldValue===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = OldValue($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion OldValue() gibt den Status der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück BEVOR der aktuelle Status aufgrund eines Events gesetzt wurde. Sollte die gewünschte Definition nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Status ausgelesen werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || vorheriger Status der gewünschten Definition&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OldTimestamp===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$timestamp = OldTimestamp($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion OldTimestamp() gibt den Zeitpunkt der letzten Statusänderung der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; als Zeichenkette zurück. Sollte die gewünschte Definition nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Status ausgelesen werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeitstempel in lokaler Zeitzone im Format&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attribute in anderen Definitionen bereitstellen ==&lt;br /&gt;
&lt;br /&gt;
=== addToAttrList===&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
addToAttrList($attrib);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion addToAttrList() fügt das Attribut mit dem Namen &amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt; zu dem Attribut &amp;lt;code&amp;gt;userattr&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; hinzu. Damit kann dieses Attribut in allen systemweiten Definitionen verwendet und gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Attributs, welches für alle Definitionen verfügbar gemacht werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== addToDevAttrList ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
addToDevAttrList($name, $attrib);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion addToDevAttrList() fügt das Attribut mit dem Namen &amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt; zu dem Attribut &amp;lt;code&amp;gt;userattr&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; hinzu. Damit kann dieses Attribut in der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; verwendet und gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Definition, für welche das Attribut verfügbar gemacht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Attributs, welches für die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; verfügbar gemacht werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Daten dauerhaft schreiben/lesen ==&lt;br /&gt;
&lt;br /&gt;
=== FileRead ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
($error, @content) = FileRead($filename);&lt;br /&gt;
($error, @content) = FileRead($param);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion FileRead() liest den Inhalt der Datei &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; ein und gibt diesen als ein zeilenweises Array zurück. In Verwendung mit configDB wird die Datei standardmäßig aus der Datenbank gelesen. Um im Falle von configDB dennoch auf das Dateisystem zugreifen zu können muss als Übergabeparameter ein Hash &amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt; gesetzt werden in dem ein spezieller Wert den Zugriff auf das Dateisystem forciert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Dateisystempfad der Datei die eingelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Um im Falle der Nutzung von configDB den Zugriff auf das lokale Dateisystem zu erzwingen muss ein Parameter-Hash wie folgt übergeben werden:&lt;br /&gt;
&amp;lt;code&amp;gt;{ FileName =&amp;gt; $filename, ForceType =&amp;gt; &amp;quot;file&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; enthält dabei den lokalen Dateisystempfad zu der gewünschten Datei.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Lesen der Datei ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Lesevorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@content&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Inhalt der gewünschten Datei als zeilenweises Array. Im Falle eines Fehlers beim Lesen trägt dieses Array den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FileDelete ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$error = FileDelete($filename);&lt;br /&gt;
$error = FileDelete($param);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion FileDelete() löscht die Datei &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;. In Verwendung mit configDB wird die Datei standardmäßig aus der Datenbank gelöscht. Um im Falle von configDB dennoch auf das Dateisystem zugreifen zu können muss als Übergabeparameter ein Hash &amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt; gesetzt werden in dem ein spezieller Wert das Löschen der Datei im Dateisystem forciert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Dateisystempfad der Datei die gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Um im Falle der Nutzung von configDB den Zugriff auf das lokale Dateisystem zu erzwingen muss ein Parameter-Hash wie folgt übergeben werden:&lt;br /&gt;
&amp;lt;code&amp;gt;{ FileName =&amp;gt; $filename, ForceType =&amp;gt; &amp;quot;file&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; enthält dabei den lokalen Dateisystempfad zu der gewünschten Datei.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Löschen der Datei ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Löschvorgang erfolgreich, enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FileWrite ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$error = FileWrite($filename, @content);&lt;br /&gt;
$error = FileWrite($param, @content);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion FileWrite() schreibt den übergebenen Inhalt &amp;lt;code&amp;gt;@content&amp;lt;/code&amp;gt; in die Datei &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;. In Verwendung mit configDB wird die Datei standardmäßig in die Datenbank geschrieben. Um im Falle von configDB dennoch auf das Dateisystem zugreifen zu können muss als Übergabeparameter ein Hash &amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt; gesetzt werden in dem ein spezieller Wert den Zugriff auf das Dateisystem forciert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Dateisystempfad der Datei in welche der Inhalt geschrieben werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Um im Falle der Nutzung von configDB den Zugriff auf das lokale Dateisystem zu erzwingen muss ein Parameter-Hash wie folgt übergeben werden:&lt;br /&gt;
&amp;lt;code&amp;gt;{ FileName =&amp;gt; $filename, ForceType =&amp;gt; &amp;quot;file&amp;quot;, NoNL =&amp;gt; 0 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; enthält dabei den lokalen Dateisystempfad der zu schreibenden Datei. Optional kann man den Wert &amp;lt;code&amp;gt;NoNL&amp;lt;/code&amp;gt; auf 1 setzen um kein Newline (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) als Trennzeichen zwischen den einzelnen Zeilen zu erzeugen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@content&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die zu schreibenden Daten als ein Array von Zeilen (ohne Newline am Ende jeder Zeile).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Schreiben der Datei ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Schreibvorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== setKeyValue ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$error = setKeyValue($key, $value)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion setKeyValue() speichert die Daten &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; unter dem Schlüssel &amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt; ab. Die Daten werden in einer Datei auf dem Dateisystem (oder configDB) gespeichert und sind somit persistent auch nach einem Neustart von FHEM verfügbar. Die Daten welche in &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; enthalten sind, dürfen dabei keine Zeilenumbrüche enthalten. Sollten Daten mit Zeilenumbrüchen auf diese Weise gespeichert werden, so müssen Zeilenumbrüche durch entsprechende Mechanismen (z.B. Base64 oder das Ersetzen durch alternative Trennzeichen) eliminiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Daten werden im Klartext in einer Datei auf dem Dateisystem abgelegt! Sensible Daten die mit setKeyValue gespeichert werden (z.B. Passwörter, Zugangsdaten, etc.) sollten durch entsprechende Mechanismen (z.B. Verschlüsselung) unleserlich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der eindeutige Schlüssel als Zeichenkette unter dem die Daten abgespeichert werden soll (bspw. Definitions-Namen). Der Schlüssel darf dabei keine Zeilenumbrüche enthalten.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Die zu speichernden Daten als Zeichenkette ohne Zeilenumbruch. Die Daten dürfen dabei keine Zeilenumbrüche enthalten.&lt;br /&gt;
&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, werden zuvor gespeicherte Daten gelöscht.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Schreiben der Daten ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Schreibvorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== getKeyValue ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;($error, $value) = getKeyValue($key)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion getKeyValue() gibt Daten, welche zuvor per &amp;lt;code&amp;gt;setKeyValue()&amp;lt;/code&amp;gt; gespeichert wurden, zurück.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der eindeutige Schlüssel als Zeichenkette unter dem die Daten gespeichert wurden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Lesen der Daten ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Lesevorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Daten, welche unter dem gegebenen Schlüssel &amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt; hinterlegt sind. Wenn keine Daten zu dem Schlüssel existieren, besitzt &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
=== Log ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log($verbose, $message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Log() schreibt die Meldung &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; in das FHEM-Logfile, sofern &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; kleiner gleich dem globalen Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; ist. Wenn &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; größer ist als das globale Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;, wird die Meldung nicht geloggt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Verbose-Level unter dem die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; geloggt werden soll. &lt;br /&gt;
&lt;br /&gt;
Ganzzahl zwischen 0 und 5&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Log-Meldung als Zeichenkette, welche in das FHEM-Logfile geloggt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Log3 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log3($name, $verbose, $message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Log3() schreibt die Meldung &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; in das FHEM-Logfile, sofern &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; kleiner gleich dem Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; ist. Wenn das Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; in der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; nicht gesetzt ist, wird gegen das globale Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; geprüft.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion ist primär für die Log-Ausgabe in Modulen gedacht um so dem User die Möglichkeit zu geben nur für bestimmte Definitionen den Verbose-Level zu erhöhen ohne den globalen Verbose-Level zu erhöhen.&lt;br /&gt;
 &lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Name der Definition wogegen geprüft werden soll. Wenn &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; in FHEM nicht existiert, oder den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, wird der Parameter &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; gegen das globale Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; geprüft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Verbose-Level unter dem die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; geloggt werden soll. &lt;br /&gt;
&lt;br /&gt;
Ganzzahl zwischen 0 und 5&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Log-Meldung als Zeichenkette, welche in das FHEM-Logfile geloggt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Debug ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Debug($message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Debug() schreibt die Meldung &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; mit dem Präfix &amp;lt;code&amp;gt;DEBUG&amp;gt;&amp;lt;/code&amp;gt; in das FHEM-Logfile. Diese Funktion ist zum temporären Debuggen gedacht und sollte nicht fest in einem Modul verwendet werden. Sie entspricht dem Aufruf:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 Log(1, &amp;quot;DEBUG&amp;gt;&amp;quot;.$message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Debug-Meldung als Zeichenkette, welche in das FHEM-Logfile geloggt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Status-Abfragen ==&lt;br /&gt;
=== IsDevice ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsDevice($name);&lt;br /&gt;
$status = IsDevice($name, $type);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsDevice() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; existiert. Optional kann man prüfen, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; dem Modultyp &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt; entspricht. &lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition existiert, bzw. einem bestimmten Modultyp entspricht.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher auf Vorhandensein geprüft werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Ein regulärer Ausdruck der gegen den Modulnamen (&amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt;) der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; geprüft werden soll. Dieser Ausdruck muss auf den gesamten Modulnamen passen, da der Ausdruck mit &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; umschlossen wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Das Ergebnis, ob eine solche Definition existiert:&lt;br /&gt;
&lt;br /&gt;
0 - Definition existiert nicht&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition existiert&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn nur &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; übergeben ist, wird nur geprüft ob eine Definition mit diesem Namen existiert. Wenn zusätzlich &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt; parametrisiert wurde, muss eine Definition mit dem Namen &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; existieren &#039;&#039;&#039;UND&#039;&#039;&#039; dem Modultypen &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt; entsprechen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsDisabled ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsDisabled($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsDisabled() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; aktuell deaktiviert  (Attribute: disabled/disabledForIntervals) oder durch den Nutzer inaktiv geschaltet wurde (STATE: &amp;lt;code&amp;gt;inactive&amp;lt;/code&amp;gt;). Je nachdem ob die Definition deaktiviert/inaktiv ist, gibt sie einen entsprechenden Wert größer &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zurück. Wenn die Definition aktiv ist, gibt die Funktion den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition aktiv/inaktiv ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition ist durch das Attribut &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; deaktiviert&amp;lt;br&amp;gt;&lt;br /&gt;
2 - Definition ist durch das Attribut &amp;lt;code&amp;gt;disabledForIntervals&amp;lt;/code&amp;gt; deaktiviert&amp;lt;br&amp;gt;&lt;br /&gt;
3 - Definition ist durch den User inaktiv geschaltet. Dies bedeutet &amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt; oder das Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; der Definition besitzt den Wert &amp;lt;code&amp;gt;inactive&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsDummy ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsDummy($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsDummy() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; in den Dummy-Modus versetzt wurde (Attribut: &amp;lt;code&amp;gt;dummy&amp;lt;/code&amp;gt;). Wenn die Definition in den Dummy-Modus gesetzt ist, gibt IsDummy() den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition im Dummy-Modus ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition ist im Dummy-Modus&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsIgnored ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsIgnored($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsIgnored() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; durch den User ignoriert wird (Attribut: &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt;). Wenn die Definition durch den User ignoriert wird, gibt IsIgnored() den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition ignoriert wird.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition wird ignoriert&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsIoDummy ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsIoDummy($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsIoDummy() prüft, ob das zugeordnete IO-Device der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; in den Dummy-Modus versetzt wurde (Attribut: &amp;lt;code&amp;gt;dummy&amp;lt;/code&amp;gt;). Wenn das IO-Device in den Dummy-Modus gesetzt ist, gibt IsIoDummy() den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein IO-Device einer Definition im Dummy-Modus ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name, dessen IO-Device geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status des IO-Devices der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - IO-Device der Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - IO-Device der Definition ist im Dummy-Modus&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
&lt;br /&gt;
=== Authenticate ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$result = Authenticate($client, $argument);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== Authorized ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$result = Authorized($client_hash, $type, $arg);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion Authorized() prüft, ob ein Client mit dem Client-Hash &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; die Aktion &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; ausführen darf bzw. dazu berechtigt ist. Dazu werden sämtliche Definitionen in FHEM befragt, deren Module die Modulfunktion [[DevelopmentModuleIntro#X_Authorize|X_Authorize()]] bereitstellen. Die beiden Argumente &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; werden dabei 1:1 an die [[DevelopmentModuleIntro#X_Authorize|Authorize]]-Funktion der jeweiligen Module übergeben. &lt;br /&gt;
&lt;br /&gt;
Nachdem alle Definitionen zu dem jeweiligen Vorgang befragt wurden, gibt die Funktion zurück, ob der Client dazu authorisiert ist. Sobald eine Definition den Vorgang explizit verbietet, wird sofort der Rückgabewert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zurückgegeben. Wenn eine Definition den Vorgang explizit erlaubt, wird sofort der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurückgegeben. In beiden Fällen werden weitere Definitionen nicht mehr befragt. Sollte keine Definition den Vorgang explizit erlauben/verbieten oder keine Definition zum Prüfen vorhanden sein, wird die Aktion generell erlaubt durch die Rückgabe von &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Sollte ebenfalls keine Bewertung möglich sein aufgrund eines fehlenden oder unvollständigen Client-Hash, wird der Vorgang generell erlaubt.&lt;br /&gt;
&lt;br /&gt;
Innerhalb von FHEM werden zwei Vorgangstypen bereits verwendet um die Befehlsausführung und Sichtbarkeit von Definitionen in FHEM einzuschränken. Das Modul [[allowed]] stellt dabei die entsprechende Modulfunktion [[DevelopmentModuleIntro#X_Authorize|X_Authorize()]] bereit.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Authorized() ist daher nur notwendig, wenn man weiterführende Beschränkungen für einzelne Clients in Modulen/Definitionen realisieren möchte, die über die bestehenden Möglichkeiten hinausgehen. Dazu muss natürlich ein entsprechendes Gegenstück in Form eines weiteren Moduls zur Verfügung stehen, welche diese neuen Vorgangstypen entsprechend bewerten kann. &lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein Client zu einem bestimmten Vorgang authorisiert ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Client-Hash, welcher einen Vorgang durchführen möchte.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Vorgangstyp als Zeichenkette, um welchen es geht. Innerhalb von fhem.pl werden aktuell zwei Typen unterschieden:&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; - Befehlsausführung (sowohl FHEM-Befehle als auch Shell-/Perl-Aufrufe)&lt;br /&gt;
* &amp;lt;code&amp;gt;devicename&amp;lt;/code&amp;gt; - Sichtbarkeit von Definitionen innerhalb von FHEM&lt;br /&gt;
&lt;br /&gt;
Generell können hier weitere Typ/Argument-Kombinationen verwendet werden, solange es ein korrespondierendes Modul mit [[DevelopmentModuleIntro#X_Authorize|Authorize]]-Funktion gibt, welches diese Vorgänge verarbeiten kann.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Ein zusätzliches Argument um den jeweiligen Vorgangstyp genauer zu beschreiben. Eine Beschreibung der Bedeutung von &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; in Verbindung mit den bereits vorhandenen Vorgangstypen (&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;devicename&amp;lt;/code&amp;gt;) gibt es in der Beschreibung von &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; zur Modulfunktion [[DevelopmentModuleIntro#X_Authorize|X_Authorize()]]&lt;br /&gt;
&lt;br /&gt;
Generell können hier weitere Typ/Argument-Kombinationen verwendet werden, solange es ein korrespondierendes Modul mit [[DevelopmentModuleIntro#X_Authorize|Authorize]]-Funktion gibt, welches diese Vorgänge verarbeiten kann.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$result&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Ergebnis, ob der zu prüfende Vorgang authorisiert ist.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Vorgang ist NICHT authorisiert und darf nicht ausgeführt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - Vorgang ist authorisiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modulfunktionen ausführen == &lt;br /&gt;
&lt;br /&gt;
=== CallFn ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = CallFn($name, $function_name, @args);&lt;br /&gt;
@ret = CallFn($name, $function_name, @args);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion CallFn() ruft von der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; die im Modul registrierte Funktion &amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt; mit den Argumenten &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; auf und gibt das Ergebnis dieses Funktionsaufrufs zurück. Dazu wird die Funktion im entsprechenden Modul-Hash des zugrunde liegenden Moduls von &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; gesucht. Entsprechende Funktionen werden im Rahmen der [[DevelopmentModuleIntro#X_Initialize|Initialize]]-Funktion beim Laden eines Moduls registriert. &lt;br /&gt;
&lt;br /&gt;
Bei einem erfolgreichen Aufruf gibt CallFn() den/die Rückgabewert/-e der Modulfunktion zurück. Sollte das zugrunde liegende Modul die entsprechende Funktion nicht bereitstellen, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Definition, für den ein Aufruf einer Modulfunktion durchgeführt werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Funktion als Zeichenkette, welche aufgerufen werden soll. Dieser Wert entspricht dem Schlüsselwort mit dem die entsprechende Funktion im Rahmen von [[DevelopmentModuleIntro#X_Initialize|X_Initialize()]] im Modul-Hash registriert wurde.&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;SetFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DbLog_splitFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;CopyFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Eines oder mehrere Argumente, welche beim Aufruf der Modulfunktion entsprechend mitgegeben werden sollen. Die Argumente sind hier je nach Modulfunktion unterschiedlich. Die Aufrufsyntax und deren Reihenfolge muss in Modulen, welche die entsprechende Modulfunktion unterstützen in gleicher Art und Weise implementiert werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039; / &#039;&#039;&#039;&amp;lt;code&amp;gt;@ret&amp;lt;/code&amp;gt;&#039;&#039;&#039;  || Der Rückgabewert der Modulfunktion als Skalar oder Array (je nach Kontext).&lt;br /&gt;
&lt;br /&gt;
Sollte die gewünschte Funktion im zugrunde liegenden Modul nicht existieren, wird nur &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CallInstanceFn ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = CallInstanceFn($name, $function_name, @args);&lt;br /&gt;
@ret = CallInstanceFn($name, $function_name, @args);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion CallInstanceFn() ist eine Erweiterung zu [[#CallFn|CallFn()]]. Die auszuführende Funktion &amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt; wird dabei zuerst in dem Definitions-Hash von &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; gesucht. Der Funktionsname muss dabei direkt in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; definiert sein (ähnlich wie beim Modul-Hash im Rahmen von [[DevelopmentModuleIntro#X_Initialize|X_Initialize()]]). Der Funktionsname kann in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; dabei optional mit einem Punkt als Präfix vorangestellt sein um eine Anzeige in FHEMWEB zu unterbinden. Sollte die Funktion &amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt; innerhalb des Definitions-Hash von &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; nicht existieren, wird [[#CallFn|CallFn()]] mit den gleichen Parametern aufgerufen um die Funktion im zugrunde liegenden Modul aufzurufen, sofern diese ebenfalls existiert.&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man eine registrierte Modulfunktion definitionsbezogen in Einzelfällen übersteuern durch bspw. äquivalente Modulfunktionen aus Hilfsmodulen.&lt;br /&gt;
&lt;br /&gt;
Bei einem erfolgreichen Aufruf gibt CallInstanceFn() den/die Rückgabewert/-e der Modulfunktion zurück. Sollte sowohl die Definition, als auch das zugrunde liegende Modul die entsprechende Modulfunktion nicht bereitstellen, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Definition, für den ein Aufruf einer Modul-Funktion durchgeführt werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Funktion als Zeichenkette, welche aufgerufen werden soll. Dieser Wert entspricht dem Schlüsselwort mit dem die entsprechende Funktion in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; und, im Rahmen von [[DevelopmentModuleIntro#X_Initialize|X_Initialize()]], im Modul-Hash registriert wurde.&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DbLog_splitFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Eines oder mehrere Argumente, welche beim Aufruf der Modulfunktion entsprechend mitgegeben werden sollen. Die Argumente sind hier je nach Modulfunktion unterschiedlich. Die Aufrufsyntax und deren Reihenfolge muss in Modulen, welche die entsprechende Modulfunktion unterstützen in gleicher Art und Weise implementiert werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039; / &#039;&#039;&#039;&amp;lt;code&amp;gt;@ret&amp;lt;/code&amp;gt;&#039;&#039;&#039;  || Der Rückgabewert der Modulfunktion als Skalar oder Array (je nach Kontext).&lt;br /&gt;
&lt;br /&gt;
Sollte die gewünschte Funktion in der Definition, als auch im zugrunde liegenden Modul nicht existieren, wird nur &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
&lt;br /&gt;
=== configDBUsed ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = configDBUsed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion configDBUsed() prüft, ob in der aktuellen FHEM-Umgebung configDB verwendet wird und gibt in diesem Fall den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück. Die Funktion besitzt keinerlei Übergabeparameter.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob configDB verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Folgende Werte sind möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0 - configDB wird nicht verwendet&amp;lt;br&amp;gt;&lt;br /&gt;
1 - configDB wird  verwendet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== computeClientArray ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; compute the list of defined logical modules for a physical module&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$clientArray = computeClientArray($definitionHash, $moduleName);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wenn im übergebenen $definitionHash der Wert {ClientsKeepOrder}=1 gesetzt ist, dann wird der ClientArray in der Reihenfolge und mit den Namen aufgebaut, wie diese im phyischen Modul hinterlegt sind.&lt;br /&gt;
&lt;br /&gt;
Der Wert {ClientsKeepOrder}=0 bewirkt, dass eine Sortierung gemäß der Modulreihenfolge vorgenommen wird und dass Module auch über die Angabe einer Regex ausgewählt werden können.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$definitionHash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Die Hash-Referenz der Gerätedefinition, welche an diese Funktion übergeben wird&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$moduleName&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Die Angabe eines Modulnamnes, aus welchem der Wert {Clients} verwendet wird, sollte dieser Wert in der Gerätedefinition nicht hinterlegt sein&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$clientArray&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Liefert auf Basis des übergebenen hashes einer Moduldefinition und des übergebenen Modulnamens einen $clientarray zurück&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== getUniqueId ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$uniqueID = getUniqueId();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion getUniqueId() gibt einen eindeutige Identifikations-String der lokalen FHEM-Installation zurück. Dieser String wird einmalig per Zufallsalgorithmus erzeugt und anschließend lokal abgespeichert. Jede FHEM-Installation besitzt einen anderen Identifikations-String. Dieser Wert wird bspw. für die Online-Statistik verwendet um die einzelnen Installation zu anonymisieren.&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$uniqueID&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Eine Zeichenkette in Hexadezimaldarstellung welche pro Installation eindeutig ist.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== toJSON ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$jsonString = toJSON($value);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion toJSON() konvertiert eine komplexe Datenstruktur, welche aus Array, Hashes oder Skalaren bestehen kann, in einen JSON-konformen String. Als Argument &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; kann man daher eine Array-Referenz, eine Hash-Referenz oder einen einfachen, skalaren Wert übergeben. Als Rückgabewert wird ein JSON-konformer String zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Eine Array-Referenz, eine Hash-Referenz oder ein einfacher, skalarer Wert, welcher in JSON zurückgeben werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$jsonString &amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der JSON-String, welcher das Objekt samt Inhalt darstellt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CancelDelayedShutdown ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
CancelDelayedShutdown($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion CancelDelayedShutdown() ist nur im Zusammenhang mit einer im Modul implementierten [[DevelopmentModuleIntro#X_DelayedShutdown|DelayedShutdown]]-Funktion notwendig. Sofern über die DelayedShutdown-Funktion ein verzögertes Herunterfahren von FHEM signalisiert wird, dient CancelDelayedShutdown() dazu FHEM zu signalisieren, dass alle notwendigen Schritte vor dem Herunterfahren für die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; abgeschlossen sind und FHEM sich nun beenden kann.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitionsname, für den die Shutdown-Verzögerung abgebrochen werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=37099</id>
		<title>DevelopmentModuleAPI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=37099"/>
		<updated>2022-01-12T21:22:28Z</updated>

		<summary type="html">&lt;p&gt;Sidey: computeClientArray und Einflussnahme in Dokumentation aufgenommen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Randnotiz|RNTyp=r|RNText=Bitte beachten: Diese Auflistung von Funktionen wird nicht aktiv durch alle Entwickler gepflegt. Es kann daher keine Garantie auf Vollständigkeit und Korrektheit gegeben werden. Letztendlich entscheidend ist immer der Perl-Code, Unstimmigkeiten sollten im [https://forum.fhem.de/index.php/board,80.0.html FHEM-Forum] angemerkt werden!&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
Please note: This list of functions is not officially maintained by all developers. So there is no guarantee for completeness and correctness. In the end it is always the Perl code itself that is relevant; please report errors and omissions in the [https://forum.fhem.de/index.php/board,80.0.html FHEM forum]!&lt;br /&gt;
}}&lt;br /&gt;
Diese Seite soll eine Beschreibung der für Moduleentwickler verfügbaren Funktionen enthalten, um für Modulentwickler &lt;br /&gt;
* Wiederverwendbare Routinen leichter identifizieren zu können&lt;br /&gt;
* Durch Wiederverwendung mehr Einheitlichkeit zu erzeugen&lt;br /&gt;
* Aufwand zu verringern&lt;br /&gt;
* Bei Änderungen auch betroffene Module leichter identifizieren zu können&lt;br /&gt;
&lt;br /&gt;
Natürlich hat diese Seite keinen Anspruch auf Vollständigkeit und jeder ist aufgefordert mitzuarbeiten, sobald er beim Stöbern über eine Funktion stolpert, die auch andere interessieren könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FHEM-Befehlsausführung ==&lt;br /&gt;
&lt;br /&gt;
=== AnalyzeCommand ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$error = AnalyzeCommand($client_hash, $cmd);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AnalyzeCommand() ermöglicht das Parsen und die Ausführung eines einzelnen FHEM-Befehls.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Definition-Hash, welcher für die Ausführung dieses Kommandos verantwortlich ist. Dies dient zur Prüfung, ob diese Definition das Kommando &amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;). Der Definition-Hash muss in &amp;lt;code&amp;gt;SNAME&amp;lt;/code&amp;gt; den zum Attribut &amp;lt;code&amp;gt;validFor&amp;lt;/code&amp;gt; (im zugehörigen allowed-Device) passenden Devicenamen tragen, damit die Prüfung durchgeführt wird. Wenn anstatt eines Definitions-Hashes der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wird, erfolgt keine Prüfung.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Ein einzelnes Kommando, welches ausgeführt werden soll (ACHTUNG: keine Kommando-Ketten!!!).&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;define dummy1 dummy&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;{Log3(undef, 1, &amp;quot;Hallo&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehlermeldungen, die beim Ausführen des Kommandos aufgetreten sind. Wenn keine Fehlermeldungen aufgetreten sind, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AnalyzeCommandChain ===&lt;br /&gt;
AnalyzeCommandChain() ermöglicht die Ausführung von FHEM-Befehlsketten. Dabei werden mehrere FHEM-Kommandos durch ein Semikolon getrennt und nacheinander mittels AnalyzeCommand() ausgeführt.&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$errors = AnalyzeCommandChain ($client_hash, $cmds)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Definition-Hash, welcher für die Ausführung dieser Kommandos verantwortlich ist. Dies dient zur Prüfung, ob diese Definition die Kommandos &amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt; ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;).Der Definition-Hash muss in &amp;lt;code&amp;gt;SNAME&amp;lt;/code&amp;gt; den zum Attribut &amp;lt;code&amp;gt;validFor&amp;lt;/code&amp;gt; (im zugehörigen allowed-Device) passenden Devicenamen tragen, damit die Prüfung durchgeführt wird. Wenn anstatt eines Definitions-Hashes der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wird, erfolgt keine Prüfung.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Kommandokette, welche ausgeführt werden soll, durch &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; getrennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;define dummy1 dummy; list dummy1; {Log(3,&amp;quot;dummy created&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$errors&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehlermeldungen, die beim ausführen der Kommandos aufgetreten sind. Wenn keine Fehlermeldungen aufgetreten sind, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AnalyzePerlCommand ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$errors = AnalyzePerlCommand ($client_hash, $cmds);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AnalyzePerlCommand() ermöglicht die Ausführung von Perl-Kommandos/Routinen. Sofern &amp;quot;$client_hash&amp;quot; angegeben wurde, wird die  Authorisierung geprüft (man kann mit allowed die Ausfuehrung von perl untersagen). &lt;br /&gt;
Mehrere Kommandos sind innerhalb von &amp;quot;$cmds&amp;quot; durch Semikolon zu trennen. &lt;br /&gt;
&lt;br /&gt;
Sollten Warnung bei der Ausführung der Perl-Kommandos auftreten, werden sie im FHEM-Logfile mit verbose-Level &amp;quot;1&amp;quot; ausgegeben.&lt;br /&gt;
&lt;br /&gt;
Sind [[#EvalSpecials|EvalSpecials()]] definiert, können diese Definitionen innerhalb des übergebenen Perl-Codes verwendet werden.&lt;br /&gt;
Ebenfalls werden die Variablen $we (siehe holiday2we), $sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst (siehe Perl localtime) sowie $hms (Zeit im sprintf-Format &amp;quot;hh:mm:ss&amp;quot;) generiert und können somit im auszuführenden Code verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Definition-Hash, welcher für die Ausführung dieser Kommandos verantwortlich ist. Dies dient zur Prüfung, ob diese Definition die Kommandos &amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt; ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;).Der Definition-Hash muss in &amp;lt;code&amp;gt;SNAME&amp;lt;/code&amp;gt; den zum Attribut &amp;lt;code&amp;gt;validFor&amp;lt;/code&amp;gt; (im zugehörigen allowed-Device) passenden Devicenamen tragen, damit die Prüfung durchgeführt wird. Wenn anstatt eines Definitions-Hashes der Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wird, erfolgt keine Prüfung.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Perl-Kommando(s), welche ausgeführt werden sollen, durch &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; getrennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt; my $ignore; if($we) {$ignore=1} &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$errors&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehlermeldungen, die beim Ausführen der Kommandos aufgetreten sind. Wenn keine Fehlermeldungen aufgetreten sind, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== EvalSpecials ===&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$final_cmd = EvalSpecials($cmd, %specials);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
EvalSpecials() ermöglicht die Ersetzung von Platzhaltern in FHEM-Befehlen, welche durch AnalyzeCommandChain() zur Ausführung gebracht werden sollen. Dabei werden alle Schlüssel von &amp;lt;code&amp;gt;%specials&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt; gesucht und durch die entsprechenden Werte aus &amp;lt;code&amp;gt;%specials&amp;lt;/code&amp;gt; ersetzt. &lt;br /&gt;
&lt;br /&gt;
Diese Funktion hat je nach gewähltem Featurelevel (globales Attribut &amp;lt;code&amp;gt;featurelevel&amp;lt;/code&amp;gt;) unterschiedliches Verhalten um die Kompatibilität mit früheren FHEM-Versionen und deren Konfiguration zu wahren.&lt;br /&gt;
&lt;br /&gt;
In jedem Falle muss der zurückgegebene String mit AnalyzeCommandChain() zur Ausführung gebracht werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Eine gültige FHEM-Kommando-Kette welche mit etwaigen Platzhaltern versehen ist, die ersetzt werden sollen.&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;set $NAME power on; {Log(3, &amp;quot;power on $NAME for $ADDRESS&amp;quot;)}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;%specials&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Hash, welcher als Schlüssel die zu ersetzenden Platzhalter-Namen den zu ersetzenden Werten zuordnet. Jeder Schlüssel ist aus historischen Gründen mit einem Prozentzeichen zu beginnen. Die Platzhalter müssen zusammenhängend sein und dürfen nur aus Zahlen, Buchstaben und Unterstrichen (&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;) bestehen. Generell sollten die Schlüssel aber nur aus Großbuchstaben bestehen.&lt;br /&gt;
&lt;br /&gt;
Bspw: &amp;lt;code&amp;gt;(&amp;quot;%NAME&amp;quot; =&amp;gt; &amp;quot;Definition_A&amp;quot;, &amp;quot;%ADDRESS&amp;quot; =&amp;gt; &amp;quot;192.168.0.2&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$final_cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Das fertige Kommando, welches so direkt an AnalyzeCommandChain() übergeben werden muss.&lt;br /&gt;
&lt;br /&gt;
Ab Featurelevel 5.7 sind die Platzhalter in diesem String nicht ersetzt. Die Ersetzung wird in diesem Fall in AnalyzeCommandChain() vorgenommen, wo die einzelnen Platzhalter ersetzt werden. Die Funktion EvalSpecials() speichert in diesem Falle nur den Hash im Hintergrund, die eigentliche Ersetzung wird dann durch AnalyzeCommandChain() und deren untergeordneten Funktionen übernommen.&lt;br /&gt;
&lt;br /&gt;
In Featurelevel 5.6 und vorher wird ein Suchen/Ersetzen der Platzhalter in EvalSpecials() selbst vorgenommen. Hierbei ist der zurückgegebene String das finale Kommando, welches keine Platzhalter mehr beinhaltet. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== parseParams ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;my($a, $h) = parseParams($cmd);&lt;br /&gt;
my($a, $h) = parseParams($cmd, $separator, $joiner, $keyvalueseparator);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
parseParams() ermöglicht das Parsen von Kommandozeilenargumenten und lässt sich z.B. für die Parameter von define ([[DevelopmentModuleIntro#X_Define|DefineFn]]), get ([[DevelopmentModuleIntro#X_Get|GetFn]]) und set ([[DevelopmentModuleIntro#X_Set|SetFn]]) verwenden. Beim Parsen werden erkannt:&lt;br /&gt;
* einfache, durch den Separator getrennte, Zeichenfolgen&lt;br /&gt;
* benannte Parameter der Form &amp;lt;code&amp;gt;&amp;lt;name&amp;gt;=&amp;lt;wert&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Werte können in einfache (&amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;) oder doppelte (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;) Anführungszeichen eingeschlossen sein, um so den jeweiligen Separator zu enthalten&lt;br /&gt;
** Ein solches Pärchen aus gleichen Anführungszeichen an Anfang und Ende eines Wertes wird beim Parsen entfernt.&lt;br /&gt;
* in &amp;lt;code&amp;gt;{...}&amp;lt;/code&amp;gt; eingeschlossener Perlcode. Hier wird nach der ersten öffnenden bis zur zugehörigen schliessenden Klammer gesucht. D.h. bis die gleiche Anzahl öffnender und schliessender Klammern erreicht ist. &lt;br /&gt;
&lt;br /&gt;
In der Modul &amp;lt;code&amp;gt;X_Initialize&amp;lt;/code&amp;gt; Routine lässt sich mit &amp;lt;code&amp;gt;$hash-&amp;gt;{parseParams} = 1;&amp;lt;/code&amp;gt; festlegen, dass parseParams für die define, get und set Argumente automatisch aufgerufen und das Ergebnis an die DefFn, GetFn und SetFn übergeben wird.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Argumente des Kommandos als String oder als Array-Referenz. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$separator&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Der Separator, an dem die Parameterzeile in einzelne Parameter gesplittet werden soll. Dieser Parameter wird nur beachtet, wenn die Argumente als Zeichenkette übergeben werden. &lt;br /&gt;
&lt;br /&gt;
Standardwert: &#039; &#039; &#039;&#039;(Leerzeichen)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;code&amp;gt;$joiner&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;code&amp;gt;$keyvalueseparator&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|Trennzeichen, das &amp;lt;name&amp;gt;- von &amp;lt;wert&amp;gt;-Paaren trennt, Standardwert ist &#039;=&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$a&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Eine Referenz auf ein Array, das alle nicht benannten Parameter in der Reihenfolge ihres Vorkommens enthält.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$h&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Eine Referenz auf einen Hash, der die Werte aller benannten Parameter mit ihrem Namen als Key enthält. (Achtung: Ein Hash ist nicht sortiert!)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel: Die Zeile &lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;name&amp;gt; test1 test2=abc test3 &amp;quot;test4 test4&amp;quot; test5=&amp;quot;test5 test5&amp;quot; test6=&#039;test6=test6&#039; test7= test8=&amp;quot;&#039;&amp;quot; test9=&#039;&amp;quot;&#039; {my $x = &amp;quot;abc&amp;quot;} test10={ { my $abc =&amp;quot;xyz&amp;quot; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
wird in die folgenden Elemente geparst:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
# Die nicht benannten Parameter:&lt;br /&gt;
$a = [&lt;br /&gt;
          &#039;set&#039;,&lt;br /&gt;
          &#039;&amp;lt;name&amp;gt;&#039;,&lt;br /&gt;
          &#039;test1&#039;,&lt;br /&gt;
          &#039;test3&#039;,&lt;br /&gt;
          &#039;test4 test4&#039;,&lt;br /&gt;
          &#039;{my $x = &amp;quot;abc&amp;quot;}&#039;&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
# Die benannten Parameter:&lt;br /&gt;
$h = {&lt;br /&gt;
          &#039;test10&#039; =&amp;gt; &#039;{ { my $abc =&amp;quot;xyz&amp;quot; } }&#039;,&lt;br /&gt;
          &#039;test5&#039; =&amp;gt; &#039;test5 test5&#039;,&lt;br /&gt;
          &#039;test8&#039; =&amp;gt; &#039;\&#039;&#039;,&lt;br /&gt;
          &#039;test2&#039; =&amp;gt; &#039;abc&#039;,&lt;br /&gt;
          &#039;test7&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
          &#039;test9&#039; =&amp;gt; &#039;&amp;quot;&#039;,&lt;br /&gt;
          &#039;test6&#039; =&amp;gt; &#039;test6=test6&#039;&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== asyncOutput ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;asyncOutput($client_hash, $message);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion asyncOutput() kann man an einen bestimmten Client (FHEMWEB oder telnet) gezielt Daten übermitteln, die auf diesem Client angezeigt werden sollen. Damit können Kommandos via FHEMWEB oder Telnet gestartet werden und das Ergebnis zu einem späteren Zeitpunkt zurückgegeben werden. Ebenso können so Daten angefordert werden und erst zum Zeitpunkt des Eintreffens via asyncOutput() an den entsprechenden Client weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
Um diese Funktion nutzen zu können, muss das Modul, über das eine Client-Verbindung besteht, eine [[DevelopmentModuleIntro#X_AsyncOutputFn|AsyncOutputFn]] bereitstellen. Dies wird aktuell nur in [[FHEMWEB]] und telnet unterstützt. Man kann die Unterstützung für eine asynchrone Datenübermittlung vorab mittels einer if-Abfrage auf&amp;lt;code&amp;gt;$client_hash-&amp;gt;{canAsyncOutput}&amp;lt;/code&amp;gt; prüfen, da es durchaus passieren kann, dass unter bestimmten Umständen keine asynchrone Übertragung möglich ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Client-Instanz (telnet- oder FHEMWEB-Instanz), auf das die Ausgabe erfolgen soll. Dieser Client-Hash wird beim Aufruf der [[DevelopmentModuleIntro#X_Set|SetFn]] und [[DevelopmentModuleIntro#X_Get|GetFn]] unter &amp;lt;code&amp;gt;$hash-&amp;gt;{CL}&amp;lt;/code&amp;gt; bereitgestellt. &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Daten als Zeichenkette, welche ausgegeben werden sollen. &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SetExtensions ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$error = SetExtensions($hash, $usage_list, @set_args);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion SetExtensions() wird durch das Hilfsmodul SetExtensions.pm bereitgestellt und implementiert weiterführende Set-Befehle basierend auf den Grundbefehlen &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Sie wird ausschließlich im Rahmen der Modulprogrammierung in der [[DevelopmentModuleIntro#X_Set|Set]]-Funktion verwendet.&lt;br /&gt;
&lt;br /&gt;
Ein Implementierungsbeispiel gibt es im Wiki-Artikel zur [[DevelopmentModuleIntro#X_Set|Set]]-Funktion.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Die Hash-Referenz der Gerätedefinition, für die gerade die [[DevelopmentModuleIntro#X_Set|Set]]-Funktion ausgeführt wird.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$usage_list&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Die Auflistung aller möglichen Kommandos als Zeichenkette, welche innerhalb der Set-Funktion unterstützt werden. Es handelt sich hierbei nur reinweg um die Auflistung der Kommandos ohne das Präfix &amp;lt;code&amp;gt;unknown command &amp;lt;font color=&amp;quot;grey&amp;quot;&amp;gt;&#039;&#039;[...]&#039;&#039;&amp;lt;/font&amp;gt; choose one of&amp;lt;/code&amp;gt;. Diese Liste muss mind. die Befehle &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; enthalten, damit SetExtensions() zusätzliche Set-Befehle anbieten kann. Es können hierbei FHEMWEB-spezifische Widget-Optionen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;on off statusRequest&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;on:noArg off:noArg input:av1,av2,av3 volume&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@set_args&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039; &lt;br /&gt;
|| Sämtliche Argumente, welche an die Set-Funktion übergeben wurden (ausser &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;). Dieses Array entspricht einem Array aus den Parametern &amp;lt;code&amp;gt;($name, $cmd, @args)&amp;lt;/code&amp;gt; aus dem [[DevelopmentModuleIntro#X_Set|Artikel zur Set-Funktion]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Fehler- bzw. Usage-Meldung, die beim Ausführen von SetExtensions() aufgetreten ist. Diese Rückmeldung muss direkt als Rückgabewert der Set-Funktion verwendet werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[DevelopmentModuleAPI#SetExtensionsCancel|SetExtensionsCancel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Time / Timestamp ==&lt;br /&gt;
&lt;br /&gt;
=== FmtDateTimeRFC1123===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestampGMT = FmtDateTimeRFC1123($timestamp);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Gibt den übergebenen UNIX-Timestamp (Sekunden seit EPOCH-Beginn) formatiert nach RFC 1123 zurück.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Zeitangabe wie sie von der &amp;lt;code&amp;gt;time()&amp;lt;/code&amp;gt; Funktion zurückgegeben wird&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestampGMT &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel GMT (Greenwich Mean Time) wie er in RFC 1123 beschrieben wird. Diese werden zum Beispiel bei http verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Sat, 05 Mar 2016 18:17:48 GMT&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FmtDateTime===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = FmtDateTime($time);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wandelt einen UNIX-Timestamp (Sekunden seit Beginn der UNIX-Epoche: 01.01.1970 00:00:00 UTC) in eine formatierte Angabe in der lokalen Zeitzone um.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$time&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Zeitangabe wie sie von der &amp;lt;code&amp;gt;time()&amp;lt;/code&amp;gt; Funktion zurückgegeben wird.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel in lokaler Zeitzone im Format&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TimeNow ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = TimeNow();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion TimeNow() gibt die aktuelle lokale Zeit als formatierte Zeichenkette zurück. Diese Funktion hat keine Übergabeparameter.&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel der aktuellen Uhrzeit in lokaler Zeitzone im Format&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzt die Funktion &amp;lt;code&amp;gt;FmtDateTime()&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== fhemTimeGm===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = fhemTimeGm($sec, $min, $hour, $mday, $month, $year);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wandelt einen Zeitpunkt als Greenwich Mean Time (GMT) basierend auf den einzelnen Datumsangaben, wie er bspw. durch die Perl-Funktion &amp;lt;code&amp;gt;gmtime()&amp;lt;/code&amp;gt; erzeugt wird, in einen UNIX-Timestamp um.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$sec&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Sekunden-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$min&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Minuten-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hour&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Stunden-Komponente als Ganzzahl zwischen 0 und 23.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$mday&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Tag-Komponente als Ganzzahl zwischen 1 und 31.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$month&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Monats-Komponente als Ganzzahl zwischen 0 und 11. Hier erfolgt eine andere Zuordnung. Der Januar entspricht der 0, Februar der 1, usw. Der Dezember entspricht dem Wert 11.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$year&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Jahres-Komponente. Das Jahr wird dabei nicht als komplette Jahreszahl angegeben, sondern als Differenz seit dem Jahr 1900. Das Jahr 2016 entspricht demnach dem Wert 116.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel als UNIX-Timestamp (Sekunden seit EPOCH-Beginn) &amp;lt;br&amp;gt;&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== fhemTimeLocal===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = fhemTimeLocal($sec, $min, $hour, $mday, $month, $year);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wandelt einen Zeitpunkt in lokaler Zeit basierend auf den einzelnen Datumsangaben wie er bspw. durch die Perl-Funktion &amp;lt;code&amp;gt;localtime()&amp;lt;/code&amp;gt; erzeugt wird in einen UNIX-Timestamp um.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$sec&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Sekunden-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$min&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Minuten-Komponente als Ganzzahl zwischen 0 und 59.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hour&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Stunden-Komponente als Ganzzahl zwischen 0 und 23.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$mday&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Tag-Komponente als Ganzzahl zwischen 1 und 31.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$month&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Monats-Komponente als Ganzzahl zwischen 0 und 11. Hier erfolgt eine andere Zuordnung. Der Januar entspricht der 0, Februar der 1, usw. Der Dezember entspricht dem Wert 11.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$year&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Jahres-Komponente. Das Jahr wird dabei nicht als komplette Jahreszahl angegeben, sondern als Differenz seit dem Jahr 1900. Das Jahr 2016 entspricht demnach dem Wert 116.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp &amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|| Zeitstempel als UNIX-Timestamp (Sekunden seit EPOCH-Beginn) &amp;lt;br&amp;gt;&lt;br /&gt;
Bsp: &amp;lt;code&amp;gt;1457201868&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Readings / Events ==&lt;br /&gt;
&lt;br /&gt;
=== readingsBeginUpdate ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion readingsBeginUpdate() bereitet die Definition mit dem Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; auf ein Update von Readings vor. Dies betrifft insbesondere das Setzen von Umgebungsvariablen sowie dem aktuellen Zeitstempel als Änderungszeitpunkt. Der Aufruf dieser Funktion ist notwendig um eigentliche Updates mit der Funktion readingsBulkUpdate() auf der gewünschten Definition durchführen zu können. &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Hash-Referenz der Definition, wo Readings geupdatet werden sollen &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsBulkUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$rv = readingsBulkUpdate($hash, $reading, $value);&lt;br /&gt;
$rv = readingsBulkUpdate($hash, $reading, $value, $changed);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsBulkUpdate() führt ein Update eines einzelnen Readings für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; durch. Dabei wird das Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; auf den Wert &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; gesetzt. Bevor diese Funktion benutzt werden kann, muss readingsBeginUpdate() zuvor aufgerufen werden, ansonsten werden keine Updates durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo Readings geupdatet werden sollen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Wert, welchen das Reading annehmen soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$changed&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Flag, ob ein Event für dieses Update erzeugt werden soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Oder ob definitiv kein Event erzeugt werden soll (Wert: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;). Wenn nicht gesetzt, wird aufgrund entsprechender Attribute in der Definition von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; entschieden, ob ein Event zu erzeugen ist, oder nicht (Attribute: [[event-on-change-reading]], [[event-on-update-reading]], [[event-min-interval]], ...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$rv&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette bestehend aus Reading und Wert getrennt durch einen Doppelpunkt, welcher anzeigt, auf welchen Wert das Reading tatsächlich gesetzt wurde.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsBulkUpdateIfChanged ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$rv = readingsBulkUpdateIfChanged($hash, $reading, $value);&lt;br /&gt;
$rv = readingsBulkUpdateIfChanged($hash, $reading, $value, $changed);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsBulkUpdateIfChanged() führt ein Update eines einzelnen Readings für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; durch, sofern sich der neue Wert &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; gegenüber dem vorherigen Wert verändert. Dabei wird das Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; auf den Wert &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; gesetzt. Bevor diese Funktion benutzt werden kann, muss readingsBeginUpdate() zuvor aufgerufen werden, ansonsten werden keine Updates durchgeführt. Nur, sobald sich der Wert des Readings verändert, wird die Funktion readingsBulkUpdate() ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo Readings geupdatet werden sollen &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Wert, welchen das Reading annehmen soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$changed&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Flag, ob ein Event für dieses Update erzeugt werden soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Oder ob definitiv kein Event erzeugt werden soll (Wert: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;). Wenn nicht gesetzt, wird aufgrund entsprechender Attribute in der Definition von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; entschieden, ob ein Event zu erzeugen ist, oder nicht (Attribute: event-on-change-reading, event-on-update-reading, event-min-interval, ...)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$rv&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette bestehend aus Reading und Wert getrennt durch einen Doppelpunkt, welcher anzeigt, auf welchen Wert das Reading tatsächlich gesetzt wurde. Sofern der alte Wert dem neuen Wert entspricht, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsEndUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsEndUpdate($hash, $do_trigger);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsEndUpdate() beendet den Bulk-Update Prozess durch die Funktionen readingsBeginUpdate() &amp;amp; readingsBulkUpdate() und triggert optional die entsprechenden Events sämtlicher erzeugter Readings für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;. Desweiteren werden nachgelagerte Tasks wie bspw. die Erzeugung von User-Readings (Attribut: &amp;lt;code&amp;gt;userReadings&amp;lt;/code&amp;gt;), sowie die Erzeugung des STATE aufgrund des Attributs &amp;lt;code&amp;gt;stateFormat&amp;lt;/code&amp;gt; durchgeführt. Sofern &amp;lt;code&amp;gt;$do_trigger&amp;lt;/code&amp;gt; gesetzt ist, werden alle anstehenden Events nach Abschluss getriggert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo Readings geupdatet wurden.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$do_trigger&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Flag, ob entsprechende Events der einzelnen Readings getriggert werden sollen (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). Wenn dieses Flag den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, werden keine Events für alle Readings die seit dem Aufruf von readingsBeginUpdate() mittels readingsBulkUpdate() gesetzt wurden, erzeugt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsSingleUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$rv = readingsSingleUpdate($hash, $reading, $value, $do_trigger);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsSingleUpdate() führt ein einzelnes Reading-Update mithilfe der Funktionen readingsBeginUpdate(), readingsBulkUpdate() und readingsEndUpdate() durch. Es entspricht dabei einem Aufruf aller 3 Funktionen nacheinander mit den entsprechenden einzelnen Parametern in den jeweiligen Funktionen.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo das Reading geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches geupdatet werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Wert, welchen das Reading annehmen soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$do_trigger&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Flag, ob evtl. ein Event für das Reading getriggert werden soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, Event ist abhängig von den Attributen: event-on-change-reading, event-on-update-reading, event-min-interval, ...). Wenn dieses Flag den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, wird kein Event erzeugt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$rv&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette bestehend aus Reading und Wert getrennt durch einen Doppelpunkt, welcher anzeigt, auf welchen Wert das Reading tatsächlich gesetzt wurde.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== readingsDelete ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsDelete($hash, $reading);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion readingsDelete() löscht das Reading &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; aus der Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, wo das Reading gelöscht werden soll&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name des Readings, welches gelöscht werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DoTrigger ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = DoTrigger($name, $new_state);&lt;br /&gt;
$ret = DoTrigger($name, $new_state, $no_replace);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion DoTrigger() triggert alle angesammelten Events in &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; sowie zusätzlich das Event &amp;lt;code&amp;gt;$new_state&amp;lt;/code&amp;gt; für die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; und führt alle verarbeitenden Aktionen in allen Empfängern zu diesem Event aus. Wenn in &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; keine zu bearbeitenden Änderungen enthalten sind, wird lediglich &amp;lt;code&amp;gt;$new_state&amp;lt;/code&amp;gt; getriggert (sofern gesetzt).&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird implizit in der Funktion readingsEndUpdate() aufgerufen und muss daher nicht nochmal aufgerufen werden. &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Name der Definition deren Events durchgeführt werden sollen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$new_state&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Das Event welches zusätzlich zu bereits anstehenden Events aus &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; getriggert werden soll. Wenn dieser Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; ist, werden nur alle Events aus &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; bearbeitet, sofern &amp;lt;code&amp;gt;$hash-&amp;gt;{CHANGED}&amp;lt;/code&amp;gt; gefüllt ist.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$no_replace&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Optionales Flag, welches die Ersetzung von Events durch das Attribut &amp;lt;code&amp;gt;eventMap&amp;lt;/code&amp;gt; verhindert (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeichenkette welche alle Return-Werte aller aufgerufenen Notify-Funktionen beinhaltet, sofern diese einen Fehler melden. Diese Meldung wird parallel im FHEM-Logfile ausgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== deviceEvents ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$events = deviceEvents($hash, $with_state);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion deviceEvents() gibt alle anstehenden Events für die Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; als Array-Referenz zurück. Diese Funktion ist bei der Modulentwicklung primär zur Nutzung in der [[DevelopmentModuleIntro#X_Notify|NotifyFn]] vorgesehen, um die anstehenden Events zu ermitteln. &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, deren anstehende Events zurückgegeben werden sollen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$with_state&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Flag, ob das Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; mit dem Readingnamen in der zurückgegebenen Event-Liste erscheinen soll (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) oder nur der Wert ohne dem vorangestellten Readingnamen &amp;quot;&amp;lt;code&amp;gt;state: &amp;lt;/code&amp;gt;&amp;quot; (Wert: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) in der Event-Liste angezeigt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$events&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Eine Array-Referenz, welche alle anstehenden Events als Liste bereitstellt. Sofern keine Events anstehen, ist der Rückgabewert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bsp. (mit &amp;lt;code&amp;gt;$with_state = 0&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[ &lt;br /&gt;
    &amp;quot;humidity: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;T: 10.5 H: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;temperature: 10.5&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bsp. (mit &amp;lt;code&amp;gt;$with_state = 1&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
[ &lt;br /&gt;
    &amp;quot;humidity: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;state: T: 10.5 H: 84&amp;quot;,&lt;br /&gt;
    &amp;quot;temperature: 10.5&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== notifyRegexpChanged ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
notifyRegexpChanged($hash, $event_regexp);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion notifyRegexpChanged() setzt für &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; einen passenden Eintrag in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; basierend auf dem regulären Ausdruck &amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt;, welcher üblicherweise in der [[DevelopmentModuleIntro#X_Define|Define-Funktion]] als Argument übergeben wird. Dadurch wird die [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] nur für Events der entsprechenden Gerätedefinition aufgerufen. &lt;br /&gt;
&lt;br /&gt;
Je nach dem, wie &amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt; formuliert ist, setzt notifyRegexpChanged() einen Eintrag in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt;. Es kann durchaus vorkommen, dass kein Eintrag in NOTIFYDEV gesetzt wird, da nicht zweifelsfrei zwischen Definitionsnamen und Event unterschieden werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diese Funktion kann nur verwendet werden, wenn &#039;&#039;&#039;&amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt;&#039;&#039;&#039; auf &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;amp;lt;Definitionsnamen&amp;amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; bzw. &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;amp;lt;Definitionsnamen&amp;amp;gt;:&amp;amp;lt;Event&amp;amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039; matcht (Event Regexp-Syntax aus [[notify]]).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Hash-Referenz der Definition, für welche eine neue Event-Regexp gesetzt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$event_regexp&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Regexp, welche für &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; gesetzt wurde (i.d.R via [[DevelopmentModuleIntro#X_Define|Define-Funktion]])&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== goodReadingName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$valid = goodReadingName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion goodReadingName() prüft, ob der Readingname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; ein gültiger Bezeichner innerhalb von FHEM ist. Ein gültiger Readingname besteht aus folgenden Zeichen bzw. Zeichengruppen:&lt;br /&gt;
&lt;br /&gt;
* Normale Buchstaben ohne deutsche Sonderzeichen (A-Z, groß/klein)&lt;br /&gt;
* Zahlen (0-9)&lt;br /&gt;
* Punkt &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
* Unterstrich &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bindestrich &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&lt;br /&gt;
* Schrägstrich &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte der Readingname gültig sein, gibt die Funktion als Rückgabewert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein Readingname aus gültigen Zeichen besteht.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Readingname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$return&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Wahrheitswert, ob der übergebene Readingname zulässig ist.&lt;br /&gt;
Folgende Werte sind möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Readingname enthält unzulässige Zeichen&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Readingname besteht aus zulässigen Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== makeReadingName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$validName = makeReadingName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion makeReadingName() entfernt aus dem übergebenen Readingname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; alle ungültigen Zeichen und ersetzt diese durch einen Unterstrich &amp;quot;_&amp;quot;. Als Rückgabewert erhält man nun einen konformen Readingname in dem nur noch erlaubte Zeichen (Buchstaben, Zahlen, Punkt sowie Unterstrich) enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Readingname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$validName&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der modifizierte Name, welcher übergeben wurde, ohne ungültige Zeichen. Alle evtl. ungültigen Zeichen sind durch einen Unterstrich ersetzt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== zweistufige Modulkommunikation ==&lt;br /&gt;
&lt;br /&gt;
=== AssignIoPort ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
AssignIoPort($hash);&lt;br /&gt;
AssignIoPort($hash, $proposedName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion AssignIoPort() sucht nach einem passenden IO-Gerät (physikalische Definition) nach folgender Vorgehensweise:&lt;br /&gt;
&lt;br /&gt;
# Sofern &amp;lt;code&amp;gt;$proposedName&amp;lt;/code&amp;gt; angegeben ist und der Gerätename existiert und nicht disabled ist (Attribute &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; auf 1 gesetzt), wird &amp;lt;code&amp;gt;$proposedName&amp;lt;/code&amp;gt; als IO-Gerät ausgewählt. &lt;br /&gt;
# Sofern der Nutzer über das Attribut &amp;lt;code&amp;gt;IODev&amp;lt;/code&amp;gt; einen Gerätenamen konfiguriert hat, wird dieser als IO-Gerät ausgewählt.&lt;br /&gt;
# Es werden alle Module geprüft, die entsprechende Nachrichten des Modultyps von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; als IO-Gerät annehmen (via [[DevelopmentModuleIntro#Die_Client-Liste|Client-Liste]]). Die passende Definition, welche als letztes definiert wurde, wird als IO-Gerät ausgewählt.&lt;br /&gt;
&lt;br /&gt;
In den Fällen 1 und 2 wird keine Prüfung durchgeführt, ob das gewählte IO-Gerät überhaupt von dem eigenen Modul Daten verarbeiten kann. Im Fehlerfall wird beim Aufruf von [[#IOWrite|IOWrite()]] eine Fehlermeldung im Logfile erzeugt.&lt;br /&gt;
&lt;br /&gt;
Das gefundene IO-Gerät wird mittels Hash-Referenz unter &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt; gespeichert. Sollte kein passendes IO-Gerät gefunden werden, wird eine Meldung im Logfile produziert.&lt;br /&gt;
&lt;br /&gt;
Generell sollte bei logischen Modulen die Funktion AssignIoPort() im Rahmen der [[DevelopmentModuleIntro#X_Define|Define]]-Funktion aufgerufen werden, da sonst kein Senden von Daten via [[#IOWrite|IOWrite()]] möglich ist. Für den Empfang ist &amp;lt;code&amp;gt;$hash-&amp;gt;{IODev}&amp;lt;/code&amp;gt; ohne Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Hash-Referenz der Definition, für welche ein IO-Gerät zugewiesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$proposedName&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
| Der Gerätename, welcher als IO-Gerät verwendet werden soll. Übersteuert die interne Suche nach einem passenden Gerät. Sollte nur verwendet werden, wenn bei mehreren IO-Geräten die Kommunikation nur bspw. über das empfangene IO-Gerät durchgeführt werden kann.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dispatch ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$found = Dispatch($hash, $message);&lt;br /&gt;
$found = Dispatch($hash, $message, $additional_values, $no_unknown);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion Dispatch() versucht die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;, welche die Definition mit dem Hash &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; erhalten hat, an eine untergeordnete logische Definition weiterzureichen. Über diese Funktion werden Daten von einer physischen Definition an logische Definitionen verteilt. Optional können zur reinen Nachricht auch zusätzliche Daten in &amp;lt;code&amp;gt;$additional_values&amp;lt;/code&amp;gt; mitgegeben werden (z.B. Empfangspegel, Signalqualität, ...). Diese Daten werden bei der gefundenen logischen Gerätedefinition als zusätzliche Internals gesetzt. Bei gesetzem Attribut &amp;lt;code&amp;gt;addvaltrigger&amp;lt;/code&amp;gt; in der physischen Definition werden für diese Daten zusätzlich Events erzeugt (keine Readings!). Über das Flag &amp;lt;code&amp;gt;$no_unknown&amp;lt;/code&amp;gt; kann man verhindern, dass für diese Nachricht im Falle einer nicht gefundenen logischen Gerätedefinition, ein entsprechendes [[DevelopmentModuleIntro#Automatisches_Anlegen_von_logischen_Ger.C3.A4tedefinitionen_.28autocreate.29|Event]] erzeugt (und ggf. das zugehörige Modul nachgeladen) wird. &lt;br /&gt;
&lt;br /&gt;
Die Funktion prüft dabei alle Module aus der [[DevelopmentModuleIntro#Die_Client-Liste|Client-Liste]], ob diese mit der Nachricht etwas anfangen können (via Match-Regexp), führt eine optionale Duplikatserkennung via [[DevelopmentModuleIntro#X_Fingerprint|Fingerprint]]-Funktion durch und gibt den Definitionsnamen zurück, welcher die Nachricht erfolgreich via [[DevelopmentModuleIntro#X_Parse|Parse]]-Funktion verarbeiten konnte (z.B. Erzeugen von Readings, Logmeldungen, usw.). &lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Hash-Referenz der Definition, welche eine Nachricht an andere Module (bzw. deren Definitionen) weiterreichen möchte.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Nachricht als Zeichenkette, welche durch ein anderes Modul verarbeitet werden soll. Hier sind nur Zeichenketten erlaubt, da die möglichen Empfängermodule über reguläre Ausdrücke die Nachricht prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$additional_values&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
| Zusätzliche Daten als Hash-Referenz, welche bei der gefundenen logischen Definition als Internals nach dem Schema &amp;lt;code&amp;gt;&amp;amp;lt;IO-Gerätname&amp;amp;gt;_&amp;amp;lt;Schlüssel&amp;amp;gt;: &amp;amp;lt;Wert&amp;amp;gt;&amp;lt;/code&amp;gt; gesetzt werden. Dies kann bspw. der Empfangspegel (RSSI) oder die Rohnachricht sein.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$no_unknown&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
| Flag. Wenn gesetzt (Wert: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), wird &amp;lt;u&amp;gt;kein&amp;lt;/u&amp;gt; zugehöriges Modul basierend auf der [[DevelopmentModuleIntro#Die_Match-Liste|Match-Liste]] nachgeladen und &amp;lt;u&amp;gt;kein&amp;lt;/u&amp;gt; entsprechendes [[DevelopmentModuleIntro#Automatisches_Anlegen_von_logischen_Ger.C3.A4tedefinitionen_.28autocreate.29|Event]] erzeugt, sollte die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; nicht von bereits existierenden Definition verarbeitet werden können.  Wenn dieses Flag den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, wird ggf. das zugehörige Modul für die Nachricht basierend auf der [[DevelopmentModuleIntro#Die_Match-Liste|Match-Liste]] nachgeladen und ein entsprechendes [[DevelopmentModuleIntro#Automatisches_Anlegen_von_logischen_Ger.C3.A4tedefinitionen_.28autocreate.29|Event]] erzeugt, sollte keine passende Definition für diese Nachricht existieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$found &amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| Eine Array-Referenz, welcher die gefundene Definition zu der Nachricht enthält. Wenn keine Definition gefunden wurde, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IOWrite ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = IOWrite($hash, @arguments);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion IOWrite() übergibt die Daten &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; der logischen Definition &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; an das ausgewählte IO-Gerät indem es die [[DevelopmentModuleIntro#X_Write|Write]]-Funktion mit den Daten &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; aufruft. In &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; ist üblicherweise eine Nachricht/Frame, sowie evtl. Zusatzdaten enthalten, welche das IO-Gerät nur noch an die verbundene Hardware übermitteln muss. Das kann ein einzelner Skalar mit der entsprechenden Nachricht sein, es können aber auch mehrere Werte übergeben werden. Die Aufrufsyntax muss dabei mit der [[DevelopmentModuleIntro#X_Write|Write]]-Funktion des entsprechenden physikalischen Moduls harmonieren. &lt;br /&gt;
&lt;br /&gt;
Damit IOWrite() funktionieren kann, muss zunächst ein IO-Gerät mittels [[#AssignIoPort|AssignIoPort()]] zugewiesen werden. Dieser Aufruf wird üblicherweise in der [[DevelopmentModuleIntro#X_Define|Define]]-Funktion oder der [[DevelopmentModuleIntro#X_Notify|Notify]]-Funktion (Trigger auf &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;global:REREADCFG&amp;lt;/code&amp;gt;) durchgeführt. Erst nach dem Aufruf reicht IOWrite() die Daten an das entsprechende IO-Gerät weiter.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt von &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; wird nicht an die Write-Funktion übergeben. Sollte man &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; des logischen Gerätes auch im physikalischen Gerät benötigen, so kann man &amp;lt;code&amp;gt;$hash&amp;gt;&amp;lt;/code&amp;gt; mit in &amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt; übergeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die Hash-Referenz der Definition, welche Daten an ihr IO-Gerät übertragen möchte.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@arguments&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
| Die zu übertragenden Daten. Das Inhaltsschema muss dabei mit dem entgegennehmenden Modul harmonisieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
| Der Rückgabewert der Write-Funktion des IO-Gerätes, welches die Daten verarbeitet hat.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Timer ==&lt;br /&gt;
&lt;br /&gt;
=== InternalTimer===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;InternalTimer($timestamp, $functionName, $arg);&lt;br /&gt;
InternalTimer($timestamp, $functionName, $arg, $waitIfInitNotDone);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion InternalTimer() ermöglicht das verzögerte Ausführen von einer bestimmten Funktion zu einem späteren Zeitpunkt. Die übergebene Funktion &amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt; wird dabei zum Zeitpunkt &amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt; mit dem Parameter &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Angabe eines UNIX-Timestamp, wann der Timer ausgeführt werden soll (bspw: &amp;lt;code&amp;gt;gettimeofday() + 30&amp;lt;/code&amp;gt; um in 30 Sekunden etwas zu starten)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Funktion als Zeichenkette, welche ausgeführt werden soll zum angegebenen Zeitpunkt (bspw: &amp;quot;MODULNAME_GetStatus&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Übergabeparameter welchen die genannte Funktion zum Ausführungszeitpunkt erhalten soll. Typischerweise ist das meistens $hash, kann aber auch eine Zeichenkette oder jeder weitere Datentyp sein, der mit einem Skalar übergeben werden kann (kein direktes Array/Hash).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$waitIfInitNotDone&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| &lt;br /&gt;
&#039;&#039;&#039;ACHTUNG: Dieser Parameter sollte unter keinen Umständen verwendet werden!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieser Parameter verändert das Verhalten von InternalTimer() während der Initialisierung von FHEM. Ist dieser Parameter auf 1 gesetzt und FHEM noch in der Initialisierungsphase (Konfiguration einlesen), so wird ein Sleep des Hauptprozess durchgeführt, bis der gewünschte Zeitpunkt &amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt; erreicht ist. Dadurch wird der gesamte FHEM-Prozess solange blockiert und ist in dieser Zeit nicht ansprechbar. Dieses Verhalten ist besonders relevant bei der Nutzung von InternalTimer() in der [[DevelopmentModuleIntro#X_Define|Define-Funktion]] eines Moduls und sollte daher so keinesfalls benutzt werden. Um Funktionsaufrufe zu verzögern, bis die Initialisierung beendet ist, sollte auf das Event &amp;lt;code&amp;gt;global:INITIALIZED&amp;lt;/code&amp;gt; in der [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] gewartet werden.&lt;br /&gt;
&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== RemoveInternalTimer ===&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;RemoveInternalTimer($arg);&lt;br /&gt;
RemoveInternalTimer($arg, $functionName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion RemoveInternalTimer löscht möglicherweise noch anstehende Timer welche mit dem Übergabeparameter &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; gescheduled sind. Optional kann man zusätzlich die Suche auf eine bestimmte Funktion &amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt; weiter einschränken.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Übergabeparameter nach welchem gesucht wird. Alle Timer die mit diesem Übergabeparameter noch anstehen, werden dabei gelöscht.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$functionName&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Der Funktionsname der zusätzlich zu &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; gesucht werden soll.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SetExtensionsCancel ===&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;SetExtensionsCancel($hash);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion &#039;&#039;SetExtensionsCancel&#039;&#039; löscht möglicherweise noch anstehenden Timer, der durch ein &#039;&#039;on-for-timer&#039;&#039;, &#039;&#039;off-for-timer&#039;&#039;, ... über die &#039;&#039;SetExtensions&#039;&#039; angelegt wurde. Sollte in der [[DevelopmentModuleIntro#X_Set|SetFn]] aufgerufen werden, bevor der Devicezustand durch ein anderes Kommando geändert wird.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Hash-Referenz der Definition, durch die der Timer angelegt wurde.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Definitionen ==&lt;br /&gt;
&lt;br /&gt;
=== devspec2array ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
@list = devspec2array($devspec);&lt;br /&gt;
@list = devspec2array($devspec, $client_hash);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion devspec2array() gibt eine Array mit Definitionsnamen zurück die auf die übergebene Device-Specification &amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt; matchen. &lt;br /&gt;
&lt;br /&gt;
Sollte keine Definition auf die übergebene Spezifikation passen, so wird &amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt; als einziges zurückgegeben. Dieser Mechanismus ist aus historischen Gründen so gewählt um die Funktion devspec2array() transparent in Module einzufügen ohne große Änderungen im Code durchführen zu müssen. Daher ist es notwendig im Falle der Rückgabe eines einzelnen Elements dies nochmals auf Existenz in &amp;lt;code&amp;gt;%defs&amp;lt;/code&amp;gt; zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Die genaue Syntax einer Device-Specification ist in der {{Link2CmdRef|Anker=devspec}} erläutert. Die Funktion devspec2array() setzt diese Syntax um und gibt die gefundenen Definitions-Namen zurück.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Device-Specification zum Suchen nach Definitions-Namen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039; &lt;br /&gt;
|| Der Definitions-Hash der für den Aufruf verantwortlich ist. Dies dient zur Prüfung, ob diese Definition diesen Vorgang ausführen darf (Vorgangs-Typ: &amp;lt;code&amp;gt;devicename&amp;lt;/code&amp;gt;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@list&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Array mit einer Liste aller Definitions-Namen die zu der übergebenen Device-Specification passen. Sofern keine Definition auf die Spezifikation passt wird &amp;lt;code&amp;gt;$devspec&amp;lt;/code&amp;gt; unverändert zurückgegeben. Wenn &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; gesetzt ist und die Definition diesen Vorgang nicht ausführen darf, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== goodDeviceName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$valid = goodDeviceName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion goodDeviceName() prüft, ob der Definitionsname &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; ein gültiger Bezeichner innerhalb von FHEM ist. Ein gültiger Definitionsname besteht aus folgenden Zeichen bzw. Zeichengruppen:&lt;br /&gt;
&lt;br /&gt;
* Normale Buchstaben ohne deutsche Sonderzeichen (A-Z, groß/klein)&lt;br /&gt;
* Zahlen (0-9)&lt;br /&gt;
* Punkt &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
* Unterstrich &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sollte der Definitionsname gültig sein, gibt die Funktion als Rückgabewert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein Definitionsname aus gültigen Zeichen besteht.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitionsname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$return&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Wahrheitswert, ob der übergebene Definitionsname zulässig ist.&lt;br /&gt;
Folgende Werte sind möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definitionsname enthält unzulässige Zeichen&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definitionsname besteht aus zulässigen Zeichen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== makeDeviceName ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$validName = makeDeviceName($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion makeDeviceName() entfernt aus dem übergebenen Definitionsnamen &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; alle ungültigen Zeichen und ersetzt diese durch einen Unterstrich &amp;quot;_&amp;quot;. Als Rückgabewert erhält man nun einen konformen Definitionsnamen in dem nur noch erlaubte Zeichen (Buchstaben, Zahlen, Punkt sowie Unterstrich) enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitionsname, welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$validName&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der modifizierte Name, welcher übergeben wurde, ohne ungültige Zeichen. Alle evtl. ungültigen Zeichen sind durch einen Unterstrich ersetzt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Daten abfragen/auslesen ==&lt;br /&gt;
&lt;br /&gt;
=== ReadingsVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = ReadingsVal($name, $reading, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion ReadingsVal() gibt den inhaltlichen Wert des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings welcher ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Inhalt des gewünschten Readings oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ReadingsTimestamp===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$timestamp = ReadingsTimestamp($name, $reading, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion ReadingsTimestamp() gibt den Zeitstempel des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Es handelt sich hierbei um den Zeitpunkt an dem das Reading zuletzt gesetzt/aktualisiert wurde. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Zeitstempel für das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings für welches der Zeitstempel ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeitstempel des gewünschten Readings in lokaler Zeitzone im Format&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ReadingsAge===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$seconds = ReadingsAge($name, $reading, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion ReadingsAge() gibt die Dauer in Sekunden seit der letzten Aktualisierung des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Es handelt sich hierbei um den Zeitpunkt an dem das Reading zuletzt gesetzt/aktualisiert wurde. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem die Dauer der letzten Aktualisierung für das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings für welches die Dauer der letzten Aktualisierung ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rückgabewert ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$seconds&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Sekunden als Ganzzahl, welche seit der letzten Aktualisierung vergangen sind&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ReadingsNum ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = ReadingsNum($name, $reading, $default, $round);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;ReadingsNum&amp;lt;/code&amp;gt; extrahiert den numerischen Teil des Readings &amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; und gibt diesen zurück, wenn er existiert. Dabei werden Zeichenketten wie z.B. Einheiten eliminiert und nur die eigentliche Zahl (Ganzzahl- oder Fließkommazahl) zurückgegeben. Sollte das gewünschte Reading nicht existieren, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben. Sollte das gewünschte Reading existieren, jedoch keinen numerischen Wert enthalten, wird ebenfalls &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben. Es ist möglich, den Rückgabewert durch Angabe von &amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt; Stellen zu runden. Verwendet wird hierzu die FHEM-eigene Funktion &amp;lt;code&amp;gt;[https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/99_Utils.pm#L239 round]&amp;lt;/code&amp;gt;; überzählige Stellen werden mit 0 aufgefüllt - round ist daher kein round im strikt mathematischen Sinne, sondern bietet zusätzlich eine Formatierung.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123.45 °C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert));&lt;br /&gt;
# = 123.45&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(baz), q(Kein Wert));&lt;br /&gt;
# = &amp;quot;Kein Wert&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 0);&lt;br /&gt;
# = 123&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 1);&lt;br /&gt;
# = 123.5&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 5);&lt;br /&gt;
# = 123.45000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123 °C&amp;quot;&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), 5);&lt;br /&gt;
# = 123.00000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parameter ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem ein Wert für das gewünschte Reading ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$reading&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Readings aus dem ein numerischer Wert ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Reading nicht existiert, bzw. keinen numerischen Wert enthält.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|Der ermittelte Wert, ob Standard oder aus einem Reading, wird auf &#039;&#039;$round&#039;&#039; Anzahl Stellen gerundet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rückgabewert ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Wert des gewünschten Readings oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert oder kein numerischer Teil ermittelt werden konnte.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Fallstricke ====&lt;br /&gt;
Der Rückgabewert muss nicht unbedingt ein numerischer Wert sein, wenn als &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; kein numerischer Wert oder &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; übergeben wurde. Vergleiche mit numerischen Operatoren werden dann ggf. ein Warning erzeugen.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123.45 °C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Lese aus dem Reading baz, nicht bar, wird fehlschlagen&lt;br /&gt;
if ( ReadingsNum(q(foo), q(baz), q(Kein Wert), 0) == 123.5 ) {&lt;br /&gt;
    say q(Wert ist 123.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Argument &amp;quot;Kein Wert&amp;quot; isn&#039;t numeric in numeric eq (==)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;$round&amp;lt;/code&amp;gt; wird direkt, d.h. ohne Validierung, in den [https://perldoc.perl.org/functions/sprintf format string] in &amp;lt;code&amp;gt;[https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/99_Utils.pm#L239 round]&amp;lt;/code&amp;gt; übernommen und ausgewertet.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# Device foo, Reading bar, Wert &amp;quot;123.45 °C&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), q{%%p});&lt;br /&gt;
# Evaluiert %p zu einer Speicheradresse, z.B. 7fa1fb03d738f&lt;br /&gt;
&lt;br /&gt;
ReadingsNum(q(foo), q(bar), q(Kein Wert), q(foo));&lt;br /&gt;
# = 123oof&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AttrVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = AttrVal($name, $attribute, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion AttrVal() gibt den aktuell konfigurierten Inhalt des Attribut &amp;lt;code&amp;gt;$attribute&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte das gewünschte Attribut nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem das gewünschte Attribut ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$attribute&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Attributs, dessen Wert ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Attribut nicht existiert.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Inhalt des gewünschten Attributs oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== InternalVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = InternalVal($name, $internal, $default);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion InternalVal() gibt den aktuellen Inhalt eines Internals &amp;lt;code&amp;gt;$internal&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte das gewünschte Internal nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem das gewünschte Internal ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$internal&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Internals, dessen Wert ausgelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Standardwert der zurückgegeben werden soll, sofern das Internal nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Inhalt des gewünschten Internal oder &amp;lt;code&amp;gt;$default&amp;lt;/code&amp;gt;, wenn es nicht existiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Value===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = Value($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Value() gibt den aktuellen Status von Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück. Sollte die gewünschte Definition nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Status ausgelesen werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Status der gewünschten Definition&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OldValue===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = OldValue($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion OldValue() gibt den Status der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; zurück BEVOR der aktuelle Status aufgrund eines Events gesetzt wurde. Sollte die gewünschte Definition nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Status ausgelesen werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || vorheriger Status der gewünschten Definition&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OldTimestamp===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$timestamp = OldTimestamp($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion OldTimestamp() gibt den Zeitpunkt der letzten Statusänderung der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; als Zeichenkette zurück. Sollte die gewünschte Definition nicht existieren bzw. nicht gesetzt sein, wird &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring) zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name aus dem der Status ausgelesen werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$timestamp&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Zeitstempel in lokaler Zeitzone im Format&lt;br /&gt;
&amp;lt;code&amp;gt;2016-02-16 19:34:24&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attribute in anderen Definitionen bereitstellen ==&lt;br /&gt;
&lt;br /&gt;
=== addToAttrList===&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
addToAttrList($attrib);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion addToAttrList() fügt das Attribut mit dem Namen &amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt; zu dem Attribut &amp;lt;code&amp;gt;userattr&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt; hinzu. Damit kann dieses Attribut in allen systemweiten Definitionen verwendet und gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Attributs, welches für alle Definitionen verfügbar gemacht werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== addToDevAttrList ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
addToDevAttrList($name, $attrib);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion addToDevAttrList() fügt das Attribut mit dem Namen &amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt; zu dem Attribut &amp;lt;code&amp;gt;userattr&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; hinzu. Damit kann dieses Attribut in der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; verwendet und gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Definition, für welche das Attribut verfügbar gemacht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$attrib&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name des Attributs, welches für die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; verfügbar gemacht werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Daten dauerhaft schreiben/lesen ==&lt;br /&gt;
&lt;br /&gt;
=== FileRead ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
($error, @content) = FileRead($filename);&lt;br /&gt;
($error, @content) = FileRead($param);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion FileRead() liest den Inhalt der Datei &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; ein und gibt diesen als ein zeilenweises Array zurück. In Verwendung mit configDB wird die Datei standardmäßig aus der Datenbank gelesen. Um im Falle von configDB dennoch auf das Dateisystem zugreifen zu können muss als Übergabeparameter ein Hash &amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt; gesetzt werden in dem ein spezieller Wert den Zugriff auf das Dateisystem forciert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Dateisystempfad der Datei die eingelesen werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Um im Falle der Nutzung von configDB den Zugriff auf das lokale Dateisystem zu erzwingen muss ein Parameter-Hash wie folgt übergeben werden:&lt;br /&gt;
&amp;lt;code&amp;gt;{ FileName =&amp;gt; $filename, ForceType =&amp;gt; &amp;quot;file&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; enthält dabei den lokalen Dateisystempfad zu der gewünschten Datei.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Lesen der Datei ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Lesevorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; (Leerstring).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@content&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Inhalt der gewünschten Datei als zeilenweises Array. Im Falle eines Fehlers beim Lesen trägt dieses Array den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FileDelete ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$error = FileDelete($filename);&lt;br /&gt;
$error = FileDelete($param);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion FileDelete() löscht die Datei &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;. In Verwendung mit configDB wird die Datei standardmäßig aus der Datenbank gelöscht. Um im Falle von configDB dennoch auf das Dateisystem zugreifen zu können muss als Übergabeparameter ein Hash &amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt; gesetzt werden in dem ein spezieller Wert das Löschen der Datei im Dateisystem forciert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Dateisystempfad der Datei die gelöscht werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Um im Falle der Nutzung von configDB den Zugriff auf das lokale Dateisystem zu erzwingen muss ein Parameter-Hash wie folgt übergeben werden:&lt;br /&gt;
&amp;lt;code&amp;gt;{ FileName =&amp;gt; $filename, ForceType =&amp;gt; &amp;quot;file&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; enthält dabei den lokalen Dateisystempfad zu der gewünschten Datei.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Löschen der Datei ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Löschvorgang erfolgreich, enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FileWrite ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$error = FileWrite($filename, @content);&lt;br /&gt;
$error = FileWrite($param, @content);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion FileWrite() schreibt den übergebenen Inhalt &amp;lt;code&amp;gt;@content&amp;lt;/code&amp;gt; in die Datei &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;. In Verwendung mit configDB wird die Datei standardmäßig in die Datenbank geschrieben. Um im Falle von configDB dennoch auf das Dateisystem zugreifen zu können muss als Übergabeparameter ein Hash &amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt; gesetzt werden in dem ein spezieller Wert den Zugriff auf das Dateisystem forciert.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Dateisystempfad der Datei in welche der Inhalt geschrieben werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$param&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Um im Falle der Nutzung von configDB den Zugriff auf das lokale Dateisystem zu erzwingen muss ein Parameter-Hash wie folgt übergeben werden:&lt;br /&gt;
&amp;lt;code&amp;gt;{ FileName =&amp;gt; $filename, ForceType =&amp;gt; &amp;quot;file&amp;quot;, NoNL =&amp;gt; 0 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;code&amp;gt;$filename&amp;lt;/code&amp;gt; enthält dabei den lokalen Dateisystempfad der zu schreibenden Datei. Optional kann man den Wert &amp;lt;code&amp;gt;NoNL&amp;lt;/code&amp;gt; auf 1 setzen um kein Newline (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) als Trennzeichen zwischen den einzelnen Zeilen zu erzeugen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@content&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die zu schreibenden Daten als ein Array von Zeilen (ohne Newline am Ende jeder Zeile).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Schreiben der Datei ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Schreibvorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== setKeyValue ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;$error = setKeyValue($key, $value)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion setKeyValue() speichert die Daten &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; unter dem Schlüssel &amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt; ab. Die Daten werden in einer Datei auf dem Dateisystem (oder configDB) gespeichert und sind somit persistent auch nach einem Neustart von FHEM verfügbar. Die Daten welche in &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; enthalten sind, dürfen dabei keine Zeilenumbrüche enthalten. Sollten Daten mit Zeilenumbrüchen auf diese Weise gespeichert werden, so müssen Zeilenumbrüche durch entsprechende Mechanismen (z.B. Base64 oder das Ersetzen durch alternative Trennzeichen) eliminiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG:&#039;&#039;&#039; Die Daten werden im Klartext in einer Datei auf dem Dateisystem abgelegt! Sensible Daten die mit setKeyValue gespeichert werden (z.B. Passwörter, Zugangsdaten, etc.) sollten durch entsprechende Mechanismen (z.B. Verschlüsselung) unleserlich gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der eindeutige Schlüssel als Zeichenkette unter dem die Daten abgespeichert werden soll (bspw. Definitions-Namen). Der Schlüssel darf dabei keine Zeilenumbrüche enthalten.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Die zu speichernden Daten als Zeichenkette ohne Zeilenumbruch. Die Daten dürfen dabei keine Zeilenumbrüche enthalten.&lt;br /&gt;
&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, werden zuvor gespeicherte Daten gelöscht.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Schreiben der Daten ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Schreibvorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== getKeyValue ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;($error, $value) = getKeyValue($key)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion getKeyValue() gibt Daten, welche zuvor per &amp;lt;code&amp;gt;setKeyValue()&amp;lt;/code&amp;gt; gespeichert wurden, zurück.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der eindeutige Schlüssel als Zeichenkette unter dem die Daten gespeichert wurden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewert:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabe!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Im Falle eines Fehlers beim Lesen der Daten ist dieser Wert mit einer Fehlermeldung als Zeichenkette gefüllt. Ist der Lesevorgang erfolgreich enthält &amp;lt;code&amp;gt;$error&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Die Daten, welche unter dem gegebenen Schlüssel &amp;lt;code&amp;gt;$key&amp;lt;/code&amp;gt; hinterlegt sind. Wenn keine Daten zu dem Schlüssel existieren, besitzt &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
=== Log ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log($verbose, $message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Log() schreibt die Meldung &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; in das FHEM-Logfile, sofern &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; kleiner gleich dem globalen Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; ist. Wenn &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; größer ist als das globale Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt;, wird die Meldung nicht geloggt.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Verbose-Level unter dem die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; geloggt werden soll. &lt;br /&gt;
&lt;br /&gt;
Ganzzahl zwischen 0 und 5&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Log-Meldung als Zeichenkette, welche in das FHEM-Logfile geloggt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Log3 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log3($name, $verbose, $message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Log3() schreibt die Meldung &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; in das FHEM-Logfile, sofern &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; kleiner gleich dem Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; ist. Wenn das Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; in der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; nicht gesetzt ist, wird gegen das globale Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; geprüft.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion ist primär für die Log-Ausgabe in Modulen gedacht um so dem User die Möglichkeit zu geben nur für bestimmte Definitionen den Verbose-Level zu erhöhen ohne den globalen Verbose-Level zu erhöhen.&lt;br /&gt;
 &lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Der Name der Definition wogegen geprüft werden soll. Wenn &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; in FHEM nicht existiert, oder den Wert &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; besitzt, wird der Parameter &amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt; gegen das globale Attribut &amp;lt;code&amp;gt;verbose&amp;lt;/code&amp;gt; geprüft.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$verbose&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Verbose-Level unter dem die Nachricht &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; geloggt werden soll. &lt;br /&gt;
&lt;br /&gt;
Ganzzahl zwischen 0 und 5&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Log-Meldung als Zeichenkette, welche in das FHEM-Logfile geloggt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Debug ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Debug($message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion Debug() schreibt die Meldung &amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt; mit dem Präfix &amp;lt;code&amp;gt;DEBUG&amp;gt;&amp;lt;/code&amp;gt; in das FHEM-Logfile. Diese Funktion ist zum temporären Debuggen gedacht und sollte nicht fest in einem Modul verwendet werden. Sie entspricht dem Aufruf:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 Log(1, &amp;quot;DEBUG&amp;gt;&amp;quot;.$message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$message&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Die Debug-Meldung als Zeichenkette, welche in das FHEM-Logfile geloggt werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Status-Abfragen ==&lt;br /&gt;
=== IsDevice ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsDevice($name);&lt;br /&gt;
$status = IsDevice($name, $type);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsDevice() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; existiert. Optional kann man prüfen, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; dem Modultyp &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt; entspricht. &lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition existiert, bzw. einem bestimmten Modultyp entspricht.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher auf Vorhandensein geprüft werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;optional&#039;&#039;&lt;br /&gt;
|| Ein regulärer Ausdruck der gegen den Modulnamen (&amp;lt;code&amp;gt;$hash-&amp;gt;{TYPE}&amp;lt;/code&amp;gt;) der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; geprüft werden soll. Dieser Ausdruck muss auf den gesamten Modulnamen passen, da der Ausdruck mit &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; umschlossen wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Das Ergebnis, ob eine solche Definition existiert:&lt;br /&gt;
&lt;br /&gt;
0 - Definition existiert nicht&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition existiert&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn nur &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; übergeben ist, wird nur geprüft ob eine Definition mit diesem Namen existiert. Wenn zusätzlich &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt; parametrisiert wurde, muss eine Definition mit dem Namen &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; existieren &#039;&#039;&#039;UND&#039;&#039;&#039; dem Modultypen &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt; entsprechen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsDisabled ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsDisabled($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsDisabled() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; aktuell deaktiviert  (Attribute: disabled/disabledForIntervals) oder durch den Nutzer inaktiv geschaltet wurde (STATE: &amp;lt;code&amp;gt;inactive&amp;lt;/code&amp;gt;). Je nachdem ob die Definition deaktiviert/inaktiv ist, gibt sie einen entsprechenden Wert größer &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zurück. Wenn die Definition aktiv ist, gibt die Funktion den Wert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zurück.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition aktiv/inaktiv ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition ist durch das Attribut &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; deaktiviert&amp;lt;br&amp;gt;&lt;br /&gt;
2 - Definition ist durch das Attribut &amp;lt;code&amp;gt;disabledForIntervals&amp;lt;/code&amp;gt; deaktiviert&amp;lt;br&amp;gt;&lt;br /&gt;
3 - Definition ist durch den User inaktiv geschaltet. Dies bedeutet &amp;lt;code&amp;gt;$hash-&amp;gt;{STATE}&amp;lt;/code&amp;gt; oder das Reading &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; der Definition besitzt den Wert &amp;lt;code&amp;gt;inactive&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsDummy ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsDummy($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsDummy() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; in den Dummy-Modus versetzt wurde (Attribut: &amp;lt;code&amp;gt;dummy&amp;lt;/code&amp;gt;). Wenn die Definition in den Dummy-Modus gesetzt ist, gibt IsDummy() den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition im Dummy-Modus ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition ist im Dummy-Modus&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsIgnored ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsIgnored($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsIgnored() prüft, ob die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; durch den User ignoriert wird (Attribut: &amp;lt;code&amp;gt;ignore&amp;lt;/code&amp;gt;). Wenn die Definition durch den User ignoriert wird, gibt IsIgnored() den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob eine Definition ignoriert wird.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name welcher geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Definition wird ignoriert&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IsIoDummy ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = IsIoDummy($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion IsIoDummy() prüft, ob das zugeordnete IO-Device der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; in den Dummy-Modus versetzt wurde (Attribut: &amp;lt;code&amp;gt;dummy&amp;lt;/code&amp;gt;). Wenn das IO-Device in den Dummy-Modus gesetzt ist, gibt IsIoDummy() den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück, andernfalls &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein IO-Device einer Definition im Dummy-Modus ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitions-Name, dessen IO-Device geprüft werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der Status des IO-Devices der Definition. Je nach Status sind folgende Werte möglich:&lt;br /&gt;
&lt;br /&gt;
0 - IO-Device der Definition ist aktiv&amp;lt;br&amp;gt;&lt;br /&gt;
1 - IO-Device der Definition ist im Dummy-Modus&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sicherheit ==&lt;br /&gt;
&lt;br /&gt;
=== Authenticate ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$result = Authenticate($client, $argument);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== Authorized ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$result = Authorized($client_hash, $type, $arg);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion Authorized() prüft, ob ein Client mit dem Client-Hash &amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt; die Aktion &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; ausführen darf bzw. dazu berechtigt ist. Dazu werden sämtliche Definitionen in FHEM befragt, deren Module die Modulfunktion [[DevelopmentModuleIntro#X_Authorize|X_Authorize()]] bereitstellen. Die beiden Argumente &amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; werden dabei 1:1 an die [[DevelopmentModuleIntro#X_Authorize|Authorize]]-Funktion der jeweiligen Module übergeben. &lt;br /&gt;
&lt;br /&gt;
Nachdem alle Definitionen zu dem jeweiligen Vorgang befragt wurden, gibt die Funktion zurück, ob der Client dazu authorisiert ist. Sobald eine Definition den Vorgang explizit verbietet, wird sofort der Rückgabewert &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; zurückgegeben. Wenn eine Definition den Vorgang explizit erlaubt, wird sofort der Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurückgegeben. In beiden Fällen werden weitere Definitionen nicht mehr befragt. Sollte keine Definition den Vorgang explizit erlauben/verbieten oder keine Definition zum Prüfen vorhanden sein, wird die Aktion generell erlaubt durch die Rückgabe von &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Sollte ebenfalls keine Bewertung möglich sein aufgrund eines fehlenden oder unvollständigen Client-Hash, wird der Vorgang generell erlaubt.&lt;br /&gt;
&lt;br /&gt;
Innerhalb von FHEM werden zwei Vorgangstypen bereits verwendet um die Befehlsausführung und Sichtbarkeit von Definitionen in FHEM einzuschränken. Das Modul [[allowed]] stellt dabei die entsprechende Modulfunktion [[DevelopmentModuleIntro#X_Authorize|X_Authorize()]] bereit.&lt;br /&gt;
&lt;br /&gt;
Die Funktion Authorized() ist daher nur notwendig, wenn man weiterführende Beschränkungen für einzelne Clients in Modulen/Definitionen realisieren möchte, die über die bestehenden Möglichkeiten hinausgehen. Dazu muss natürlich ein entsprechendes Gegenstück in Form eines weiteren Moduls zur Verfügung stehen, welche diese neuen Vorgangstypen entsprechend bewerten kann. &lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob ein Client zu einem bestimmten Vorgang authorisiert ist.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$client_hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Client-Hash, welcher einen Vorgang durchführen möchte.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$type&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Vorgangstyp als Zeichenkette, um welchen es geht. Innerhalb von fhem.pl werden aktuell zwei Typen unterschieden:&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; - Befehlsausführung (sowohl FHEM-Befehle als auch Shell-/Perl-Aufrufe)&lt;br /&gt;
* &amp;lt;code&amp;gt;devicename&amp;lt;/code&amp;gt; - Sichtbarkeit von Definitionen innerhalb von FHEM&lt;br /&gt;
&lt;br /&gt;
Generell können hier weitere Typ/Argument-Kombinationen verwendet werden, solange es ein korrespondierendes Modul mit [[DevelopmentModuleIntro#X_Authorize|Authorize]]-Funktion gibt, welches diese Vorgänge verarbeiten kann.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Ein zusätzliches Argument um den jeweiligen Vorgangstyp genauer zu beschreiben. Eine Beschreibung der Bedeutung von &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; in Verbindung mit den bereits vorhandenen Vorgangstypen (&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;devicename&amp;lt;/code&amp;gt;) gibt es in der Beschreibung von &amp;lt;code&amp;gt;$arg&amp;lt;/code&amp;gt; zur Modulfunktion [[DevelopmentModuleIntro#X_Authorize|X_Authorize()]]&lt;br /&gt;
&lt;br /&gt;
Generell können hier weitere Typ/Argument-Kombinationen verwendet werden, solange es ein korrespondierendes Modul mit [[DevelopmentModuleIntro#X_Authorize|Authorize]]-Funktion gibt, welches diese Vorgänge verarbeiten kann.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$result&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|| Ergebnis, ob der zu prüfende Vorgang authorisiert ist.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Vorgang ist NICHT authorisiert und darf nicht ausgeführt werden.&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - Vorgang ist authorisiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modulfunktionen ausführen == &lt;br /&gt;
&lt;br /&gt;
=== CallFn ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = CallFn($name, $function_name, @args);&lt;br /&gt;
@ret = CallFn($name, $function_name, @args);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion CallFn() ruft von der Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; die im Modul registrierte Funktion &amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt; mit den Argumenten &amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt; auf und gibt das Ergebnis dieses Funktionsaufrufs zurück. Dazu wird die Funktion im entsprechenden Modul-Hash des zugrunde liegenden Moduls von &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; gesucht. Entsprechende Funktionen werden im Rahmen der [[DevelopmentModuleIntro#X_Initialize|Initialize]]-Funktion beim Laden eines Moduls registriert. &lt;br /&gt;
&lt;br /&gt;
Bei einem erfolgreichen Aufruf gibt CallFn() den/die Rückgabewert/-e der Modulfunktion zurück. Sollte das zugrunde liegende Modul die entsprechende Funktion nicht bereitstellen, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Definition, für den ein Aufruf einer Modulfunktion durchgeführt werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Funktion als Zeichenkette, welche aufgerufen werden soll. Dieser Wert entspricht dem Schlüsselwort mit dem die entsprechende Funktion im Rahmen von [[DevelopmentModuleIntro#X_Initialize|X_Initialize()]] im Modul-Hash registriert wurde.&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;SetFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DbLog_splitFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;CopyFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Eines oder mehrere Argumente, welche beim Aufruf der Modulfunktion entsprechend mitgegeben werden sollen. Die Argumente sind hier je nach Modulfunktion unterschiedlich. Die Aufrufsyntax und deren Reihenfolge muss in Modulen, welche die entsprechende Modulfunktion unterstützen in gleicher Art und Weise implementiert werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039; / &#039;&#039;&#039;&amp;lt;code&amp;gt;@ret&amp;lt;/code&amp;gt;&#039;&#039;&#039;  || Der Rückgabewert der Modulfunktion als Skalar oder Array (je nach Kontext).&lt;br /&gt;
&lt;br /&gt;
Sollte die gewünschte Funktion im zugrunde liegenden Modul nicht existieren, wird nur &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CallInstanceFn ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$ret = CallInstanceFn($name, $function_name, @args);&lt;br /&gt;
@ret = CallInstanceFn($name, $function_name, @args);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Die Funktion CallInstanceFn() ist eine Erweiterung zu [[#CallFn|CallFn()]]. Die auszuführende Funktion &amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt; wird dabei zuerst in dem Definitions-Hash von &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; gesucht. Der Funktionsname muss dabei direkt in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; definiert sein (ähnlich wie beim Modul-Hash im Rahmen von [[DevelopmentModuleIntro#X_Initialize|X_Initialize()]]). Der Funktionsname kann in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; dabei optional mit einem Punkt als Präfix vorangestellt sein um eine Anzeige in FHEMWEB zu unterbinden. Sollte die Funktion &amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt; innerhalb des Definitions-Hash von &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; nicht existieren, wird [[#CallFn|CallFn()]] mit den gleichen Parametern aufgerufen um die Funktion im zugrunde liegenden Modul aufzurufen, sofern diese ebenfalls existiert.&lt;br /&gt;
&lt;br /&gt;
Dadurch kann man eine registrierte Modulfunktion definitionsbezogen in Einzelfällen übersteuern durch bspw. äquivalente Modulfunktionen aus Hilfsmodulen.&lt;br /&gt;
&lt;br /&gt;
Bei einem erfolgreichen Aufruf gibt CallInstanceFn() den/die Rückgabewert/-e der Modulfunktion zurück. Sollte sowohl die Definition, als auch das zugrunde liegende Modul die entsprechende Modulfunktion nicht bereitstellen, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Definition, für den ein Aufruf einer Modul-Funktion durchgeführt werden soll.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$function_name&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Name der Funktion als Zeichenkette, welche aufgerufen werden soll. Dieser Wert entspricht dem Schlüsselwort mit dem die entsprechende Funktion in &amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt; und, im Rahmen von [[DevelopmentModuleIntro#X_Initialize|X_Initialize()]], im Modul-Hash registriert wurde.&lt;br /&gt;
&lt;br /&gt;
Bsp:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DbLog_splitFn&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;@args&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Eines oder mehrere Argumente, welche beim Aufruf der Modulfunktion entsprechend mitgegeben werden sollen. Die Argumente sind hier je nach Modulfunktion unterschiedlich. Die Aufrufsyntax und deren Reihenfolge muss in Modulen, welche die entsprechende Modulfunktion unterstützen in gleicher Art und Weise implementiert werden.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$ret&amp;lt;/code&amp;gt;&#039;&#039;&#039; / &#039;&#039;&#039;&amp;lt;code&amp;gt;@ret&amp;lt;/code&amp;gt;&#039;&#039;&#039;  || Der Rückgabewert der Modulfunktion als Skalar oder Array (je nach Kontext).&lt;br /&gt;
&lt;br /&gt;
Sollte die gewünschte Funktion in der Definition, als auch im zugrunde liegenden Modul nicht existieren, wird nur &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
&lt;br /&gt;
=== configDBUsed ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = configDBUsed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion configDBUsed() prüft, ob in der aktuellen FHEM-Umgebung configDB verwendet wird und gibt in diesem Fall den Wert &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; zurück. Die Funktion besitzt keinerlei Übergabeparameter.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann dabei in typischen if-Konstrukten direkt verwendet werden um zu prüfen, ob configDB verwendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$status&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Folgende Werte sind möglich:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0 - configDB wird nicht verwendet&amp;lt;br&amp;gt;&lt;br /&gt;
1 - configDB wird  verwendet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== computeClientArray ===&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; compute the list of defined logical modules for a physical module&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$clientArray = computeClientArray($definitionHash, $moduleName);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wenn im übergebenen $definitionHash der Wert {ClientsKeepOrder}=1 gesetzt ist, dann wird der ClientArray in der Reihenfolge und mit den Namen aufgebaut, wie diese im phyischen Modul hinterlegt sind.&lt;br /&gt;
&lt;br /&gt;
Der Wert {ClientsKeepOrder}=0 bewirkt, dass eine Sortierung gemäß der Modulreihenfolge vorgenommen wird und dass Module auch über die Angabe einer Regex ausgewählt werden können.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$clientArray&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Liefert auf Basis des übergebenen hashes einer Moduldefinition und des übergebenen Modulnamens einen $clientarray zurück&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== getUniqueId ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$uniqueID = getUniqueId();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion getUniqueId() gibt einen eindeutige Identifikations-String der lokalen FHEM-Installation zurück. Dieser String wird einmalig per Zufallsalgorithmus erzeugt und anschließend lokal abgespeichert. Jede FHEM-Installation besitzt einen anderen Identifikations-String. Dieser Wert wird bspw. für die Online-Statistik verwendet um die einzelnen Installation zu anonymisieren.&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$uniqueID&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Eine Zeichenkette in Hexadezimaldarstellung welche pro Installation eindeutig ist.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== toJSON ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$jsonString = toJSON($value);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion toJSON() konvertiert eine komplexe Datenstruktur, welche aus Array, Hashes oder Skalaren bestehen kann, in einen JSON-konformen String. Als Argument &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; kann man daher eine Array-Referenz, eine Hash-Referenz oder einen einfachen, skalaren Wert übergeben. Als Rückgabewert wird ein JSON-konformer String zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&amp;lt;br&amp;gt;can be &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
|| Eine Array-Referenz, eine Hash-Referenz oder ein einfacher, skalarer Wert, welcher in JSON zurückgeben werden soll.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rückgabewerte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rückgabewert !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$jsonString &amp;lt;/code&amp;gt;&#039;&#039;&#039; || Der JSON-String, welcher das Objekt samt Inhalt darstellt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CancelDelayedShutdown ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
CancelDelayedShutdown($name);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Funktion CancelDelayedShutdown() ist nur im Zusammenhang mit einer im Modul implementierten [[DevelopmentModuleIntro#X_DelayedShutdown|DelayedShutdown]]-Funktion notwendig. Sofern über die DelayedShutdown-Funktion ein verzögertes Herunterfahren von FHEM signalisiert wird, dient CancelDelayedShutdown() dazu FHEM zu signalisieren, dass alle notwendigen Schritte vor dem Herunterfahren für die Definition &amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt; abgeschlossen sind und FHEM sich nun beenden kann.&lt;br /&gt;
&lt;br /&gt;
Parameter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$name&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Der Definitionsname, für den die Shutdown-Verzögerung abgebrochen werden soll&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=35600</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=35600"/>
		<updated>2021-04-23T21:37:14Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* FHEM-Modul laden */ update branch dev-r34 entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.5.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/master&amp;lt;nowiki/&amp;gt;/controls_signalduino.txt&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax. Ebenso wird auch vorgegangen wenn der SIGNALduino beispielsweise über ser2net freigeben wird.&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
Wenn ein miniCUL geflasht werden soll, sind einige Besonderheiten zu beachten. Details dazu in {{Link2Forum|Topic=114413|LinkText=diesem Forenthema}}.&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in  nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Die Version 3.4 ist die aktuell stabile Version.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&lt;br /&gt;
&amp;lt;!-- &amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;  ... markdown lexer not yet available; use pre instead --&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te|Unterstützte Geräte]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl im Modul direkt ausgeführt werden können. Sofern möglich, sollten die Abfrage von Werten aus dem Modul allerdings mit den dafür vorgesehenen Kommandos erfolgen, da die Rückmeldungen des &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehls nur im Logfile ab Verbose 4 erscheinen. Die Befehle sind nützlich, wenn direkt auf den Microcontroller zugegriffen wird: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: &amp;lt;code&amp;gt;set raw C35&amp;lt;/code&amp;gt; führt ab Verbose 4 zu einer Logausgabe folgender Art  &amp;lt;code&amp;gt;Read, msg: C35 = 0D&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2 des CC1101)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=34625</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=34625"/>
		<updated>2021-01-15T21:59:30Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* FHEM-Modul laden */ Auf aktuellen git branch verwiesen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.5.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/master&amp;lt;nowiki/&amp;gt;/controls_signalduino.txt&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax. Ebenso wird auch vorgegangen wenn der SIGNALduino beispielsweise über ser2net freigeben wird.&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
Wenn ein miniCUL geflasht werden soll, sind einige Besonderheiten zu beachten. Details dazu in {{Link2Forum|Topic=114413|LinkText=diesem Forenthema}}.&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in  nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Die Version 3.4 ist die aktuell stabile Version.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te|Unterstützte Geräte]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl im Modul direkt ausgeführt werden können. Sofern möglich, sollten die Abfrage von Werten aus dem Modul allerdings mit den dafür vorgesehenen Kommandos erfolgen, da die Rückmeldungen des &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehls nur im Logfile ab Verbose 4 erscheinen. Die Befehle sind nützlich, wenn direkt auf den Microcontroller zugegriffen wird: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: &amp;lt;code&amp;gt;set raw C35&amp;lt;/code&amp;gt; führt ab Verbose 4 zu einer Logausgabe folgender Art  &amp;lt;code&amp;gt;Read, msg: C35 = 0D&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2 des CC1101)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33061</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33061"/>
		<updated>2020-04-10T21:33:46Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Fehlerbehandlung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in  nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2020) ist noch die Version 3.3.1 fertig. Die Version 3.4 ist seit Februar 2020 in einer Vorabversion verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl im Modul direkt ausgeführt werden können. Sofern möglich, sollten die Abfrage von Werten aus dem Modul allerdings mit den dafür vorgesehenen Kommandos erfolgen, da die Rückmeldungen des &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehls nur im Logfile ab Verbose 4 erscheinen. Die Befehle sind nützlich, wenn direkt auf den Microcontroller zugegriffen wird: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: &amp;lt;code&amp;gt;set raw C35&amp;lt;/code&amp;gt; führt ab Verbose 4 zu einer Logausgabe folgender Art  &amp;lt;code&amp;gt;Read, msg: C35 = 0D&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2 des CC1101)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33060</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33060"/>
		<updated>2020-04-10T21:05:57Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Fehlerbehandlung */ C35 Befehl korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in  nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2020) ist noch die Version 3.3.1 fertig. Die Version 3.4 ist seit Februar 2020 in einer Vorabversion verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: &amp;lt;code&amp;gt;set raw C35&amp;lt;/code&amp;gt; führt zu einer Logausgabe folgender Art  &amp;lt;code&amp;gt;Read, msg: C35 = 0D&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2 des CC1101) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33059</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33059"/>
		<updated>2020-04-10T20:01:19Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Fehlerbehandlung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in  nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2020) ist noch die Version 3.3.1 fertig. Die Version 3.4 ist seit Februar 2020 in einer Vorabversion verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: &amp;lt;code&amp;gt;set raw 35&amp;lt;/code&amp;gt; könnte zu folgender Ausgabe führen C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33058</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33058"/>
		<updated>2020-04-10T19:43:43Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Mein Gerät wird in FHEM nicht erkannt */ Link auf Github issue konkretisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in  nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2020) ist noch die Version 3.3.1 fertig. Die Version 3.4 ist seit Februar 2020 in einer Vorabversion verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues/new?template=sensor---device-feature.md github]:&amp;lt;syntaxhighlight lang=&amp;quot;md&amp;quot;&amp;gt;&lt;br /&gt;
##  Specifications for new sensor / switch / or other device ... &lt;br /&gt;
&lt;br /&gt;
  - manufacturer:&lt;br /&gt;
  - model name:&lt;br /&gt;
  - pictures of the device / the board (very helpful)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
## Specifications &lt;br /&gt;
&lt;br /&gt;
  - Microcontroller:&lt;br /&gt;
  - Version (Firmware):&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;!-- ( can be found here devicename -&amp;gt; Internals -&amp;gt; version ) --&amp;gt;&lt;br /&gt;
  - Versionmodul (FHEM Module):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;70 Protokolle implementiert. Jedoch gibt es nicht immer ein logisches Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33057</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33057"/>
		<updated>2020-04-10T19:40:18Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Flashen des Arduino mit der SIGNALduino Firmware */  Versionsreferenzen aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. &lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in  nicht mehr über den FHEM Update Mechanismus verteilt. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP aus den Github Releases geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2020) ist noch die Version 3.3.1 fertig. Die Version 3.4 ist seit Februar 2020 in einer Vorabversion verfügbar.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_radinocc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 &lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash &amp;lt;/code&amp;gt;https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1/SIGNALDuino_ESP8266cc11013.3.1.hex&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN nach Eingabe der Daten verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&#039;&#039;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33056</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33056"/>
		<updated>2020-04-10T19:15:23Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Fehlerbehandlung */ Korrektur Befehl zum Abfragen der Sendeleistung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. Derzeit ist nur testing verfügbar:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&#039;&#039;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccpatable&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33055</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33055"/>
		<updated>2020-04-10T12:17:25Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Kleine Korrekturen / Schreibweise / Bezeichnungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.2 seit 08.04.2020 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. Derzeit ist nur testing verfügbar:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Hauptseite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&#039;&#039;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33054</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33054"/>
		<updated>2020-04-10T12:14:48Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Entwicklungsversion */  Bezeichnung der Version korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die offizielle Version wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben. Es existieren im Forum diverse angepasste Versionen, auf die hier nicht näher eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.0 seit 20.07.2019 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. Derzeit ist nur testing verfügbar:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Haupt-Seite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&#039;&#039;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33053</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33053"/>
		<updated>2020-04-10T12:13:17Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Entwicklungsversion */ Korrektur Versionsverweis, Fork wegen Verwirrung entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die Version von Sidey wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.0 seit 20.07.2019 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. Derzeit ist nur testing verfügbar:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Haupt-Seite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&#039;&#039;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33052</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33052"/>
		<updated>2020-04-10T12:12:13Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Fehlerbehandlung */ Formatierung angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die Version von Sidey wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
Es existiert eine weitere Entwicklungsversion, siehe dazu die {{Link2Forum|Topic=82379|Message=744554|LinkText= Firmware}} (hierzu gibt es auch eine private Version des [https://github.com/Ralf9/RFFHEM/issues/2 Moduls]).&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.0 seit 20.07.2019 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. Derzeit ist nur testing verfügbar:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Haupt-Seite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&#039;&#039;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers. Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33051</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=33051"/>
		<updated>2020-04-10T12:09:36Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Fehlerbehandlung */  Befehle aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die Version von Sidey wird {{Link2Forum|Topic=58396|LinkText=hier}} genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
Es existiert eine weitere Entwicklungsversion, siehe dazu die {{Link2Forum|Topic=82379|Message=744554|LinkText= Firmware}} (hierzu gibt es auch eine private Version des [https://github.com/Ralf9/RFFHEM/issues/2 Moduls]).&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Bei Einbindung via ESP muss man beachten, dass der ESP nach 5 Minuten Inaktivität seine TCP-Verbindung unterbricht (siehe [[ESP8266#Bekannte_Probleme|diesen Hinweis]]). Zu diesem Zweck gibt es einen Signalduino-eigenen Ping-Befehl (&#039;get signalduino ping&#039;), der diese Aktivität wieder aufbaut. Ping-Befehle sind auch auf Betriebssystemebene bekannt - allerdings beachte man, dass der ping-Befehl auf Betriebssystemebene ICMP verwendet, zum &amp;quot;aufwachen&amp;quot; des ESP aber auf TCP-Ebene aktiviert werden muss (zum Unterschied siehe [https://www.tippscout.de/internet-was-sind-tcp-ip-udp-und-icmp_tipp_2268.html hier]) und man daher besser den Signalduino-eigenen Befehl und nicht das Betriebssystem verwendet.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht  dem [[Selbstbau_CUL]] (eine frühere Version ist der nicht mehr weiterentwickelte [[FHEMduino]]):&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]]. Dieser Aufbau wird derzeit empfohlen.&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{| |&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.0 seit 20.07.2019 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. Die Baudrate beim SIGNALduino beträgt 57600 - via telnet muss dann dieselbe Baudrate eingestellt werden. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. Derzeit ist nur testing verfügbar:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Haupt-Seite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|CTW602||E ||neuere Version des CTW600 mit 868.35 MHz || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF / FA22RF Rauchmelder||E || || FLAMINGO || 13,13.1,13.2&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&#039;&#039;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!}}&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort {{Link2Forum|Topic=58397|Message=775434|LinkText=Signalduino Version 3.3.1}}, wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;set raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
Ob ein solcher Reset nötig ist, erkennt man an dem Inhalt vom Reading &amp;lt;code&amp;gt;cc1101_config&amp;lt;/code&amp;gt;, dort unsinnige Werte angezeigt werden oder dem Reading  &amp;lt;code&amp;gt;config&amp;lt;/code&amp;gt; welches durch den Befehl &amp;quot;get config&amp;quot; aktualisiert wird, was im Standard auf &amp;quot;MS=1;MU=1;MC=1&amp;quot; entspricht.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die diverse Befehle eingebaut, welche über einen &amp;lt;code&amp;gt;set raw&amp;lt;/code&amp;gt; Befehl direkt ausgeführt werden können. Sofern möglich, sollten die Set Befehle aus dem Modul verwendet werden. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt; &amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;XX&amp;gt;&amp;lt;/code&amp;gt; Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2) &lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=82379|Message=1033374|LinkText=SIGNALDuino Schaltplan}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=31018</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=31018"/>
		<updated>2019-07-19T18:08:19Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* FHEM-Modul laden */  SVN Version aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungsversion ===&lt;br /&gt;
Der SIGNALduino wird derzeit aktiv weiterentwickelt, siehe dazu https://github.com/RFD-FHEM. Die Version von Sidey wird [https://forum.fhem.de/index.php/topic,58396.0.html hier ]genauer beschrieben.&lt;br /&gt;
&lt;br /&gt;
Es existiert eine weitere Entwicklungsversion, siehe dazu die [https://forum.fhem.de/index.php/topic,82379.msg744554.html#msg744554 Firmware] (hierzu gibt es auch eine private Version des [https://github.com/Ralf9/RFFHEM/issues/2 Moduls]).&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sendemodule ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.4.0 seit 20.07.2019 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.x) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann muss mitgeteilt werden, welche Version man geladen haben will: stable oder testing. Derzeit ist nur testing verfügbar:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino updateChannelFW testing&amp;lt;/code&amp;gt;&lt;br /&gt;
Nun wird die entsprechende Firmware heruntergeladen. Dies geschieht durch den Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino availableFirmware&amp;lt;/code&amp;gt;&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;und-dann-auswaehlen&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Haupt-Seite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=29655</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=29655"/>
		<updated>2019-02-26T20:10:47Z</updated>

		<summary type="html">&lt;p&gt;Sidey: URL zur development Version aktualisiert, Anpassungen durch das Update des Modules am 20.02.2019&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben. Aktuell wird dort die Version 3.3.4 seit 24.02.2019 verteilt.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version (3.4.0) kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r34/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware seit 21.02.2019 auch direkt downloaden und teilweise flashen. &lt;br /&gt;
Dazu muss das Attribut hardware auf einen gültigen Wert angepasst werden!&lt;br /&gt;
Über den GET Befehl availableFirmware werden dann für die hinterlegte Hardware die passenden Versionen gesucht. Über das Attribut updateChannelFW kann zwischen &amp;quot;stable&amp;quot; und &amp;quot;testing&amp;quot; definiert werden, welche Art von Firmware angeboten werden soll.&lt;br /&gt;
&lt;br /&gt;
Nachdem die Firmwareversion erfragt wurde, bietet der set flash Befehl eine Auswahlliste an. Wird ein Flash Befehl mit einer der Versionen ausgewählt, wird diese Version zunächst heruntergeladen und bei den AVR Versionen auch versucht diese mittels avrdude zu flashen.&lt;br /&gt;
Die Firmware für den ESP8266 kann aktuell leider noch nicht über diesen Befehl aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ funktioniert aber auch die Option, dem Flash Befehl eine URL zu übergeben. Dann wird die Datei aus der URL heruntergeladen und auch versucht diese zu Flashen. z.B.&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
Auch ist zu beachten, es handelt sich hierbei tatsächlich um ein Binary und nicht um ein Hex File. &lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Haupt-Seite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
Dort kann auch eine Änderungshistorie eingesehen werden.&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht seit 21.02.2019 nun auch in der via FHEM aktualisierten version zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
Weiterhin ist zu beachten, dass der Bootloader eine andere USB ID bekommt und diese im Attribut flashCommand hinterlegt werden muss.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist. In der detaillierten Liste [[Geprüfte_Geräte]] lassen sich die Geräte näher identifizieren.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=29475</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=29475"/>
		<updated>2019-02-11T11:12:28Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Vorabversion einer Firmware */  URL für SignalESP firmware aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Viele user berichten über Empfangsprobleme bei Nutzung des XY-MK-5V; es wird ausdrücklich empfohlen, ein anderes Empfangsmodul zu nutzen!}}&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer FHEM-Modul Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanorelease.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_prominirelease.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_miniculcc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_radinocc1101release.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_.hex (mit cc1101) für einen ESP8266 und 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/nightly/SIGNALDuino_ESP8266cc1101nightly.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Haupt-Seite für Firmware-Releases findet sich unter https://github.com/RFD-FHEM/SIGNALDuino/releases/ .&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|Conrad Wetterstation KW9110||E S||Sensor: KW9010, neben Temperatur u. Luftfeuchte werden auch Trend, Batterie u. Kanal erfasst|| CUL_TCM97001  || 0.3&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=28509</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=28509"/>
		<updated>2018-11-24T18:36:37Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Fehlersuche nach dem Flashen ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer FHEM-Modul Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc4.bin (mit cc1101) für einen ESP8266 mit 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALESP/releases/download/3.3.1RC4/SIGNALESP_331RC4_1M.bin&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Fehler beim Flashen ====&lt;br /&gt;
Sollte bei einem Flash Vorgang ein Fehler auftreten, solltet ihr zunächst im Logfile mit Verbose 5 nachsehen.&lt;br /&gt;
&lt;br /&gt;
Findet ihr dort keine Fehlermeldung, gibt es noch ein separates Flashlog, welches ihr über einen Browser aufrufen könnt. Dazu müsst ihr nur den Folgenden Pfad an euren Servernamen anhängen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/fhem/FileLog_logWrapper?dev=Logfile&amp;amp;type=text&amp;amp;file=SIGNALduino-Flash.log&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=28508</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=28508"/>
		<updated>2018-11-24T18:22:31Z</updated>

		<summary type="html">&lt;p&gt;Sidey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer FHEM-Modul Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC10/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc4.bin (mit cc1101) für einen ESP8266 mit 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALESP/releases/download/3.3.1RC4/SIGNALESP_331RC4_1M.bin&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Im Forum solltet ihr solche Fragen besser nicht posten, wenn das Gerät noch nicht unterstützt wird, dazu ist Github besser geeignet. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=28387</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=28387"/>
		<updated>2018-11-16T22:13:22Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* FHEM-Modul laden */   Aktualisierung von Modul und Firmware angepasst.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet.&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduino geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (November 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer FHEM-Modul Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC9/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC9/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC9/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC9/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC9/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc4.bin (mit cc1101) für einen ESP8266 mit 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALESP/releases/download/3.3.1RC4/SIGNALESP_331RC4_1M.bin&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für &#039;&#039;Funksteckdose&#039;&#039; (also sauber per-Client-Instanz-spezifisch, NICHT SIGNALduino-Transceiver-global) das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Inzwischen wurde im Wiki eine eigene Seite eröffnet, die sich mit der Erkennung unbekannter Protokolle beschäftigt: [[Unbekannte_Funkprotokolle#Ansatz_1_-_Versuchen|Unbekannte_Funkprotokolle]].&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log (und, insbesondere, im FHEMWEB Event Monitor) tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu Teilen wissen, da er sich ändert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
Als Alternative zu DOIF hier ein regex-verwendendes notify-Beispiel für einen Sender, der meint, zwei Codes alternierend senden zu müssen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define n_sender_trigger notify sduino:UNKNOWNCODE.*u41#(13B72253|163873B3) { my_sender_trigger_indicate();; }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selbstverfreilich muss in diesem Moment auch eine sub my_sender_trigger_indicate() definiert werden (z.B. in FHEM/99_myUtils.pm), die dort z.B. als Test eine Log-Ausgabe (Log3()) machen kann.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
UPDATE: der folgende Bereich ist von einem weniger erfahrenen Zeitgenossen früher nach Kräften erweitert/geschrieben worden. Mittlerweile existiert aber ein neuer Inhalt [[Unbekannte_Funkprotokolle]] (siehe auch Erwähnung weiter oben), der als sehr gut beschrieben und unvergleichlich detailreicher bezeichnet werden muss (&amp;quot;endlich gibt es sowas!&amp;quot;). Der Bereich hier dürfte somit zwar für grundlegende Verdeutlichungen noch recht sinnvoll sein, der Inhalt sollte allerdings evt. in eine konsistente Dokumentation überarbeitet (verlagert/dedupliziert/reduziert) werden.&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Die Abfolge ist also ganz klar:&#039;&#039;&#039;&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; &#039;&#039;generische/zentrale&#039;&#039; Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices.&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HomeMatic_HMInfo_TempList/Weekplan&amp;diff=27950</id>
		<title>HomeMatic HMInfo TempList/Weekplan</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HomeMatic_HMInfo_TempList/Weekplan&amp;diff=27950"/>
		<updated>2018-09-29T21:21:05Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Files in externe Dateien übersetzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Behandlung von Wochenprogrammen für Thermostate&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModCmdRef=HMinfo Weekplan&lt;br /&gt;
|ModForumArea=HomeMatic&lt;br /&gt;
|ModTechName=98_HMinfo.pm&lt;br /&gt;
|ModOwner=martinp876 ({{Link2FU|251|martinp876}} / [[Benutzer Diskussion:Martinp876|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HMInfo TempList&#039;&#039;&#039; ist eine Funktion des Moduls [[Homematic_HMInfo|HMInfo]], die es erlaubt Temperaturlisten (Wochenprogramme) von [[HomeMatic Type Thermostat|Thermostaten]] zu verwalten.  &lt;br /&gt;
&lt;br /&gt;
== Einleitung== &lt;br /&gt;
Homematic bietet eine Reihe von Heizkörperthermostaten, welche mit einem Wochenprogramm ausgestattet sind. Die Erstellung und Verwaltung dieser Wochenprogramme ist im Device zumindest umständlich, siehe dazu [[HomeMatic_Type_Thermostat#Templates]]&lt;br /&gt;
== Begriffe==&lt;br /&gt;
Wir müssen strikt 3 Wochenpläne unterscheiden:&lt;br /&gt;
* &#039;&#039;activeList&#039;&#039; Wochenplan im Device. Dieser, und nur dieser ist &#039;&#039;&#039;wirksam&#039;&#039;&#039;. Er kann nicht direkt in FHEM dargestellt werden. FHEM muss die Daten auslesen um sie verarbeiten zu können. Siehe hierzu kommandos und attribute des Device:getConfig und autoReadReg. &lt;br /&gt;
* &#039;&#039;referenceList&#039;&#039; Wochenplan in FHEM. Für jedes Device wird ein Wochenplan (bei einigen Devices können es sogar mehrere sein) dargestellt. Dies ist die aus dem Device gelesene activeList. Es liegt in der Verantwortung des User, die Liste aktuell zu halten. &lt;br /&gt;
* &#039;&#039;tempTemplates&#039;&#039; Vorlagen für Wochenpläne. Diese werden in externen Dateien erstellt. Man kann Devices eines der tempTemplates zuweisen um es zu prüfen oder einzuspielen.&lt;br /&gt;
&lt;br /&gt;
== Wochenprogramme ==&lt;br /&gt;
=== Datei ===&lt;br /&gt;
Zur Verwendung einer Temperaturliste als Wochenprogramm muss eine Datei erzeugt werden, mit folgendem Inhalt:&lt;br /&gt;
* Für jede Temperaturliste eine Namensliste in der Form &amp;lt;code&amp;gt;entities:&amp;lt;name1&amp;gt;,&amp;lt;name2&amp;gt;,...&amp;lt;/code&amp;gt;&lt;br /&gt;
** ein Name darf in einer Datei &#039;&#039;&#039;nicht&#039;&#039;&#039; doppelt vorkommen. &lt;br /&gt;
** der gleiche Name darf in unterschiedlichen Dateien verwendet werden.&lt;br /&gt;
* In jeder Temperaturliste eine Zeile pro Tag, beginnend mit &amp;lt;code&amp;gt;tempList&amp;lt;Wochtentag&amp;gt;&amp;gt; ....&amp;lt;/code&amp;gt;&lt;br /&gt;
** Es muss eine Zeile je Wochentag vorhanden sein&lt;br /&gt;
* In jeder Zeile nach dem Wochentagscode eine Liste von Zeit/Wert-Paaren, diese stellen das jeweilige Tagesprogramm dar, z.B. &#039;&#039;&#039;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&#039;&#039;&#039;,&lt;br /&gt;
** Jedes Tagesprogramm beginnt um 00:00 Uhr. &lt;br /&gt;
** Das erste Paar 08:00 14.0 bedeutet also, dass von 00:00 bis 08:00 eine Temperatur von 14.0 eingestellt werden soll. &lt;br /&gt;
** Das zweite Paar 15:00 18.0 bedeutet also, dass von 08:00 bis 15:00 18.0 Grad einzustellen sind&lt;br /&gt;
** Es sind immer Paare einzutragen&lt;br /&gt;
** der Beginn um 00:00 ist nicht einzutragen&lt;br /&gt;
** der letzte Eintrag &#039;&#039;&#039;muss&#039;&#039;&#039; an jeden Tag 24:00 sein&lt;br /&gt;
** Uhrzeiten sind auf halbe Stunden beschränkt. Einträge 08:00 und 08:30 sind gültig. 08:20 ist ungültig.&lt;br /&gt;
Beispiel:&lt;br /&gt;
 entities:tempTmpl1&lt;br /&gt;
 R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
 R_1_tempListSun&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 17.0&lt;br /&gt;
 R_2_tempListMon&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_3_tempListTue&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0&lt;br /&gt;
 R_4_tempListWed&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_5_tempListThu&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_6_tempListFri&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 entities:tempTWohnzimmer&lt;br /&gt;
 R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 17.0&lt;br /&gt;
 R_1_tempListSun&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
 R_2_tempListMon&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_3_tempListTue&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 15.0&lt;br /&gt;
 R_4_tempListWed&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_5_tempListThu&amp;gt;07:00 14.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 R_6_tempListFri&amp;gt;07:00 14.0 13:00 16.0 16:00 18.0 21:00 19.0 24:00 14.0&lt;br /&gt;
 &lt;br /&gt;
==== Erstellen der ersten Template-Datei====&lt;br /&gt;
Um nicht auf der grünen Wiese beginnen zu müssen, empfiehlt es sich den aktuellen Ist-Zustand (die &#039;&#039;referenceList&#039;&#039;) mit dem unten beschriebenen HMInfo-Befehl &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; in eine Datei zu schreiben. Vorab sollten die HMInfo-Attribute &amp;lt;code&amp;gt;configDir&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;configTempFile&amp;lt;/code&amp;gt; gesetzt sein.&lt;br /&gt;
 attr &amp;lt;HMInfo&amp;gt; configDir setup&lt;br /&gt;
 attr &amp;lt;HMInfo&amp;gt; configTempFile myWeekplan.cfg&lt;br /&gt;
 set &amp;lt;HMInfo&amp;gt; tempList save&lt;br /&gt;
Der letzte Befehl speichert die &#039;&#039;referenceList&#039;&#039; jedes Gerätz in der Datei &amp;lt;code&amp;gt;setup/myWeekplan.cfg&amp;lt;/code&amp;gt;. Als &#039;&#039;Entity&#039;&#039; wird der Name des Thermostaten verwendet – das Attribut &#039;&#039;tempListTmpl&#039;&#039; wird nicht beachtet. Die Datei kann anschließend mit einem Text-Editor bearbeitet werden. Wochenpläne können zusammengefasst und verändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Templates zuweisen===&lt;br /&gt;
tempListTemplates werden immer in Files verwaltet. Man kann Templates in mehreren Files verwalten. Ferner gibt es unterschiedliche Methoden, ein File zu spezifizieren. &lt;br /&gt;
* &#039;&#039;&#039;attr tempListTmpl im Device&#039;&#039;&#039;: hier spezifiziert man das Template. Will man sich von templates entkoppeln sollte man &#039;&#039;&#039;tempListTmpl none&#039;&#039;&#039; unbedingt setzen.&lt;br /&gt;
** &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im default File gesucht&lt;br /&gt;
** &#039;&#039;&#039;myWeekplan.cfg:Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im File &#039;&#039;myWeekplan.cfg&#039;&#039; mit relativen Pfad von FHEM home gesucht&lt;br /&gt;
** &#039;&#039;&#039;./setup/myWeekplan.cfg:Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im File &#039;&#039;myWeekplan.cfg&#039;&#039; mit relativen Pfad &#039;&#039;./setup&#039;&#039; gesucht&lt;br /&gt;
** &#039;&#039;&#039;/opt/fhem/myWeekplan.cfg:Wohnzimmer&#039;&#039;&#039;: das template &#039;&#039;&#039;Wohnzimmer&#039;&#039;&#039; wird im File &#039;&#039;myWeekplan.cfg&#039;&#039; mit absoluten Pfad &#039;&#039;/opt/fhem/&#039;&#039; gesucht&lt;br /&gt;
* &#039;&#039;&#039;attr configTempFile in HMInfo&#039;&#039;&#039;: spezifiziert weekplan configurationsfiles. Es ist eine Liste Wochenplan Files welche genutzt werden. Ist das Attribut nicht gesetzt wird als &#039;&#039;default tempList.cfg&#039;&#039; genutzt.&lt;br /&gt;
**  &#039;&#039;&#039;attr hm configTempFile myWeekPlan.cfg&#039;&#039;&#039;: FHEM kennt ein File mit Wochenplan. Dies ist auch das Default für alle tempListTmpl in denen kein File spezifiziert. &lt;br /&gt;
**  &#039;&#039;&#039;attr hm configTempFile mySummerPlan.cfg,myWinterPlan.cfg,myPartyPlan.cfg&#039;&#039;&#039;: FHEM sind 3 Files bekannt. Der erste Eintrag &#039;&#039;mySummerPlan.cfg&#039;&#039; ist der Default für tempListTmpl .&lt;br /&gt;
* &#039;&#039;&#039;attr configDir in HMInfo&#039;&#039;&#039;: spezifiziert einen Pfad, der &#039;&#039;auch&#039;&#039; für configTemplFile genutzt wird. Es erleichtert Konfigurations-Dateien in einem separaten Verzeichnis anzulegen. &#039;&#039;attr hm configDir setup&#039;&#039; wäre ein sinnvoller Eintrag. Das Verzeichnis &#039;&#039;setup&#039;&#039; unter fhem sollte erstellt werden. Ist das Attribut nicht gesetzt ist fhemHome der default.&lt;br /&gt;
&lt;br /&gt;
=== HMInfo Kommandos ===&lt;br /&gt;
Die HMInfo-Befehle, die Temperaturlisten verwalten, folgen dem Schema:&lt;br /&gt;
  set &amp;lt;HMInfo&amp;gt; tempList &amp;lt;Befehl&amp;gt; [&amp;lt;Dateiname&amp;gt;]&lt;br /&gt;
Die verfügbaren Befehle sind:&lt;br /&gt;
; &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt;&lt;br /&gt;
: Speichert den aktuellen Zustand der Thermostate (&#039;&#039;referenceList&#039;&#039;) in der &#039;&#039;tempList&#039;&#039;-Datei ab. Zu beachten ist, dass die aktuell in FHEM vorhandenen Werte benutzt werden. Der Benutzer muss selbst sicher stellen, dass diese mit den Werten im Gerät übereinstimmen. Alle eventuell vorher in der Datei vorhandenen Werte werden überschrieben.&lt;br /&gt;
; &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt;&lt;br /&gt;
: Vergleicht den Ist-Zustand (&#039;&#039;referenceList&#039;&#039;) mit dem Soll-Zustand (dem Wochenplan aus dem &#039;&#039;tempListTmpl&#039;&#039;-Attribut). Abweichungen werden angezeigt, aber nicht behoben. Diese Prüfung ist auch Teil von HMInfos &amp;lt;code&amp;gt;configCheck&amp;lt;/code&amp;gt;.&lt;br /&gt;
; &amp;lt;code&amp;gt;restore&amp;lt;/code&amp;gt;&lt;br /&gt;
: Stellt den Soll-Zustand wieder her. Funktioniert im Prinzip wie &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt;, jedoch werden alle Abweichungen vom Soll-Zustand korrigiert. Zu beachten ist die Verzögerung beim Schreiben (siehe [[HomeMatic HMInfo#protoEvents|HMInfo protoEvents]], Device Status und Beschreibung des Device) und dass nach dem Schreiben die &#039;&#039;referenceList&#039;&#039; neu geladen werden muss. Es wird empfohlen, &amp;lt;code&amp;gt;autoReadReg&amp;lt;/code&amp;gt; auf Level&amp;amp;nbsp;5 zu setzen. Ein Restore kann jederzeit ausgeführt werden. Sind alle Daten aktuell, wird &#039;&#039;keine&#039;&#039; Temperaturliste geschrieben; es erfolgt keinerlei Funkverkehr. &lt;br /&gt;
; &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;&lt;br /&gt;
: Gibt eine Übersicht über die genutzten Templates aus.&lt;br /&gt;
&lt;br /&gt;
Das Web-Frontend verwendet den nahezu identischen Befehl &amp;lt;code&amp;gt;tempListG&amp;lt;/code&amp;gt;. Da dieser Befehl keine weiteren Argumente zulässt kann das Frontend ein Pulldown-Menü anzeigen. Das &amp;quot;G&amp;quot; steht für &amp;quot;Global&amp;quot; – da keine Filter unterstützt werden, wirken alle Befehle auf alle HomeMatic-Geräte.&lt;br /&gt;
&lt;br /&gt;
==Nutzungsbeispiele==&lt;br /&gt;
=== Mehrere Heizkörper in einem Raum===&lt;br /&gt;
Wenn sich in einem Raum mehrere Heizkörperthermostate befinden, sollten diese –&amp;amp;nbsp;wie in [[HM-CC-RT-DN]] beschrieben&amp;amp;nbsp;– gepeert werden.&lt;br /&gt;
HomeMatic geht davon aus, dass alle HM-CC-RT-DNs den selben Wochenplan haben (gilt ggf. auch für einen zugehörigen [[HM-TC-IT-WM-W-EU]]).&lt;br /&gt;
&lt;br /&gt;
Um dies zu erreichen definiert man einen Wochenplan für das Zimmer, beispielsweise &amp;lt;code&amp;gt;Wohnzimmer.cfg&amp;lt;/code&amp;gt;. Anschließend wird dieser Wochenplan allen Teammitgliedern zugewiesen:&lt;br /&gt;
&lt;br /&gt;
  attr &amp;lt;HM-CC-RT-DN#1&amp;gt;_Clima tempListTmpl Wohnzimmer&lt;br /&gt;
  attr &amp;lt;HM-CC-RT-DN#2&amp;gt;_Clima tempListTmpl Wohnzimmer&lt;br /&gt;
  attr &amp;lt;HM-CC-RT-DN#3&amp;gt;_Clima tempListTmpl Wohnzimmer&lt;br /&gt;
  attr &amp;lt;HM-TC-IT-WM-W-EU&amp;gt;_Climate tempListTmpl Wohnzimmer&lt;br /&gt;
  set hm tempListG restore&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Heizkörper mit gleichen Profil===&lt;br /&gt;
Will man Wohnräume identisch behandeln im Hinblick auf den Wochenplan weisst man den Thermostaten identische Profile zu. &lt;br /&gt;
&lt;br /&gt;
 attr RTSusi_Clima tempListTmpl Kinderzimmer&lt;br /&gt;
 attr RTjonas_Clima tempListTmpl Kinderzimmer&lt;br /&gt;
 attr RTwohnzimmer_Clima tempListTmpl Kinderzimmer&lt;br /&gt;
 set hm tempListG restore&lt;br /&gt;
=== Wohnungsnutzung umschalten===&lt;br /&gt;
Das Heizprofil kann man Zentral umstellen. Verlässt man die Wohnung zum Urlaub, der Sommer naht, man macht die üblich 3-Woche Party... . Alle Thermostate sollen umgestellt werden, zentral mit wenigen Kommandos, einfach zu prüfen. Sinnvoll ist es mehrere tempList.cfg Files anzulegen. Nehmen wir 4 Files an, Winter, Urlaub zu hause UrlaubIn, Urlaub nicht zu hause UrlaubOut sowie Sommer. Ferner hat man (der Einfachheit halber) 3 RTs: RTwohn, RTschlaf, RTkueche. &lt;br /&gt;
Die RTs haben jeweils ihr attr tempListTmpl gesetzt entsprechend ihrem Namen. &lt;br /&gt;
Man legt also die 4 Files an mit entities die man zusammenfassen kann (templisten muss man natürlich befüllen:&lt;br /&gt;
 File Winter.cfg&lt;br /&gt;
  entity: RTwohn&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
  entity: RTschlaf&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
  entity: RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
 File UrlaubIn.cfg&lt;br /&gt;
  entity: RTwohn,RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
  entity: RTschlaf&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
 File UrlaubOut.cfg&lt;br /&gt;
  entity: RTwohn,RTschlaf,RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
 File Sommer.cfg&lt;br /&gt;
  entity: RTwohn,RTschlaf,RTkueche&lt;br /&gt;
   R_0_tempListSat&amp;gt;08:00 14.0 15:00 18.0 21:30 19.0 24:00 14.0&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
In HMInfo sollte man nun verwalten:&lt;br /&gt;
 attr RTwohn_Clima tempListTmpl RTwohn&lt;br /&gt;
 attr RTkueche_Clima tempListTmpl RTkueche&lt;br /&gt;
 attr RTschlaf_Clima tempListTmpl RTschlaf&lt;br /&gt;
 attr hm configTempFile Winter.cfg,Sommer.cfg,UrlaubIn.cfg,UrlaubOut.cfg&lt;br /&gt;
&lt;br /&gt;
Winter.cfg ist nun default. Mit set hm tempListG verify kann man prüfen, dass es entsprechend genutzt ist. Nun will man in Urlaub fahren. Man schaltet das Default durch umstellen der Reihenfolge um und aktiviert es durch ein restore:&lt;br /&gt;
 attr hm configTempFile UrlaubOut.cfg,Winter.cfg,Sommer.cfg,UrlaubIn.cfg&lt;br /&gt;
 set hm tempListG restore&lt;br /&gt;
&lt;br /&gt;
UrlaubOut.cfg ist default. Alle notwendigen Änderungen werden in die RTs programmiert.&lt;br /&gt;
Unberührt bleibt Opas Zimmer, der nicht das default file sondern ein dediziertes nutzt.&lt;br /&gt;
&lt;br /&gt;
  attr RTopa_Clima tempListTmpl Winter.cfg:RTopa&lt;br /&gt;
&lt;br /&gt;
Das template RTopa muss also nur im File Winter.cfg vorhanden sein:&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic supportDevice]]&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=27162</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=27162"/>
		<updated>2018-06-16T22:42:26Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Syntax Korrektur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Juni 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer FHEM-Modul Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc4.bin (mit cc1101) für einen ESP8266 mit 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALESP/releases/download/3.3.1RC4/SIGNALESP_331RC4_1M.bin&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices. VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=27161</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=27161"/>
		<updated>2018-06-16T22:38:58Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Firmware Versionen aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
* Solltet Ihr einen SIGNALESP via IP einbinden wollen ist die Syntax&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALESP-Name&amp;gt; SIGNALduino &amp;lt;ip-adresse&amp;gt;:23&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Juni 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer FHEM-Modul Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC7/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc4.bin (mit cc1101) für einen ESP8266 mit 1 MB Flash&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://github.com/RFD-FHEM/SIGNALESP/releases/download/3.3.1RC4/SIGNALESP_331RC4_1M.bin&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. [https://github.com/nodemcu/nodemcu-flasher|ESP8266Flasher.exe] oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
Bitte Geräte mit sehr präzisen Referenzen hier listen (Produktnummer, Protokoll-Variantenname etc.), damit eine globale Suche/Verifikation maximal erfolgreich ist.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares RM174RF/2 (RM174RF-001CPR) 4500177571 ||E [S?]|| IT EV1527; TODO herausfinden: Alarmierung (wie Alarmton getriggered werden kann); Batterieinfo? || IT || 3&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
====Fehlersuche====&lt;br /&gt;
&lt;br /&gt;
(Zielgerät reagiert nicht, etc.)&lt;br /&gt;
&lt;br /&gt;
* Nachrichtenwiederholungsanzahl muss evt. für manche Geräte entsprechend groß eingestellt sein&lt;br /&gt;
* Sende-Takt-Wert (Clock) passt evt. nicht ganz, siehe z.B. Thread-Antwort [https://forum.fhem.de/index.php/topic,58397.msg775434.html#msg775434 Signalduino Version 3.3.1], wo für IT-Geräte ein Attribut anhand der CP= des Empfangsdaten-Logs modifiziert wird. ACHTUNG: dies kann entweder global das Internal-Attribut ITClock eines SIGNALduino-Transceiver-Devices sein, oder (viel besser da korrekt geräte-instanz-spezifische Konfiguration) das ITclock eines IT-Client-Devices. VORSICHT blöder Schreibweisen-Mismatch ITClock vs. ITclock!!&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:433MHz]]&lt;br /&gt;
[[Kategorie:868MHz]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=26901</id>
		<title>DevelopmentGuidelinesReadings</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentGuidelinesReadings&amp;diff=26901"/>
		<updated>2018-06-04T20:51:55Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Englische Übersetzung verbessert, konjunktive Form entfernt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Deutsch=&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Auf dieser Seite werden Richtlinien für Readings gesammelt, welche in mehreren Modulen auftauchen können um eine Vereinheitlichung zu erreichen. Dadurch soll es Hilfsmodulen und Anwendern leichter fallen, mit den Werten der Readings zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
== Batterie-Readings ==&lt;br /&gt;
Basierend auf dieser {{Link2Forum|Topic=87575|LinkText=Diskussion}} haben sich die Entwickler für Readings, welche in Zusammenhang mit Batterien stehen auf folgendes geeinigt:&lt;br /&gt;
Es gibt &#039;&#039;&#039;nur&#039;&#039;&#039; diese drei Readings für den Batteriestatus:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
Wertebereich:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
das jeweilige Modul setzt &#039;&#039;&#039;nur&#039;&#039;&#039; die Readings, die es aus den aktuellen Daten vom Gerät bestimmen kann. Konkret: niemand kann sich darauf verlassen, welche der drei battery Readings vorhanden sind (es gibt nicht überall ein batteryState). Wenn das Gerät früher ein Percent gemeldet hat, aber in der letzten Nachricht nur state, dann wird das Percent Reading nicht angefasst. &lt;br /&gt;
&lt;br /&gt;
=English=&lt;br /&gt;
== Start ==&lt;br /&gt;
On this page you will find guidlines how to name common readings. These guidlines are for readings which are used in more than one module and should have the same possible values. This makes it helper modules and users easier, to work with the values from common readings.&lt;br /&gt;
&lt;br /&gt;
== Battery Reading ==&lt;br /&gt;
Based on this {{Link2Forum|Topic=87575|LinkText=discussion}} battery-readings should &#039;&#039;&#039;only&#039;&#039;&#039; be named like:&lt;br /&gt;
* batteryState&lt;br /&gt;
* batteryPercent&lt;br /&gt;
* batteryVoltage&lt;br /&gt;
&lt;br /&gt;
The values should only be:&lt;br /&gt;
*batteryState: ok|low&lt;br /&gt;
*batteryPercent: \d{1,2}|100&lt;br /&gt;
*batteryVoltage: \d+.\d+&lt;br /&gt;
&lt;br /&gt;
Important: The respective module &#039;&#039;&#039;only&#039;&#039;&#039; uses the values getting from the device. This means nobody can be sure which of the readings is used in the modul (there is not everywhere a batteryState reading). If the device did send batteryPercent befor and now only sends &#039;battery: low&#039;, the batteryPercent readings stays as it was before. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25906</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25906"/>
		<updated>2018-03-11T22:25:44Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Vorabversion einer Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer FHEM-Modul Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc2.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25905</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25905"/>
		<updated>2018-03-11T22:25:23Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Vorabversion einer Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden. (Die Download Links funktionieren erst ab einer Version vom 11.03.2018!)&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc2.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25887</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25887"/>
		<updated>2018-03-10T23:35:33Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Downloadlinks für Firmware aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden.&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanocc1101.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_nanocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_nano.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini.hex für einen  promini 3,3v / 8 Mhz ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_promini.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_miniculcc1101.hex für einen promini 3,3v / 8 Mhz mit cc1101 (minicul)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_miniculcc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_radinocc1101.hex für einen radino mit cc1101 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://github.com/RFD-FHEM/SIGNALDuino/releases/download/3.3.1-RC4/SIGNALDuino_radinocc1101.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc2.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25458</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=25458"/>
		<updated>2018-02-22T22:12:18Z</updated>

		<summary type="html">&lt;p&gt;Sidey: vorabversion aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren. Die SW ist auf [https://github.com/RFD-FHEM/SIGNALDuino github]. Vorgesehen ist nur die Übersetzung unter Windows mit Visual Studio und dem Visual Micro Zusatz. Es gibt aber auch eine Anleitung, wie man mit der [[Arduino]] IDE oder einem Makefile [[SIGNALduino Compilieren]] kann.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden.&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanoCC1101-331rc2.hex für einen Nano mit CC1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1sIac8-Qhts4c7OEkFH72Lv6hhgbOadFQ&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano_331rc3.hex für einen Nano ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1FnnIjJhBI1mjxZKzMnNtnnYzHChyn0lk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini_331rc2.hex für einen promini ohne cc1101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1-AJKmO2DjQPi9_O3XI6KqvE9oYLHOyl8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc2.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.rflink.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24530</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24530"/>
		<updated>2018-01-14T19:44:22Z</updated>

		<summary type="html">&lt;p&gt;Sidey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden.&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanoCC1101-331rc2.hex für einen Nano mit CC1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1sIac8-Qhts4c7OEkFH72Lv6hhgbOadFQ&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano_331rc2.hex für einen Nano ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1FnnIjJhBI1mjxZKzMnNtnnYzHChyn0lk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini_331rc2.hex für einen promini ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1-AJKmO2DjQPi9_O3XI6KqvE9oYLHOyl8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc2.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Das Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24529</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24529"/>
		<updated>2018-01-14T19:40:59Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Vorabversion einer Firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden.&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanoCC1101-331rc2.hex für einen Nano mit CC1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1sIac8-Qhts4c7OEkFH72Lv6hhgbOadFQ&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano_331rc2.hex für einen Nano ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1FnnIjJhBI1mjxZKzMnNtnnYzHChyn0lk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini_331rc2.hex für einen promini ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1-AJKmO2DjQPi9_O3XI6KqvE9oYLHOyl8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc2.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Der Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24528</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24528"/>
		<updated>2018-01-14T19:40:35Z</updated>

		<summary type="html">&lt;p&gt;Sidey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MISO||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden.&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanoCC1101-331rc2.hex für einen Nano mit CC1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1sIac8-Qhts4c7OEkFH72Lv6hhgbOadFQ&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano_331rc2.hex für einen Nano ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1FnnIjJhBI1mjxZKzMnNtnnYzHChyn0lk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini_331rc2.hex für einen promini ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1-AJKmO2DjQPi9_O3XI6KqvE9oYLHOyl8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc1.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Der Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24516</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24516"/>
		<updated>2018-01-13T21:08:04Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* FHEM-Modul laden */  Firmware Update via HTTP inkl. Verweise zu Versionen ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MIS||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt, sobald die Änderungen einen &amp;quot;stabilen&amp;quot; und alltags tauglichen Zustand haben.&lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen einer Firmware über HTTP ====&lt;br /&gt;
Die Firmware wird in absehbarer Zeit nicht mehr über den Update Mechanismus verteilt werden. &lt;br /&gt;
Damit die passende Firmware auf den SIGNALduiono geladen werden kann, wird diese dann über HTTP geladen.&lt;br /&gt;
&lt;br /&gt;
==== Vorabversion einer Firmware ====&lt;br /&gt;
Die Firmware des SIGNALduino wird ebenso wie das FHEM Modul auch weiter entwickelt.&lt;br /&gt;
Die Entwickler sind auf Tests und Rückmeldungen der Nutzer angewiesen, da leider nicht alle Sensoren vorher getestet werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuell (Anfang 2018) ist noch die Version 3.3.1 in Entwicklung. Diese steht aktuell in einer Release Candidate Version zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Für die Folgenden Microcontroller kann man die Firmware downloaden.&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nanoCC1101-331rc2.hex für einen Nano mit CC1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1sIac8-Qhts4c7OEkFH72Lv6hhgbOadFQ&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_nano_331rc2.hex für einen Nano ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1FnnIjJhBI1mjxZKzMnNtnnYzHChyn0lk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SIGNALDuino_promini_331rc2.hex für einen promini ohne cc1101&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash https://drive.google.com/uc?export=download&amp;amp;id=1-AJKmO2DjQPi9_O3XI6KqvE9oYLHOyl8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SIGNALESP_331rc1.bin (mit cc1101) für einen ESP8266&lt;br /&gt;
&amp;lt;code&amp;gt;set ipduino flash https://drive.google.com/uc?export=download&amp;amp;id=1V8ZfLnRnskc64XZkfL-qwmI7AsSd6KRG&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
!Achtung, aktuell wird die Firmware für den ESP dadurch nur herunter geladen. Flashen müsst ihr leider immer noch über ein passendes Tool &lt;br /&gt;
z.B. &amp;quot;ESP8266Flasher.exe&amp;quot; oder Esptool und einer seriellen Konsole.&lt;br /&gt;
&lt;br /&gt;
Nach dem Booten des ESPs, spannt dieser ein eigenes WLAN auf. Habt ihr euch damit verbunden, könnt ihr den ESP mit eurem vorhandenen WLAN verbinden.&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Der Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24515</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=24515"/>
		<updated>2018-01-13T20:44:54Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Hardware */ SignalESP beschreibung um Ports ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
=== Übersicht ===&lt;br /&gt;
Unter den Namen SIGNALduino versteht man sowohl den Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]) als auch das gleichnamige Modul mit dem Dateinamen 00_SIGNALduino.pm. Mit dem SIGNALduino kann man entweder 433 oder 868 MHz-Geräte auslesen und ansprechen. Der SIGNALduino funktioniert auch mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino(-Stick) erkennt Signale anhand von Mustern und gibt sie (als maximal detaillierte Beschreibung einer Signalabfolge) dann schlicht sofort nur noch an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben.&lt;br /&gt;
Aufgabe des SIGNALduino (Firmware/Stick) ist es also nur, Signal-Aktivitäten zu erfassen und maximal präzise (als kurzer Text-String) zu beschreiben.&lt;br /&gt;
Alles weitere (echte, finale Auswertung / Zuweisung dieser Signal-Daten) wird dann auf einer großen Box (Raspberry o.ä.) gemacht.&lt;br /&gt;
&lt;br /&gt;
=== Vorteil gegenüber einem CUL/FHEMduino ===&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden (also auf flexibel direkt updatebarer Rechner-Seite!!). Änderungen am Arduino-Firmware-Code sind normalerweise nicht notwendig (sofern die grundsätzliche Signal-Klassifizierung des Sticks korrekt funktioniert - leider nicht immer, z.B.: [https://github.com/RFD-FHEM/SIGNALDuino/issues/65 MU-Nachrichten werden z.T. als MC erkannt]).&lt;br /&gt;
&lt;br /&gt;
Ein großer Vorteil des SIGNALduino besteht darin, dass auch Geräte mit leicht abweichende Frequenzen steuerbar sind; so empfangen die Somfy-Rolladenmotoren beispielsweise auf 433.42 und nicht, wie bei anderen Geräten sehr oft üblich, auf 433.92 MHz. Die Frequenzumstellung stellt für den SIGNALduino kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Ebenso kann man den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen, dabei bitte aber auf die passenden Spannungen achten, denn ein Arduino Nano verträgt nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino (Hardware) wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. &lt;br /&gt;
&lt;br /&gt;
Der SIGNALduino basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano], die Schaltung entspricht der des [[FHEMduino]] oder dem [[Selbstbau_CUL]]:&lt;br /&gt;
* Entweder wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* Oder es wird ein CC1101 Transceiver verwendet, dann ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Zuletzt gibt es ein fertig konfektioniertes Modul von In-Circuit mit Radino CC1101 Varianten, link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Achten Sie beim Selbstbau auf die entsprechenden Sender-Empfänger. Der sehr preiswert angebotene XY-MK-5V hat sich als zu unzuverlässig erwiesen, während anscheinend beim CC1101 (insbesondere der &amp;quot;grünen Version&amp;quot;) keine Probleme auftreten. &lt;br /&gt;
&lt;br /&gt;
Es stehen auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware-Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 MHz; wer einen Mikrocontroller mit 8 MHz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Es gibt auch eine Variante des SIGNALduino, die auf einem [[ESP8266]] nativ läuft, diese funktioniert seit Anfang 2018 annehmbar, allerdings befindet diese sich noch in einer Entwicklungsphase.&lt;br /&gt;
&lt;br /&gt;
An den &amp;quot;SIGNALESP&amp;quot; kann auch ein CC1101 via SPI angebunden werden:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
!CC1101 Bezeichnung&lt;br /&gt;
!ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|CLK||GPIO14&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||GPIO13&lt;br /&gt;
|-&lt;br /&gt;
|MIS||GPIO12&lt;br /&gt;
|-&lt;br /&gt;
|CSN||GPIO15&lt;br /&gt;
|-&lt;br /&gt;
|GDO0||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|GDO2||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wird ein einfacher Empfänger / Sender Kombination verwendet, dann über die PINs:&lt;br /&gt;
&lt;br /&gt;
{||&lt;br /&gt;
! Bezeichnung &lt;br /&gt;
! ESP Pin&lt;br /&gt;
|-&lt;br /&gt;
|Transmitter||GPIO4&lt;br /&gt;
|-&lt;br /&gt;
|Receiver||GPIO5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Einfache Module ===&lt;br /&gt;
&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
&lt;br /&gt;
Mit einem Arduino-Nano und folgenden, billigen Sende- und Empfangsmodulen können Sie einen SIGNALduino bauen:&lt;br /&gt;
* FS1000A Dies ist das Sendemodul (TX) und wird oft im Set mit dem billigen XY-MK-5V-Empfänger angeboten (etwa 5€). &lt;br /&gt;
* RXB6 Das ist das empfohlene Empfangsmodul (RX), statt XY-MK-5V, etwa 5€ aus Deutschland.&lt;br /&gt;
&lt;br /&gt;
Die Verkabelung erfolgt analog zum [[FHEMduino]] und das bedeutet (Arduino -&amp;gt; Modul):&lt;br /&gt;
* PIN D2 an DATA des RX-Moduls&lt;br /&gt;
* PIN D11 an DATA des TX-Moduls (PIN links mit Beschriftung ATAD)&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss noch jeweils GND und 5V des Arduino mit dem GND bzw. VCC des Moduls verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Jetzt fehlen noch die Antennen. Dafür braucht man ein 17,2 cm langes Stück Kupferdraht, das wird beim Anschluss &amp;quot;ANT&amp;quot; jeweils am Modul angelötet (anfängergeeignet).&lt;br /&gt;
&lt;br /&gt;
== Software: Modul ==&lt;br /&gt;
&lt;br /&gt;
===  USB-ID ermitteln  ===&lt;br /&gt;
Bevor der SIGNALduino mit dem FHEM Server (im Beispiel hier ein Raspberry PI) verbunden werden kann, muss die USB-Schnittstelle ermittelt werden. Hierzu bitte auf dem Terminal den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt; ls -l /dev/serial/by-id &amp;lt;/pre&amp;gt;&lt;br /&gt;
ausführen. Beispielhaft sieht das Ergebnis etwa so aus: &lt;br /&gt;
&#039;&#039;lrwxrwxrwx 1 root root 13 Jan 31 00:02 &#039;&#039;&#039;usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port&#039;&#039;&#039; -&amp;gt; ../../ttyUSB0&#039;&#039; &lt;br /&gt;
Damit ist der Anschluss des SIGNALduino bestimmt und das Gerät kann wie im nächsten Abschnitt beschrieben definiert werden. Zuvor muss noch das Modul geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM-Modul laden ===&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann mit folgenden Befehlen geladen werden:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;  Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen; im Log-File sieht man, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
*Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB-Anschlusses muss dabei an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;eigener-SIGNALduino-Name&amp;gt; SIGNALduino /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A903N5T5-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
Für neuere Entwicklungen kann in FHEM auch dauerhaft die developer Version aktualisiert werden:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update-Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgenden Beispiel-Befehle verwenden &amp;quot;sduino&amp;quot; als &amp;lt;eigener-SIGNALduino-Name&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Flashen des Arduino mit der SIGNALduino Firmware ====&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
==== Flashen eines radino Boards mit ATmega32U4 ====&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind Berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initialisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Geräteerkennung ===&lt;br /&gt;
==== Unterstützte Geräte ====&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochron eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhell HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / FA21RF Rauchmelder||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
Bei einigen Intertechno-Funksteckdosen (Brennenstuhl) kann es zu Empfangsproblemen kommen. Hier muss die Taktrate, mit der gesendet wird, angepasst werden. Dazu muss für Funksteckdose das Attribut &lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;Funksteckdose&amp;gt; ITclock 300&amp;lt;/code&amp;gt; &lt;br /&gt;
gesetzt werden, der Standardwert ist 250.&lt;br /&gt;
&lt;br /&gt;
==== Mein Gerät wird in FHEM nicht erkannt ====&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
&lt;br /&gt;
3. Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
==== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ====&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend notwendig, um seine Anforderungen zu erfüllen. Insbesondere für Schalter bzw. Sensoren, die nur zwei Zustände kennen, geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden.&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden, der Name eures SIGNALduino möglicherweise auch.&lt;br /&gt;
&lt;br /&gt;
=== Der Logfile ===&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird (verbose 3 unterdrückt diese Meldungen).&lt;br /&gt;
&lt;br /&gt;
Die Protokolle (von der SIGNALDuino-Firmware gesendete Signal-Beschreibungs-Strings) können wie folgt unterschieden werden:&lt;br /&gt;
&lt;br /&gt;
*MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt; P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal &amp;quot;1&amp;quot; also P1 mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal &amp;quot;5&amp;quot; also P5 mit 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales - der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
*MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sind nun Bemühungen, anhand der von der SIGNALDuino-Firmware gelieferten rohen aber detaillierten Signal-Strings eine Vor-Analyse / Fingerprinting vorzunehmen.&lt;br /&gt;
Man könnte nun z.B. bei solchen Fingerprinting-Analysen erkennen:&lt;br /&gt;
* dass der Basis-Takt-Wert innerhalb eines charakteristischen Zeit-Bereichs liegt&lt;br /&gt;
* dass die Anzahl der Sync-Pulse eine präzise Zahl ist&lt;br /&gt;
* dass Längen erkannter Puls-Typen innerhalb eines Bereichs liegen&lt;br /&gt;
&lt;br /&gt;
Mittels solcher Untersuchungen kann man also final hoffentlich hinreichend plausibel feststellen, &amp;quot;dass diese Aktivitäten offensichtlich(?) zu einer Funk-Komponente Rauchmelder von Hersteller XYZ gehören müssen, und man somit weiterleiten muss an ein (möglicherweise bereits existierendes) Userdaten-Dekodier-Modul für diese Herstellerkomponente&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei einer dann erfolgenden Demodulation des noch rohen SIGNALDuino-Strings könnte man z.B. (hoffentlich richtigerweise) annehmen, dass eine Signalpegel-Typ-Folge &amp;quot;13&amp;quot; eine binäre 1 bedeuten soll, während eine Folge &amp;quot;12&amp;quot; eine binäre 0 bedeuten soll. Man erhält aus dem Gesamt-Puls-String also nach vollständiger Demodulation eine Abfolge von vielen 0/1 Bits, die insgesamt ein Datenwort darstellen, mit einer gewissen Länge von NN bits (diese Längen-Angabe könnte übrigens - neben Namenssuche nach Hersteller oder Produkt etc. - ein wichtiges Such-Merkmal sein, ob andere Frameworks tatsächlich bereits wissen, wie Daten dieser Funk-Komponente zu dekodieren sind!). Dieses demodulierte Datenwort ist nun das finale Datenwort, welches einen Container für die Funk-Komponenten-Informationen darstellt (in diesem Container also beispielsweise enthalten: Temperatur, Feuchte, Akku-Status, ID, Alarm, ... - zumindest wenn nicht dummerweise der ganze Container erst einmal CRC- oder Crypto-verschlüsselt ist...).&lt;br /&gt;
&lt;br /&gt;
Man muss an dieser Stelle unbedingt sagen, dass dieses Userdaten-Datenwort (einer bestimmten Hersteller-Funk-Komponente!) natürlich bei &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen &#039;&#039;immer&#039;&#039; gleich erkannt werden &#039;&#039;muss&#039;&#039; - an dieser Stelle ist also ganz klar, dass diese Daten an &#039;&#039;allgemeine&#039;&#039; FHEM-Module weitergeleitet (Dispatched) werden müssen, die nach Übernahme von Daten von &#039;&#039;jeglichen&#039;&#039; Transceiver-Systemen diese Daten immer auf die gleiche Weise (&#039;&#039;&#039;&#039;&#039;generisch/zentral&#039;&#039;&#039;&#039;&#039;) für die jeweilige Hersteller-Funk-Komponente erledigen.&lt;br /&gt;
&lt;br /&gt;
Die Abfolge ist also ganz klar:&lt;br /&gt;
Funk-Aktivität --&amp;gt; Transceiver-Gerät/Firmware (SIGNALDuino) --&amp;gt; maximal detailreich beschreibender Rx-Analyse-Output-String --&amp;gt; Fingerprinting-Grobzuordnung des (SIGNALDuino-Firmware-)Outputs (durch 00_SIGNALduino.pm) auf gerätespezifisches Verhalten --&amp;gt; generische/zentrale Dekodierung des gerätespezifischen Protokoll-Datenworts, in zentralen Grundsatz-Modulen wie z.B. &amp;lt;code&amp;gt;14_SD_WS.pm&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Und wenn dann bei einer solchen Schritte-Abfolge irgendetwas noch fehlen/unpassend sein sollte, dann muss eben entsprechendes Development an gewissen Stellen erfolgen ;-)&lt;br /&gt;
&lt;br /&gt;
====Minimieren (whitelist/blacklist) von unerwünschter Kommunikations-Aktivität/Einträgen====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul  existiert (oder kein Weiterleitungs-Dispatch zu einem bereits existierenden), welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Derartige Einträge können mit dem Attribut WhitelistID minimiert werden. Dabei werden die Geräte, die nach Daten-Empfang tatsächlich verarbeitet werden sollen (also welche Protokolle vom FHEM Modul berücksichtigt werden), mit ihrer Protokollnummer in die WhitelistID aufgenommen.&lt;br /&gt;
Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. &lt;br /&gt;
Die Protokollnummer kann Tabelle [[#Unterst.C3.BCtzte_Ger.C3.A4te]] entnommen werden (hilfreich ist es auch, wenn in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachgesehen wird). So bedeutet beispielsweise ein Eintrag der Form &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; dass dann das Protokoll  #50 in die Whitelist aufzunehmen wäre (&amp;lt;code&amp;gt;attr sduino whitelist_IDs 50&amp;lt;/code&amp;gt;).&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Achtung Schreibweise: Dokumentation oft als WhitelistID o.ä., aber Name ist whitelist_IDs!!&lt;br /&gt;
}}&lt;br /&gt;
Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Senden mit dem SIGNALduino ===&lt;br /&gt;
Der SIGNALduino kann etwas &amp;quot;raw senden&amp;quot;, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert. Hierzu  muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet, das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
*:&amp;lt;code&amp;gt;get raw W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable &amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (&amp;lt;value&amp;gt; durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag {{Link2Forum|Topic=58396|Message=497921}} zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Update&amp;diff=21638</id>
		<title>Update</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Update&amp;diff=21638"/>
		<updated>2017-06-02T21:13:53Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Syntax controlfile */ Beschreibung zum MOV Befehl aktualisiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:update}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Befehl zur Aktualisierung der FHEM-Installation&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=update&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_update.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ([http://forum.fhem.de/index.php?action=profile;u=8 Forum] / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[update]] ist ein Befehl zur Aktualisierung der FHEM-Installation direkt über das FHEM [[FHEMWEB|Webfrontend]]. Von den Entwicklern bis zu einem bestimmten Zeitpunkt freigegebene Änderungen sind jeweils morgens ab 8:00 Uhr über die Update Funktion verfügbar. Änderungen, die später freigegeben werden, werden dementsprechend erst am nächsten Tag verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update [&amp;lt;fileName&amp;gt;|all|check|force] [http://.../controlfile]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update [add source|delete source|list|reset]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise:&#039;&#039;&#039;&lt;br /&gt;
* FHEM sichert mit den Standardeinstellungen während des Updates &amp;quot;nur&amp;quot; die aktualisierten Modul(Installations-)dateien und bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) ab Updatestand 29.10.2016 die [[Konfiguration]] und fhem.save, aber beispielsweise nicht [[Plots erzeugen|Plots]] oder [[FileLog]]s. Soll vor dem Update ein vollständiges Backup von FHEM erstellt werden, muss das mit dem Attribut &amp;lt;code&amp;gt;[[#backup_before_update|backup_before_update]]&amp;lt;/code&amp;gt; eingeschaltet werden.&lt;br /&gt;
* Lesen Sie aufmerksam die nach dem Update auf dem Monitor erscheinenden Meldungen zu Neuerungen und Änderungen.&lt;br /&gt;
* Nach einem Update ist immer ein &#039;&#039;shutdown restart&#039;&#039; erforderlich.&lt;br /&gt;
* geänderte und neu eingecheckte Module werden grundsätzlich erst am Folgetag ab ca. 8.00 Uhr durch den Update-Befehl verteilt.&lt;br /&gt;
* Mit dem Befehl [[version]] lässt sich die Version einzelner oder aller benutzten Module bestimmen.&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
Details zu Parametern des update Befehls:&lt;br /&gt;
&lt;br /&gt;
=== Standardaufrufe ===&lt;br /&gt;
==== update ====&lt;br /&gt;
Die ganze FHEM-Installation wird auf die neueste Version gebracht. Vorhandene Module werden akualisiert und neue Module installiert.&lt;br /&gt;
&lt;br /&gt;
==== update check ====&lt;br /&gt;
Es werden alle Module aufgelistet, von denen eine neuere als die bereits installierte Version verfügbar ist. Es wird nicht installiert.&lt;br /&gt;
&lt;br /&gt;
==== update force ====&lt;br /&gt;
Das Update wird erzwungen (falls es beim regulären &#039;&#039;update&#039;&#039; Probleme geben sollte). Dieser Befehl ist nur mit Bedacht und ausschließlich im Notfall einzusetzen. Sollte ein reproduzierbares Problem existieren, dies bitte im FHEM-Forum berichten, damit dem nachgegangen werden kann.&lt;br /&gt;
&lt;br /&gt;
==== update &amp;amp;lt;Dateiname&amp;amp;gt; ====&lt;br /&gt;
Mit z.B. &amp;lt;code&amp;gt;update 02_HTTPSRV.pm&amp;lt;/code&amp;gt; wird nur von der Datei &#039;&#039;02_HTTPSRV.pm&#039;&#039; eine neue Version installiert. Alle anderen FHEM-Dateien werden nicht angetastet.&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Alle [[Systemübersicht#Module|offiziellen Module]] von FHEM sind in einem gemeinsamen Repository gespeichert. Nur diese Module werden in der Standardeinstellung durch den update-Befehl mit den bisher aufgeführten [[#Standardaufrufe|Standardaufrufen]] aktualisiert bzw. installiert. Einige Entwickler stellen ihre Module jedoch aus verschiedensten Gründen nicht im gemeinsamen Repository zur Verfügung, sondern nutzen eigene, separate Repositorys. Diese sogenannten &amp;quot;Thirdparty-Module&amp;quot; (auch bezeichnet als inoffizielle Module) können ebenfalls über update installiert und aktualisiert werden, wenn der Entwickler eine sogenannte Kontrolldatei (controlfile) in seinem Repository zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Zur Installation bzw. Update jedes einzelnen Thirdparty-Moduls ist nachfolgender Befehl aufzurufen (Webadresse und Kontrolldateiname sind modulabhängig passend zu ersetzen):&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die in den vorherigen Abschnitten erläuterten Standardaufruf (bis auf &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;) können durch Ergänzung um Webadresse und Kontrolldateiname (&amp;lt;nowiki&amp;gt;http://.../controlfile&amp;lt;/nowiki&amp;gt; beim Befehls-Aufruf für das Update von einzelnen Thirdparty-Modulen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Repository-Verwaltung ===&lt;br /&gt;
In den Standardeinstellungen von FHEM ist für jedes einzelne Repository ein separater Aufruf der [[#Standardaufrufe|Standardaufrufe]] zur Aktualiserung/Installation notwendig. Zur Vereinfachung des Update-Prozesses hat der update-Befehl eine eingebaute Repository-Verwaltung. Mittels der Repository-Verwaltung lassen sich die Standardaufrufe so beeinflußen, dass mit einem einzigen Aufruf sowohl die Module aus dem FHEM-Repository als auch aus verschiedenen Thirdparty-Repositorys beim Update berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
==== update add ====&lt;br /&gt;
Fügt ein zusätzliches Repository zur vereinfachten Nutzung über die Standardaufrufe hinzu. Ein Aufruf von &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update &amp;lt;Dateiname&amp;gt;|all|check|force&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; berücksichtigt dann automatisch neben dem FHEM-eigenen Repository auch das hinzugefügte &amp;quot;Thirdparty-Repository&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Nach dem Hinzufügen durch beispielsweise &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; entfällt somit der manuelle Aufruf der Form &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Aktualiserung. Er kann aber weiterhin genutzt werden, um ausschließlich für ein bestimmtes Repository ein Update zu erhalten und und nicht für alle.&lt;br /&gt;
&lt;br /&gt;
Die Liste der Repositorys wird in der Verwaltungsdatei FHEM/controls.txt gespeichert.&lt;br /&gt;
&lt;br /&gt;
==== update delete ====&lt;br /&gt;
Entfernt eine Repository aus der Verwaltungsdatei.&lt;br /&gt;
&lt;br /&gt;
==== update list ====&lt;br /&gt;
Listet alle in der Verwaltungsdatei enthaltenen Repositorys auf.&lt;br /&gt;
&lt;br /&gt;
==== update reset ====&lt;br /&gt;
Entfernt alle Fremd-Repositorys aus der Verwaltungsdatei. Nur das eigene Repository von FHEM wird noch von den Standardparametern berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Syntax controlfile ====&lt;br /&gt;
Das Controlfile, welches durch thirdparty Module angelegt wird unterliegt eine Syntax.&lt;br /&gt;
Im Controlfile steht in jeder Zeile ein Dateiname und ein Befehl, was damit passieren soll. Ein Zeilenumbruch wird durch ein \n dargestellt&lt;br /&gt;
&lt;br /&gt;
Es können zwei Befehle verwendet werden&lt;br /&gt;
UPD zum Aktualisieren einer Datei, MOV zum Verschieben oder auch Löschen einer Datei.&lt;br /&gt;
&lt;br /&gt;
Aufbau der Befehle:&lt;br /&gt;
&lt;br /&gt;
Zum Aktualisieren einer Datei. Die Aktualisierung wird nur ausgeführt, wenn das Datum von der lokalen Datei unterschiedlich ist und die Dateigröße der heruntergeladenen Datei übereinstimmt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UPD &amp;lt;Datum&amp;gt; &amp;lt;Dateigröße&amp;gt; &amp;lt;Datei inkl. Pfad&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Verschieben oder umbenennen einer Datei. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MOV &amp;lt;quelldatei inkl. Pfad&amp;gt; &amp;lt;Zieldatei inkl. Pfad&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dateien lassen sich mit dem MOV Befehl auch in einen Spezielle Ordner unused verschieben. Ein vollständiges Löschen der Dateo ist derzeit nicht möglich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MOV &amp;lt;quelldatei inkl. Pfad&amp;gt; unused &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Befehls UPD ist wichtig, dass das Datum inklusive Uhrzeit übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $date = POSIX::strftime(&amp;quot;%Y-%d-%m&amp;quot;, localtime( $fi-&amp;gt;{mtime} ));&lt;br /&gt;
my $time = POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;, localtime( $fi-&amp;gt;{mtime} ));&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Erzeugt &#039;&#039;2016_14_10_23:50:13&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Dateigröße ist exakt zu bestimmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
@line_parts[2] = fileparse($file,&amp;quot;&amp;quot;);&lt;br /&gt;
@line_parts[3] = $fi-&amp;gt;{size};&lt;br /&gt;
$modifiy_line = join(&amp;quot; &amp;quot;,@line_parts).&amp;quot;\n&amp;quot;;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komplettes Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UPD 2016_14_10_23:50:13 40341   FHEM/98_Dooya.pm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Zur weiteren Beeinflussung der Funktionsweise des update Befehls können Attribute verwendet werden. Diese müssen für das Objekt &#039;&#039;global&#039;&#039; gesetzt werden, also mit einem Konfigurationsbefehl der Art&lt;br /&gt;
:&amp;lt;code&amp;gt;attr global ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== backup_before_update ===&lt;br /&gt;
siehe auch [[backup]]&lt;br /&gt;
&lt;br /&gt;
=== restoreDirs ===&lt;br /&gt;
siehe [[#Rücksichern beim Update überschriebener Dateien|Rücksichern beim Update überschriebener Dateien]]&lt;br /&gt;
&lt;br /&gt;
=== exclude_from_update ===&lt;br /&gt;
Mit der Definition &lt;br /&gt;
:&amp;lt;code&amp;gt;attr global exclude_from_update ...&amp;lt;/code&amp;gt;&lt;br /&gt;
kann eine Liste von Dateien spezifiziert werden, die bei der Ausführung des update Befehls &#039;&#039;&#039;nicht&#039;&#039;&#039; aktualisiert werden sollen. Dateien können auch über reguläre Ausdrücke definiert werden, die einzelnen Einträge werden durch Leerzeichen voneinander getrennt.&lt;br /&gt;
&lt;br /&gt;
Einen Spezialfall stellt die &#039;&#039;commandref&#039;&#039; dar, die seit einer Modifikation des Update Prozesses (März 2015, beschrieben in dieser {{Link2Forum|Topic=34450|LinkText=Forendiskusion}}) nicht mehr heruntergeladen wird, sondern auf dem Benutzersystem durch Extraktion der Dokumentation aus den einzelnen Modulen generiert wird, angezeigt durch die Meldung im fhem.log: &lt;br /&gt;
:&#039;&#039;Calling /usr/bin/perl ./contrib/commandref_join.pl, this may take a while&#039;&#039;. &lt;br /&gt;
Sollte dieser Prozess (z.B. auf einem langsamen Rechner) zu lange dauern, bleibt die Meldung &lt;br /&gt;
:&#039;&#039;update finished, &amp;quot;shutdown restart&amp;quot; is needed to activate the changes.&#039;&#039; &lt;br /&gt;
aus. Wird &#039;&#039;commandref&#039;&#039; in das &amp;lt;code&amp;gt;exclude_from_update&amp;lt;/code&amp;gt; Attribut eingetragen, entfällt dieser Schritt, die lokale &#039;&#039;commandref&#039;&#039; wird allerdings dann auch nicht mehr aktualisiert. Die modulspezifische Hilfe, die z.B. über &amp;lt;code&amp;gt;help modulname&amp;lt;/code&amp;gt; aufgerufen werden kann, ist davon nicht betroffen.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiel ==&lt;br /&gt;
=== Durchführung eines Updates ===&lt;br /&gt;
Zunächst kann mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;update check&amp;lt;/code&amp;gt;&lt;br /&gt;
überprüft werden, ob es überhaupt ein neues Update gibt und welche Dateien hierbei ausgetauscht würden (die angezeigten Infos sollten in einer Textdatei gesichert werden. Mit diesen Infos kann gezielter nach Problemen, die vielleicht nach einem Update auftreten, gesucht werden). Anschließend kann mittels:&lt;br /&gt;
:&amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
das Update eingespielt werden. Hierbei ist zu beachten, dass die Befehle auf der FHEM Webseite oben ([[Konfiguration|Befehls-Eingabefeld]]) eingegeben werden und anschließend die &amp;quot;Enter&amp;quot; Taste auf der Tastatur gedrückt werden muss.&lt;br /&gt;
&lt;br /&gt;
Gibt es kein Update für FHEM, sieht die Ausgabe z.B. nach &amp;quot;update check&amp;quot; wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;List of new / modified files since last update:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;nothing to do...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rücksichern beim Update überschriebener Dateien ===&lt;br /&gt;
Per default werden vor dem Überschreiben alle Dateien in einem neuen Verzeichnis (restoreDir/Datum) gesichert. Diese Dateien kann man einzeln oder komplett mit dem Befehl [http://fhem.de/commandref#restore restore] zuruecksichern (z.Bsp.: &amp;lt;code&amp;gt;restore 2014-08-19&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;restore 2014-08-19/fhem.pl&amp;lt;/code&amp;gt;). Mit dem restoreDirs Attribut kann man die Anzahl der aufgehobenen Sicherungen (== Datum-Verzeichnisse) bestimmen, die Voreinstellung ist 3. Mit 0 kann man das Feature komplett abschalten.&lt;br /&gt;
&lt;br /&gt;
Ab Updatestand 29.10.2016 können bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) die fhem.cfg und fhem.save mit der Option -a des restore-Befehl wiederhergestellt werden.&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Update&amp;diff=21634</id>
		<title>Update</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Update&amp;diff=21634"/>
		<updated>2017-06-01T20:58:38Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Syntax controlfile */ Formatierung angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:update}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Befehl zur Aktualisierung der FHEM-Installation&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=update&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_update.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ([http://forum.fhem.de/index.php?action=profile;u=8 Forum] / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[update]] ist ein Befehl zur Aktualisierung der FHEM-Installation direkt über das FHEM [[FHEMWEB|Webfrontend]]. Von den Entwicklern bis zu einem bestimmten Zeitpunkt freigegebene Änderungen sind jeweils morgens ab 8:00 Uhr über die Update Funktion verfügbar. Änderungen, die später freigegeben werden, werden dementsprechend erst am nächsten Tag verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update [&amp;lt;fileName&amp;gt;|all|check|force] [http://.../controlfile]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update [add source|delete source|list|reset]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise:&#039;&#039;&#039;&lt;br /&gt;
* FHEM sichert mit den Standardeinstellungen während des Updates &amp;quot;nur&amp;quot; die aktualisierten Modul(Installations-)dateien und bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) ab Updatestand 29.10.2016 die [[Konfiguration]] und fhem.save, aber beispielsweise nicht [[Plots erzeugen|Plots]] oder [[FileLog]]s. Soll vor dem Update ein vollständiges Backup von FHEM erstellt werden, muss das mit dem Attribut &amp;lt;code&amp;gt;[[#backup_before_update|backup_before_update]]&amp;lt;/code&amp;gt; eingeschaltet werden.&lt;br /&gt;
* Lesen Sie aufmerksam die nach dem Update auf dem Monitor erscheinenden Meldungen zu Neuerungen und Änderungen.&lt;br /&gt;
* Nach einem Update ist immer ein &#039;&#039;shutdown restart&#039;&#039; erforderlich.&lt;br /&gt;
* geänderte und neu eingecheckte Module werden grundsätzlich erst am Folgetag ab ca. 8.00 Uhr durch den Update-Befehl verteilt.&lt;br /&gt;
* Mit dem Befehl [[version]] lässt sich die Version einzelner oder aller benutzten Module bestimmen.&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
Details zu Parametern des update Befehls:&lt;br /&gt;
&lt;br /&gt;
=== Standardaufrufe ===&lt;br /&gt;
==== update ====&lt;br /&gt;
Die ganze FHEM-Installation wird auf die neueste Version gebracht. Vorhandene Module werden akualisiert und neue Module installiert.&lt;br /&gt;
&lt;br /&gt;
==== update check ====&lt;br /&gt;
Es werden alle Module aufgelistet, von denen eine neuere als die bereits installierte Version verfügbar ist. Es wird nicht installiert.&lt;br /&gt;
&lt;br /&gt;
==== update force ====&lt;br /&gt;
Das Update wird erzwungen (falls es beim regulären &#039;&#039;update&#039;&#039; Probleme geben sollte). Dieser Befehl ist nur mit Bedacht und ausschließlich im Notfall einzusetzen. Sollte ein reproduzierbares Problem existieren, dies bitte im FHEM-Forum berichten, damit dem nachgegangen werden kann.&lt;br /&gt;
&lt;br /&gt;
==== update &amp;amp;lt;Dateiname&amp;amp;gt; ====&lt;br /&gt;
Mit z.B. &amp;lt;code&amp;gt;update 02_HTTPSRV.pm&amp;lt;/code&amp;gt; wird nur von der Datei &#039;&#039;02_HTTPSRV.pm&#039;&#039; eine neue Version installiert. Alle anderen FHEM-Dateien werden nicht angetastet.&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Alle [[Systemübersicht#Module|offiziellen Module]] von FHEM sind in einem gemeinsamen Repository gespeichert. Nur diese Module werden in der Standardeinstellung durch den update-Befehl mit den bisher aufgeführten [[#Standardaufrufe|Standardaufrufen]] aktualisiert bzw. installiert. Einige Entwickler stellen ihre Module jedoch aus verschiedensten Gründen nicht im gemeinsamen Repository zur Verfügung, sondern nutzen eigene, separate Repositorys. Diese sogenannten &amp;quot;Thirdparty-Module&amp;quot; (auch bezeichnet als inoffizielle Module) können ebenfalls über update installiert und aktualisiert werden, wenn der Entwickler eine sogenannte Kontrolldatei (controlfile) in seinem Repository zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Zur Installation bzw. Update jedes einzelnen Thirdparty-Moduls ist nachfolgender Befehl aufzurufen (Webadresse und Kontrolldateiname sind modulabhängig passend zu ersetzen):&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die in den vorherigen Abschnitten erläuterten Standardaufruf (bis auf &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;) können durch Ergänzung um Webadresse und Kontrolldateiname (&amp;lt;nowiki&amp;gt;http://.../controlfile&amp;lt;/nowiki&amp;gt; beim Befehls-Aufruf für das Update von einzelnen Thirdparty-Modulen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Repository-Verwaltung ===&lt;br /&gt;
In den Standardeinstellungen von FHEM ist für jedes einzelne Repository ein separater Aufruf der [[#Standardaufrufe|Standardaufrufe]] zur Aktualiserung/Installation notwendig. Zur Vereinfachung des Update-Prozesses hat der update-Befehl eine eingebaute Repository-Verwaltung. Mittels der Repository-Verwaltung lassen sich die Standardaufrufe so beeinflußen, dass mit einem einzigen Aufruf sowohl die Module aus dem FHEM-Repository als auch aus verschiedenen Thirdparty-Repositorys beim Update berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
==== update add ====&lt;br /&gt;
Fügt ein zusätzliches Repository zur vereinfachten Nutzung über die Standardaufrufe hinzu. Ein Aufruf von &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update &amp;lt;Dateiname&amp;gt;|all|check|force&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; berücksichtigt dann automatisch neben dem FHEM-eigenen Repository auch das hinzugefügte &amp;quot;Thirdparty-Repository&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Nach dem Hinzufügen durch beispielsweise &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; entfällt somit der manuelle Aufruf der Form &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Aktualiserung. Er kann aber weiterhin genutzt werden, um ausschließlich für ein bestimmtes Repository ein Update zu erhalten und und nicht für alle.&lt;br /&gt;
&lt;br /&gt;
Die Liste der Repositorys wird in der Verwaltungsdatei FHEM/controls.txt gespeichert.&lt;br /&gt;
&lt;br /&gt;
==== update delete ====&lt;br /&gt;
Entfernt eine Repository aus der Verwaltungsdatei.&lt;br /&gt;
&lt;br /&gt;
==== update list ====&lt;br /&gt;
Listet alle in der Verwaltungsdatei enthaltenen Repositorys auf.&lt;br /&gt;
&lt;br /&gt;
==== update reset ====&lt;br /&gt;
Entfernt alle Fremd-Repositorys aus der Verwaltungsdatei. Nur das eigene Repository von FHEM wird noch von den Standardparametern berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Syntax controlfile ====&lt;br /&gt;
Das Controlfile, welches durch thirdparty Module angelegt wird unterliegt eine Syntax.&lt;br /&gt;
Im Controlfile steht in jeder Zeile ein Dateiname und ein Befehl, was damit passieren soll. Ein Zeilenumbruch wird durch ein \n dargestellt&lt;br /&gt;
&lt;br /&gt;
Es können zwei Befehle verwendet werden&lt;br /&gt;
UPD zum Aktualisieren einer Datei, MOV zum Verschieben oder auch Löschen einer Datei.&lt;br /&gt;
&lt;br /&gt;
Aufbau der Befehle:&lt;br /&gt;
&lt;br /&gt;
Zum Aktualisieren einer Datei. Die Aktualisierung wird nur ausgeführt, wenn das Datum von der lokalen Datei unterschiedlich ist und die Dateigröße der heruntergeladenen Datei übereinstimmt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UPD &amp;lt;Datum&amp;gt; &amp;lt;Dateigröße&amp;gt; &amp;lt;Datei inkl. Pfad&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Verschieben oder umbenennen einer Datei. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MOV &amp;lt;quelldatei inkl. Pfad&amp;gt; &amp;lt;Zieldatei inkl. Pfad&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dateien lassen sich mit dem MOV Befehl auch löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MOV &amp;lt;quelldatei inkl. Pfad&amp;gt; unused &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Befehls UPD ist wichtig, dass das Datum inklusive Uhrzeit übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
my $date = POSIX::strftime(&amp;quot;%Y-%d-%m&amp;quot;, localtime( $fi-&amp;gt;{mtime} ));&lt;br /&gt;
my $time = POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;, localtime( $fi-&amp;gt;{mtime} ));&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Erzeugt &#039;&#039;2016_14_10_23:50:13&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Dateigröße ist exakt zu bestimmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
@line_parts[2] = fileparse($file,&amp;quot;&amp;quot;);&lt;br /&gt;
@line_parts[3] = $fi-&amp;gt;{size};&lt;br /&gt;
$modifiy_line = join(&amp;quot; &amp;quot;,@line_parts).&amp;quot;\n&amp;quot;;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komplettes Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UPD 2016_14_10_23:50:13 40341   FHEM/98_Dooya.pm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Zur weiteren Beeinflussung der Funktionsweise des update Befehls können Attribute verwendet werden. Diese müssen für das Objekt &#039;&#039;global&#039;&#039; gesetzt werden, also mit einem Konfigurationsbefehl der Art&lt;br /&gt;
:&amp;lt;code&amp;gt;attr global ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== backup_before_update ===&lt;br /&gt;
siehe auch [[backup]]&lt;br /&gt;
&lt;br /&gt;
=== restoreDirs ===&lt;br /&gt;
siehe [[#Rücksichern beim Update überschriebener Dateien|Rücksichern beim Update überschriebener Dateien]]&lt;br /&gt;
&lt;br /&gt;
=== exclude_from_update ===&lt;br /&gt;
Mit der Definition &lt;br /&gt;
:&amp;lt;code&amp;gt;attr global exclude_from_update ...&amp;lt;/code&amp;gt;&lt;br /&gt;
kann eine Liste von Dateien spezifiziert werden, die bei der Ausführung des update Befehls &#039;&#039;&#039;nicht&#039;&#039;&#039; aktualisiert werden sollen. Dateien können auch über reguläre Ausdrücke definiert werden, die einzelnen Einträge werden durch Leerzeichen voneinander getrennt.&lt;br /&gt;
&lt;br /&gt;
Einen Spezialfall stellt die &#039;&#039;commandref&#039;&#039; dar, die seit einer Modifikation des Update Prozesses (März 2015, beschrieben in dieser {{Link2Forum|Topic=34450|LinkText=Forendiskusion}}) nicht mehr heruntergeladen wird, sondern auf dem Benutzersystem durch Extraktion der Dokumentation aus den einzelnen Modulen generiert wird, angezeigt durch die Meldung im fhem.log: &lt;br /&gt;
:&#039;&#039;Calling /usr/bin/perl ./contrib/commandref_join.pl, this may take a while&#039;&#039;. &lt;br /&gt;
Sollte dieser Prozess (z.B. auf einem langsamen Rechner) zu lange dauern, bleibt die Meldung &lt;br /&gt;
:&#039;&#039;update finished, &amp;quot;shutdown restart&amp;quot; is needed to activate the changes.&#039;&#039; &lt;br /&gt;
aus. Wird &#039;&#039;commandref&#039;&#039; in das &amp;lt;code&amp;gt;exclude_from_update&amp;lt;/code&amp;gt; Attribut eingetragen, entfällt dieser Schritt, die lokale &#039;&#039;commandref&#039;&#039; wird allerdings dann auch nicht mehr aktualisiert. Die modulspezifische Hilfe, die z.B. über &amp;lt;code&amp;gt;help modulname&amp;lt;/code&amp;gt; aufgerufen werden kann, ist davon nicht betroffen.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiel ==&lt;br /&gt;
=== Durchführung eines Updates ===&lt;br /&gt;
Zunächst kann mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;update check&amp;lt;/code&amp;gt;&lt;br /&gt;
überprüft werden, ob es überhaupt ein neues Update gibt und welche Dateien hierbei ausgetauscht würden (die angezeigten Infos sollten in einer Textdatei gesichert werden. Mit diesen Infos kann gezielter nach Problemen, die vielleicht nach einem Update auftreten, gesucht werden). Anschließend kann mittels:&lt;br /&gt;
:&amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
das Update eingespielt werden. Hierbei ist zu beachten, dass die Befehle auf der FHEM Webseite oben ([[Konfiguration|Befehls-Eingabefeld]]) eingegeben werden und anschließend die &amp;quot;Enter&amp;quot; Taste auf der Tastatur gedrückt werden muss.&lt;br /&gt;
&lt;br /&gt;
Gibt es kein Update für FHEM, sieht die Ausgabe z.B. nach &amp;quot;update check&amp;quot; wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;List of new / modified files since last update:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;nothing to do...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rücksichern beim Update überschriebener Dateien ===&lt;br /&gt;
Per default werden vor dem Überschreiben alle Dateien in einem neuen Verzeichnis (restoreDir/Datum) gesichert. Diese Dateien kann man einzeln oder komplett mit dem Befehl [http://fhem.de/commandref#restore restore] zuruecksichern (z.Bsp.: &amp;lt;code&amp;gt;restore 2014-08-19&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;restore 2014-08-19/fhem.pl&amp;lt;/code&amp;gt;). Mit dem restoreDirs Attribut kann man die Anzahl der aufgehobenen Sicherungen (== Datum-Verzeichnisse) bestimmen, die Voreinstellung ist 3. Mit 0 kann man das Feature komplett abschalten.&lt;br /&gt;
&lt;br /&gt;
Ab Updatestand 29.10.2016 können bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) die fhem.cfg und fhem.save mit der Option -a des restore-Befehl wiederhergestellt werden.&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Update&amp;diff=21633</id>
		<title>Update</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Update&amp;diff=21633"/>
		<updated>2017-06-01T20:46:25Z</updated>

		<summary type="html">&lt;p&gt;Sidey: /* Repository-Verwaltung Syntax für das Controlfile hinterlegt*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SEITENTITEL:update}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Befehl zur Aktualisierung der FHEM-Installation&lt;br /&gt;
|ModType=cmd&lt;br /&gt;
|ModCmdRef=update&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=98_update.pm&lt;br /&gt;
|ModOwner=rudolfkoenig ([http://forum.fhem.de/index.php?action=profile;u=8 Forum] / [[Benutzer Diskussion:Rudolfkoenig|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[update]] ist ein Befehl zur Aktualisierung der FHEM-Installation direkt über das FHEM [[FHEMWEB|Webfrontend]]. Von den Entwicklern bis zu einem bestimmten Zeitpunkt freigegebene Änderungen sind jeweils morgens ab 8:00 Uhr über die Update Funktion verfügbar. Änderungen, die später freigegeben werden, werden dementsprechend erst am nächsten Tag verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update [&amp;lt;fileName&amp;gt;|all|check|force] [http://.../controlfile]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update [add source|delete source|list|reset]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweise:&#039;&#039;&#039;&lt;br /&gt;
* FHEM sichert mit den Standardeinstellungen während des Updates &amp;quot;nur&amp;quot; die aktualisierten Modul(Installations-)dateien und bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) ab Updatestand 29.10.2016 die [[Konfiguration]] und fhem.save, aber beispielsweise nicht [[Plots erzeugen|Plots]] oder [[FileLog]]s. Soll vor dem Update ein vollständiges Backup von FHEM erstellt werden, muss das mit dem Attribut &amp;lt;code&amp;gt;[[#backup_before_update|backup_before_update]]&amp;lt;/code&amp;gt; eingeschaltet werden.&lt;br /&gt;
* Lesen Sie aufmerksam die nach dem Update auf dem Monitor erscheinenden Meldungen zu Neuerungen und Änderungen.&lt;br /&gt;
* Nach einem Update ist immer ein &#039;&#039;shutdown restart&#039;&#039; erforderlich.&lt;br /&gt;
* geänderte und neu eingecheckte Module werden grundsätzlich erst am Folgetag ab ca. 8.00 Uhr durch den Update-Befehl verteilt.&lt;br /&gt;
* Mit dem Befehl [[version]] lässt sich die Version einzelner oder aller benutzten Module bestimmen.&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
Details zu Parametern des update Befehls:&lt;br /&gt;
&lt;br /&gt;
=== Standardaufrufe ===&lt;br /&gt;
==== update ====&lt;br /&gt;
Die ganze FHEM-Installation wird auf die neueste Version gebracht. Vorhandene Module werden akualisiert und neue Module installiert.&lt;br /&gt;
&lt;br /&gt;
==== update check ====&lt;br /&gt;
Es werden alle Module aufgelistet, von denen eine neuere als die bereits installierte Version verfügbar ist. Es wird nicht installiert.&lt;br /&gt;
&lt;br /&gt;
==== update force ====&lt;br /&gt;
Das Update wird erzwungen (falls es beim regulären &#039;&#039;update&#039;&#039; Probleme geben sollte). Dieser Befehl ist nur mit Bedacht und ausschließlich im Notfall einzusetzen. Sollte ein reproduzierbares Problem existieren, dies bitte im FHEM-Forum berichten, damit dem nachgegangen werden kann.&lt;br /&gt;
&lt;br /&gt;
==== update &amp;amp;lt;Dateiname&amp;amp;gt; ====&lt;br /&gt;
Mit z.B. &amp;lt;code&amp;gt;update 02_HTTPSRV.pm&amp;lt;/code&amp;gt; wird nur von der Datei &#039;&#039;02_HTTPSRV.pm&#039;&#039; eine neue Version installiert. Alle anderen FHEM-Dateien werden nicht angetastet.&lt;br /&gt;
&lt;br /&gt;
==== update all ====&lt;br /&gt;
Alle [[Systemübersicht#Module|offiziellen Module]] von FHEM sind in einem gemeinsamen Repository gespeichert. Nur diese Module werden in der Standardeinstellung durch den update-Befehl mit den bisher aufgeführten [[#Standardaufrufe|Standardaufrufen]] aktualisiert bzw. installiert. Einige Entwickler stellen ihre Module jedoch aus verschiedensten Gründen nicht im gemeinsamen Repository zur Verfügung, sondern nutzen eigene, separate Repositorys. Diese sogenannten &amp;quot;Thirdparty-Module&amp;quot; (auch bezeichnet als inoffizielle Module) können ebenfalls über update installiert und aktualisiert werden, wenn der Entwickler eine sogenannte Kontrolldatei (controlfile) in seinem Repository zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Zur Installation bzw. Update jedes einzelnen Thirdparty-Moduls ist nachfolgender Befehl aufzurufen (Webadresse und Kontrolldateiname sind modulabhängig passend zu ersetzen):&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die in den vorherigen Abschnitten erläuterten Standardaufruf (bis auf &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;) können durch Ergänzung um Webadresse und Kontrolldateiname (&amp;lt;nowiki&amp;gt;http://.../controlfile&amp;lt;/nowiki&amp;gt; beim Befehls-Aufruf für das Update von einzelnen Thirdparty-Modulen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
=== Repository-Verwaltung ===&lt;br /&gt;
In den Standardeinstellungen von FHEM ist für jedes einzelne Repository ein separater Aufruf der [[#Standardaufrufe|Standardaufrufe]] zur Aktualiserung/Installation notwendig. Zur Vereinfachung des Update-Prozesses hat der update-Befehl eine eingebaute Repository-Verwaltung. Mittels der Repository-Verwaltung lassen sich die Standardaufrufe so beeinflußen, dass mit einem einzigen Aufruf sowohl die Module aus dem FHEM-Repository als auch aus verschiedenen Thirdparty-Repositorys beim Update berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
==== update add ====&lt;br /&gt;
Fügt ein zusätzliches Repository zur vereinfachten Nutzung über die Standardaufrufe hinzu. Ein Aufruf von &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update &amp;lt;Dateiname&amp;gt;|all|check|force&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; berücksichtigt dann automatisch neben dem FHEM-eigenen Repository auch das hinzugefügte &amp;quot;Thirdparty-Repository&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Nach dem Hinzufügen durch beispielsweise &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update add http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; entfällt somit der manuelle Aufruf der Form &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;update all http://thirdparty.com/controls_funnymodule.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Aktualiserung. Er kann aber weiterhin genutzt werden, um ausschließlich für ein bestimmtes Repository ein Update zu erhalten und und nicht für alle.&lt;br /&gt;
&lt;br /&gt;
Die Liste der Repositorys wird in der Verwaltungsdatei FHEM/controls.txt gespeichert.&lt;br /&gt;
&lt;br /&gt;
==== update delete ====&lt;br /&gt;
Entfernt eine Repository aus der Verwaltungsdatei.&lt;br /&gt;
&lt;br /&gt;
==== update list ====&lt;br /&gt;
Listet alle in der Verwaltungsdatei enthaltenen Repositorys auf.&lt;br /&gt;
&lt;br /&gt;
==== update reset ====&lt;br /&gt;
Entfernt alle Fremd-Repositorys aus der Verwaltungsdatei. Nur das eigene Repository von FHEM wird noch von den Standardparametern berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Syntax controlfile ====&lt;br /&gt;
Das Controlfile, welches durch thirdparty Module angelegt wird unterliegt eine Syntax.&lt;br /&gt;
Im Controlfile steht in jeder Zeile ein Dateiname und ein Befehl, was damit passieren soll. Ein Zeilenumbruch wird durch ein \n dargestellt&lt;br /&gt;
&lt;br /&gt;
Es können zwei Befehle verwendet werden&lt;br /&gt;
UPD zum Aktualisieren einer Datei, MOV zum Verschieben oder auch Löschen einer Datei.&lt;br /&gt;
&lt;br /&gt;
Aufbau der Befehle:&lt;br /&gt;
&lt;br /&gt;
Zum Aktualisieren einer Datei. Die Aktualisierung wird nur ausgeführt, wenn das Datum von der lokalen Datei unterschiedlich ist und die Dateigröße der heruntergeladenen Datei übereinstimmt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UPD &amp;lt;Datum&amp;gt; &amp;lt;Dateigröße&amp;gt; &amp;lt;Datei inkl. Pfad&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Verschieben oder umbenennen einer Datei. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MOV &amp;lt;quelldatei inkl. Pfad&amp;gt; &amp;lt;Zieldatei inkl. Pfad&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dateien lassen sich mit dem MOV Befehl auch löschen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MOV &amp;lt;quelldatei inkl. Pfad&amp;gt; unused &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des Befehls UPD ist wichtig, dass das Datum inklusive Uhrzeit übergeben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
my $date = POSIX::strftime(&amp;quot;%Y-%d-%m&amp;quot;, localtime( $fi-&amp;gt;{mtime} ));&lt;br /&gt;
&lt;br /&gt;
my $time = POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;, localtime( $fi-&amp;gt;{mtime} ));&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Erzeugt &#039;&#039;2016_14_10_23:50:13&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Dateigröße ist exakt zu bestimmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
@line_parts[2] = fileparse($file,&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
@line_parts[3] = $fi-&amp;gt;{size};&lt;br /&gt;
&lt;br /&gt;
$modifiy_line = join(&amp;quot; &amp;quot;,@line_parts).&amp;quot;\n&amp;quot;;	&lt;br /&gt;
			&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komplettes Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UPD 2016_14_10_23:50:13 40341   FHEM/98_Dooya.pm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Zur weiteren Beeinflussung der Funktionsweise des update Befehls können Attribute verwendet werden. Diese müssen für das Objekt &#039;&#039;global&#039;&#039; gesetzt werden, also mit einem Konfigurationsbefehl der Art&lt;br /&gt;
:&amp;lt;code&amp;gt;attr global ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== backup_before_update ===&lt;br /&gt;
siehe auch [[backup]]&lt;br /&gt;
&lt;br /&gt;
=== restoreDirs ===&lt;br /&gt;
siehe [[#Rücksichern beim Update überschriebener Dateien|Rücksichern beim Update überschriebener Dateien]]&lt;br /&gt;
&lt;br /&gt;
=== exclude_from_update ===&lt;br /&gt;
Mit der Definition &lt;br /&gt;
:&amp;lt;code&amp;gt;attr global exclude_from_update ...&amp;lt;/code&amp;gt;&lt;br /&gt;
kann eine Liste von Dateien spezifiziert werden, die bei der Ausführung des update Befehls &#039;&#039;&#039;nicht&#039;&#039;&#039; aktualisiert werden sollen. Dateien können auch über reguläre Ausdrücke definiert werden, die einzelnen Einträge werden durch Leerzeichen voneinander getrennt.&lt;br /&gt;
&lt;br /&gt;
Einen Spezialfall stellt die &#039;&#039;commandref&#039;&#039; dar, die seit einer Modifikation des Update Prozesses (März 2015, beschrieben in dieser {{Link2Forum|Topic=34450|LinkText=Forendiskusion}}) nicht mehr heruntergeladen wird, sondern auf dem Benutzersystem durch Extraktion der Dokumentation aus den einzelnen Modulen generiert wird, angezeigt durch die Meldung im fhem.log: &lt;br /&gt;
:&#039;&#039;Calling /usr/bin/perl ./contrib/commandref_join.pl, this may take a while&#039;&#039;. &lt;br /&gt;
Sollte dieser Prozess (z.B. auf einem langsamen Rechner) zu lange dauern, bleibt die Meldung &lt;br /&gt;
:&#039;&#039;update finished, &amp;quot;shutdown restart&amp;quot; is needed to activate the changes.&#039;&#039; &lt;br /&gt;
aus. Wird &#039;&#039;commandref&#039;&#039; in das &amp;lt;code&amp;gt;exclude_from_update&amp;lt;/code&amp;gt; Attribut eingetragen, entfällt dieser Schritt, die lokale &#039;&#039;commandref&#039;&#039; wird allerdings dann auch nicht mehr aktualisiert. Die modulspezifische Hilfe, die z.B. über &amp;lt;code&amp;gt;help modulname&amp;lt;/code&amp;gt; aufgerufen werden kann, ist davon nicht betroffen.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiel ==&lt;br /&gt;
=== Durchführung eines Updates ===&lt;br /&gt;
Zunächst kann mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;update check&amp;lt;/code&amp;gt;&lt;br /&gt;
überprüft werden, ob es überhaupt ein neues Update gibt und welche Dateien hierbei ausgetauscht würden (die angezeigten Infos sollten in einer Textdatei gesichert werden. Mit diesen Infos kann gezielter nach Problemen, die vielleicht nach einem Update auftreten, gesucht werden). Anschließend kann mittels:&lt;br /&gt;
:&amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
das Update eingespielt werden. Hierbei ist zu beachten, dass die Befehle auf der FHEM Webseite oben ([[Konfiguration|Befehls-Eingabefeld]]) eingegeben werden und anschließend die &amp;quot;Enter&amp;quot; Taste auf der Tastatur gedrückt werden muss.&lt;br /&gt;
&lt;br /&gt;
Gibt es kein Update für FHEM, sieht die Ausgabe z.B. nach &amp;quot;update check&amp;quot; wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;List of new / modified files since last update:&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;nothing to do...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rücksichern beim Update überschriebener Dateien ===&lt;br /&gt;
Per default werden vor dem Überschreiben alle Dateien in einem neuen Verzeichnis (restoreDir/Datum) gesichert. Diese Dateien kann man einzeln oder komplett mit dem Befehl [http://fhem.de/commandref#restore restore] zuruecksichern (z.Bsp.: &amp;lt;code&amp;gt;restore 2014-08-19&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;restore 2014-08-19/fhem.pl&amp;lt;/code&amp;gt;). Mit dem restoreDirs Attribut kann man die Anzahl der aufgehobenen Sicherungen (== Datum-Verzeichnisse) bestimmen, die Voreinstellung ist 3. Mit 0 kann man das Feature komplett abschalten.&lt;br /&gt;
&lt;br /&gt;
Ab Updatestand 29.10.2016 können bei Standardinstallationen ({{Link2Forum|Topic=59669|Message=511367}}) die fhem.cfg und fhem.save mit der Option -a des restore-Befehl wiederhergestellt werden.&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=20537</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=20537"/>
		<updated>2017-03-05T11:58:57Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Firmware für radino ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[SIGNALduino]] unterstützt den gleichnamigen Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]). Der SIGNALduino (Hardware) basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] , es stehen jedoch auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 Mhz; wer einen Mikrocontroller mit 8 Mhz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Er wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Die Schaltung entspricht der des [[FHEMduino]] bzw dem [[Selbstbau_CUL]]. Es gibt auch eine Variante, die auf einem [[ESP8266]] nativ läuft, diese funktioniert derzeit aber noch nicht zufiedenstellend. Das Modul wird derzeit (2017) stetig weiterentwickelt.&lt;br /&gt;
&lt;br /&gt;
== Aufgabe des SIGNALduino ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
Der SIGNALduino erkennt  Signale anhand von Mustern und gibt sie an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben. Das System ist dabei nicht auf 433 Mhz beschränkt. Der SIGNALduino funktioniert auch mit anderen Frequenzen sowie mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
== Vorteil zu einem CUL/FHEMduino ==&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden. Änderungen am Arduino Code sind normalerweise nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
So kann man beispielsweise den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen. (Bitte dabei auf die passenden Spannungen achten, ein Arduino Nano verträgt 5V).&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochon eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhel HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|FA21RF||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Wie muss der Arduino verkabelt werden?&lt;br /&gt;
&lt;br /&gt;
Es gibt drei Varianten:&lt;br /&gt;
* wird ein Arduino mit einfachen Sende- und Empfangsmodulen verwendet, dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
* wird ein CC1101 Transceiver verwendet, ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
* Es gibt ein fertig konfektionierte Module von In-Circuit. Die dort erhältlichen Radino CC1101 Varianten. Link zum [http://shop.in-circuit.de/index.php Hersteller]. &lt;br /&gt;
&lt;br /&gt;
Ein gutes Empfangsmodul ist z.B. das RXB6 Modul (433.92 Mhz). Der CC1101 erlaubt es, auch geringfügig abweichende Frequenzen zu nutzen (Somfy sendet beispielsweise auf 433.42MHz). Die sehr preiswerten XY-MK-5V Module arbeiten zu unzuverlässig und sind nicht zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
== Bauanleitung und Teileliste ==&lt;br /&gt;
Benötigt wird ein Arduino Nano, Uno oder mini. Zu empfehlen ist der Nano. An den Nano, werden Empfänger und Sendeeinheit oder der CC1101  angeschlossen. Durch die geringe Anzahl an Bauteilen lässt sich das System sehr gut auf einer Lochrasterplatine aufbauen und ist somit auch für Anwender, die mit dem Aufbau von Schaltungen weniger bewandert sind, leicht zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anbei eine Auswahl häufig verwendeter Komponenten. Diese sind alle (z.B. auf Ebay) leicht zu finden:&lt;br /&gt;
* Arduino Nano V3.0 ATmega328P 5V 16M &lt;br /&gt;
* 433 Mhz Transmitter FS1000A  (dieser wird in der Regel mit einem Empfänger XY-MK-5V angeboten, der Empfänger ist aber zu unzuverlässig)&lt;br /&gt;
* 433 Mhz Empfänger RXB-6 oder alternativ auch RXB-8&lt;br /&gt;
* 433MHz Helix Antenne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann auch geladen werden. Dazu folgende Befehle in FHEM ausführen:&lt;br /&gt;
&lt;br /&gt;
* FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
* SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gerade wenn neue Entwicklungen für euch interessant sind, könnt ihr FHEM auch dauerhaft die developer Version aktualisieren lassen:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen. Im Log File seht ihr, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
&lt;br /&gt;
Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB Anschlusses muss natürlich an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define sduino SIGNALduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der SIGNALduino Firmware ==&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
== Flashen eines radino Boards mit ATmega32U4 ==&lt;br /&gt;
&lt;br /&gt;
Diese Funktion steht nur in der Entwicklungsversion dev-r33 zur Verfügung:&lt;br /&gt;
Das Radino Board muss derzeit noch mit Angabe des Dateinamens geflasht werden:&lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALDuino_radinoCC1101.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch sind berichte bekannt, dass der Radino beim Neustart von FHEM nicht korrekt initalisiert wird.&lt;br /&gt;
&lt;br /&gt;
== Daten aus dem Logfile erklärt ==&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul existiert, welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu Zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Diese Einträge können mit dem Attribut WhitelistID minimiert werden. Geräte, welche ihr empfangen wollt, könnt ihr in die WhitelistID aufnehmen. Die Geräte werden dadurch anhand einer Protokollnummer identifiziert. Diese kann der obigen Tabelle zum Teil entnommen werden. Hilfreich ist es auch, wenn ihr in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachseht. Diese sind teilweise nach folgendem Schema aufgebaut: &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; W50 bedeutet dann Protokoll #50.&lt;br /&gt;
Ist der Aufbau nicht so, hilft noch ein Blick in den Quellcode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales, der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mein Gerät wird in FHEM nicht erkannt ==&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ==&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend Notwendig um seine Anforderungen zu erfüllen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Schalter bzw. Sensoren die nur zwei Zustände kennen geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden. Der Name eures SIGNALduino eventuell auch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich etwas Senden ==&lt;br /&gt;
Der SIGNALduino kann etwas senden, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert.&lt;br /&gt;
Genannt &amp;quot;raw senden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um in der FHEM Kommandozeile etwas zu senden muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
== Es erscheinen viele Logmeldungen für Geräte die ich nicht habe ==&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele dieser Logmeldungen können durch Setzen des &#039;&#039;verbose&#039;&#039; Levels auf den Wert &#039;&#039;3&#039;&#039; unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Dennoch kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;whitelistIDs&#039;&#039; erlaubt es, anzugeben, welche Protokolle vom FHEM Modul berücksichtigt werden. Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung und Firmware ==&lt;br /&gt;
Der SIGNALduino kann mit folgendem Befehl auf Werkseinstellungen zurückgesetzt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;get raw e&amp;lt;/code&amp;gt;&lt;br /&gt;
als Antwort kommt dann &amp;quot;ccFactoryReset done&amp;quot;. Ob ein solcher Reset nötig ist, erkennt man an der Antwort auf den Befehl &amp;quot;get config&amp;quot;, auf den dann die Meldung &amp;quot;config: MS=1;MU=1;MC=1&amp;quot; folgen sollte.&lt;br /&gt;
&lt;br /&gt;
In der Firmware sind die folgenden Befehle eingebaut&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;C&amp;lt;reg&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;reg&amp;gt; is a (two digit) hex number: return the value of the cc1101 register. &amp;lt;reg&amp;gt;=99 dumps the first 48 registers.&lt;br /&gt;
Example: C35 -&amp;gt; C35 = 0D&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;&lt;br /&gt;
EEPROM / factory reset.  resets all eeprom values without reboot&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;r&amp;lt;AA&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Read eeprom  (da das &amp;quot;R&amp;quot; beim SIGNALDuino bereits mit freeram belegt ist, habe ich das &amp;quot;r&amp;quot; verwendet)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;r&amp;lt;AA&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
Read 16 byte from eeprom (z.B. r00n)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;W&amp;lt;AA&amp;gt;&amp;lt;DD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)&lt;br /&gt;
&lt;br /&gt;
Die Sendeleistung lässt sich mit &lt;br /&gt;
:&amp;lt;code&amp;gt;get sduino ccreg 3E&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
prüfen, wobei die Rückmeldung wie folgt zu lesen ist: &lt;br /&gt;
  &amp;quot;-10_dBm&amp;quot;  =&amp;gt; &#039;34&#039;,&lt;br /&gt;
  &amp;quot;-5_dBm&amp;quot;   =&amp;gt; &#039;68&#039;,&lt;br /&gt;
  &amp;quot;0_dBm&amp;quot;    =&amp;gt; &#039;60&#039;,&lt;br /&gt;
  &amp;quot;5_dBm&amp;quot;    =&amp;gt; &#039;84&#039;,&lt;br /&gt;
  &amp;quot;7_dBm&amp;quot;    =&amp;gt; &#039;C8&#039;,&lt;br /&gt;
  &amp;quot;10_dBm&amp;quot;   =&amp;gt; &#039;C0&#039; &lt;br /&gt;
Dabei wird die Sendeleistung dauerhaft mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino cc1101_patable value&amp;lt;/code&amp;gt;&lt;br /&gt;
hochgeschaltet (value durch den Wert ersetzen).&lt;br /&gt;
&lt;br /&gt;
Weitere Firmware-Befehle sind im Thread-Beitrag [https://forum.fhem.de/index.php/topic,58396.msg497921.html#msg497921] zu finden.&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=20445</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=20445"/>
		<updated>2017-03-01T21:16:17Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Hardware Variante angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digitalen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[SIGNALduino]] unterstützt den gleichnamigen Low-Cost Empfänger für digitale Signale (vergleichbar dem  [[CUL]]). Der SIGNALduino (Hardware) basiert auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] , es stehen jedoch auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 Mhz; wer einen Mikrocontroller mit 8 Mhz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Er wird über den USB Port angeschlossen, er kann aber auch mit zusätzlichen ESP Modulen über ein WLAN angebunden werden. Die Schaltung entspricht der des [[FHEMduino]] bzw dem [[Selbstbau_CUL]]. Es gibt auch eine Variante, die auf einem [[ESP8266]] nativ läuft. Das Modul wird derzeit (2017) stetig weiterentwickelt.&lt;br /&gt;
&lt;br /&gt;
== Aufgabe des SIGNALduino ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|Beispielschaltplan SIGNAL(FHEM)duino]]  &lt;br /&gt;
Der SIGNALduino erkennt  Signale anhand von Mustern und gibt sie an FHEM zur Auswertung (Dekodierung) weiter. Auch nicht erkannte Signale werden an FHEM übergeben. Das System ist dabei nicht auf 433 Mhz beschränkt. Der SIGNALduino funktioniert auch mit anderen Frequenzen sowie mit anderen Medien wie Infrarot oder direkter Kabelverbindung.&lt;br /&gt;
&lt;br /&gt;
== Vorteil zu einem CUL/FHEMduino ==&lt;br /&gt;
Der SIGNALduino hat den Vorteil einer sehr schnellen Demodulation des Funksignals. Sollen weitere Protokolle dekodiert werden, so muss dazu nur ein passendes FHEM Modul entwickelt oder ein universelles Modul erweitert werden. Änderungen am Arduino Code sind normalerweise nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
So kann man beispielsweise den SIGNALduino direkt an den Sendeausgang eines Sensors anbinden und die digitalen Signale empfangen. (Bitte dabei auf die passenden Spannungen achten, ein Arduino Nano verträgt 5V).&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit (2017) eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen, wenn der SIGNALduino läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochon eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhel HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|FA21RF||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Wie muss der Arduino verkabelt werden?&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Varianten:&lt;br /&gt;
&lt;br /&gt;
1) Es wird ein Arduino mit einfachen Sende und Empfangsmodulen verwendet. Dann ist die Verkabelung identisch zum [[FHEMduino]] &lt;br /&gt;
&lt;br /&gt;
2) Wenn man einen CC1101 Transreceiver verwendet, ist die Verkabelung identisch zum [[Selbstbau_CUL]].&lt;br /&gt;
&lt;br /&gt;
Ein gutes Empfangsmodul ist z.B. das RXB6 Modul (433.92 Mhz). Der CC1101 erlaubt es, auch geringfügig abweichende Frequenzen zu nutzen (Somfy sendet beispielsweise auf 433.42MHz). Die sehr preiswerten XY-MK-5V Module arbeiten zu unzuverlässig und sind nicht zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
== Bauanleitung und Teileliste ==&lt;br /&gt;
&lt;br /&gt;
Benötigt wird ein Arduino Nano, Uno oder mini. Zu empfehlen ist der Nano. An den Nano, werden Empfänger und Sendeeinheit oder der CC1101  angeschlossen. Durch die geringe Anzahl an Bauteilen lässt sich das System sehr gut auf einer Lochrasterplatine aufbauen und ist somit auch für Anwender, die mit dem Aufbau von Schaltungen weniger bewandert sind, leicht zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anbei eine Auswahl häufig verwendeter Komponenten. Diese sind alle (z.B. auf Ebay) leicht zu finden:&lt;br /&gt;
* Arduino Nano V3.0 ATmega328P 5V 16M &lt;br /&gt;
* 433 Mhz Transmitter FS1000A  (dieser wird in der Regel mit einem Empfänger XY-MK-5V angeboten, der Empfänger ist aber zu unzuverlässig)&lt;br /&gt;
* 433 Mhz Empfänger RXB-6 oder alternativ auch RXB-8&lt;br /&gt;
* 433MHz Helix Antenne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann auch geladen werden. Dazu folgende Befehle in FHEM ausführen:&lt;br /&gt;
&lt;br /&gt;
1. FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
2. SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gerade wenn neue Entwicklungen für euch interessant sind, könnt ihr FHEM auch dauerhaft die developer Version aktualisieren lassen:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen. Im Log File seht ihr, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
&lt;br /&gt;
Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB Anschlusses muss natürlich an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define sduino SIGNALduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der SIGNALduino Firmware ==&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware-Dateien wechseln. Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hardware&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
sonst üblicherweise&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
== Daten aus dem Logfile erklärt ==&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unknown Code&amp;quot; bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul existiert, welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu Zusätzlichen &amp;quot;Unknown code&amp;quot;-Einträgen.&lt;br /&gt;
&lt;br /&gt;
Diese Einträge können mit dem Attribut WhitelistID minimiert werden. Geräte, welche ihr empfangen wollt, könnt ihr in die WhitelistID aufnehmen. Die Geräte werden dadurch anhand einer Protokollnummer identifiziert. Diese kann der obigen Tabelle zum Teil entnommen werden. Hilfreich ist es auch, wenn ihr in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachseht. Diese sind teilweise nach folgendem Schema aufgebaut: &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; W50 bedeutet dann Protokoll #50.&lt;br /&gt;
Ist der Aufbau nicht so, hilft noch ein Blick in den Quellcode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MS - Nachricht mit Sync Puls: Hierzu ein Beispiel&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. Die ersten beiden Ziffern 15 in D sind wie folgt zu lesen. Zuerst wurde ein Signal mit 395 Mikrosekunden high (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P1=395&amp;quot;) und anschließend ein Signal 8916 Mikrosekunden low (die Zeitdauer ergibt sich aufgrund der Mitteilung &amp;quot;P5=-8916&amp;quot;) gemessen. CP=1 ist die Referenz auf den Takt des Signales, der Basistakt ist in diesem Fall ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an, der das gesamte Signal einleitet. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
&lt;br /&gt;
MC - Nachricht vom Typ Manchester: Manchesterkodierte Signale können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht. Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist. Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mein Gerät wird in FHEM nicht erkannt ==&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ==&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend Notwendig um seine Anforderungen zu erfüllen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Schalter bzw. Sensoren die nur zwei Zustände kennen geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden. Der Name eures SIGNALduino eventuell auch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich etwas Senden ==&lt;br /&gt;
Der SIGNALduino kann etwas senden, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert.&lt;br /&gt;
Genannt &amp;quot;raw senden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um in der FHEM Kommandozeile etwas zu senden muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
== Es erscheinen viele Logmeldungen für Geräte die ich nicht habe ==&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele dieser Logmeldungen können durch Setzen des &#039;&#039;verbose&#039;&#039; Levels auf den Wert &#039;&#039;3&#039;&#039; unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Dennoch kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;whitelistIDs&#039;&#039; erlaubt es, anzugeben, welche Protokolle vom FHEM Modul berücksichtigt werden. Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
* [[SIGNALduino in die Arduino Entwicklungsumgebung einbinden]]&lt;br /&gt;
* [[Somfy via SIGNALduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=19312</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=19312"/>
		<updated>2017-02-02T20:32:08Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Aktualisierung c1101, Somfy RTS Verlinkung, sendMsg Befehl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digialen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[SIGNALduino]] unterstützt den gleichnamigen Low-Cost Empfänger für digitale Signale, ähnlich einem [[CUL]]. Der SIGNALduino (Hardware) basiert auf einem Arduino. Hauptsächlich wurde er für den [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] entwickelt. Es stehen jedoch auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 Mhz. Wer einen Mikrocontroller mit 8 Mhz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Er wird hauptsächlich über den USB Port angeschlossen, kann aber auch mit Zusätzlichen ESP Modulen über ein WLAN angebunden werden. Die Schaltung entspricht der des [[FHEMduino]]. &lt;br /&gt;
In Arbeit ist auch eine Variante zum [[Selbstbau_CUL]]. &lt;br /&gt;
Und ebenso eine Variante, die auf einem [[ESP8266]] nativ läuft.&lt;br /&gt;
&lt;br /&gt;
# Das Modul wird stetig weiterentwickelt&lt;br /&gt;
# Das Modul gibt bei Bedarf sehr viele Meldungen ins Logfile, in den Normaleinstellungen verhält es sich aber relativ ruhig.&lt;br /&gt;
&lt;br /&gt;
== Was macht dieser SIGNALduino? ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|SIGNAL(FHEM)duino Schaltplan]]  &lt;br /&gt;
Digitale Signale anhand von Mustern erkennen und zum Auswerten an FHEM weitergeben, dort können die Daten dann dekodiert werden.&lt;br /&gt;
Zwischenzeitlich gibt der Arduino alle erkannten Signale an FHEM weiter, dies hilft um vor allem Signale zu finden, die noch nicht bekannt sind.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Arduino mit 433 Mhz Empfänger an einen FHEM Server anschließen und IT Steckdosen empfangen / schalten&lt;br /&gt;
&lt;br /&gt;
Das System ist jedoch nicht auf 433 Mhz beschränkt. Es funktioniert auch mit anderen Frequenzen oder Medien, z.B. auch mit Infrarot oder direkt angebunden via Draht.&lt;br /&gt;
&lt;br /&gt;
== Worin liegt der Vorteil zu einem CUL oder FHEMduino? ==&lt;br /&gt;
Der vorteil besteht darin, dass man sehr schnell das Funksignal demodulieren kann. &lt;br /&gt;
Wer Lust hat weitere  Protokolle zu dekodieren, braucht dazu nur ein passendes FHEM Modul entwickeln oder ein universelles Modul erweitern. Änderungen am Arduino Code sind &amp;quot;eigentlich&amp;quot; nicht notwendig, dadurch skaliert das System gut.&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeit: Wer einen Wettersensor dekodieren möchte, muss ja erst mal feststellen, was der Sensor sendet. Dazu kann man den SIGNALduino auch an den Sendeausgang des Sensors anbinden und empfängt die digitalen Signale. Bitte achtet aber auf die passenden Spannungen, bevor ihr eine solche Schaltung vornehmt. Ein Arduino Nano verträgt 5V.&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit eine Unterstützung für den Betrieb mit FHEM. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen wenn der SIGNALduino mal läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochon eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhel HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|FA21RF||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|[[Somfy_via_SIGNALduino|Somfy RTS]]||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Wie muss der Arduino verkabelt werden?&lt;br /&gt;
Die Verkabelung ist Identisch zum [[FHEMduino]]&lt;br /&gt;
&lt;br /&gt;
Des weiteren benötigt man neben dem Arduino ein Sendemodul und auch ein Empfangsmodul.&lt;br /&gt;
Für gut befunden sind z.B. ein RXB6 Modul um 433 Mhz Signale empfangen zu können.&lt;br /&gt;
&lt;br /&gt;
== Bauanleitung und Teileliste ==&lt;br /&gt;
&lt;br /&gt;
Benötigt wird ein Arduino Nano, Uno oder mini. Zu empfehlen ist der Nano.&lt;br /&gt;
An den Nano, werden Empfänger und Sendeeinheit angeschlossen.&lt;br /&gt;
Als weitere Komponenten benötigt man einen Sender und Empfänger im gewünschten Frequenzspektrum. Hierzu kann auch eine bestehende Wetterstation oder Funkfernbedienung ausgeschlachtet werden.&lt;br /&gt;
&lt;br /&gt;
Durch die geringe Anzahl an Bauteilen lässt sich das System sehr gut auf einer Lochrasterplatine aufbauen und ist somit auch für Anwender, die mit dem Aufbau von Schaltungen weniger bewandert sind, leicht zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anbei eine Auswahl häufig verwendeter Komponenten. Diese sind alle (z.B. auf Ebay) leicht zu finden:&lt;br /&gt;
* Arduino Nano V3.0 ATmega328P 5V 16M &lt;br /&gt;
* 433 Mhz Transmitter FS1000A  (dieser wird in der Regel mit einem Empfänger XY-MK-5V angeboten. Der Empfänger ist jedoch relativ unbrauchbar)&lt;br /&gt;
* 433 Mhz Empfänger RXB-6 oder alternativ auch RXB-8&lt;br /&gt;
* 433MHz Helix Antenne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann auch geladen werden. Dazu folgende Befehle in FHEM ausführen:&lt;br /&gt;
&lt;br /&gt;
1. FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
2. SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Gerade wenn neue Entwicklungen für euch interessant sind, könnt ihr FHEM auch dauerhaft die developer Version aktualisieren lassen:&lt;br /&gt;
&amp;lt;code&amp;gt;update add &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
Danach wird FHEM bei dem normalen Update Befehl immer automatisch die aktuelle dev Version laden.&lt;br /&gt;
&lt;br /&gt;
Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen. Im Log File seht ihr, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
&lt;br /&gt;
Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB Anschlusses muss natürlich an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define sduino SIGNALduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der SIGNALduino Firmware ==&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In FHEM ist der SIGNALduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware Dateien wechseln.&lt;br /&gt;
 &lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde)&lt;br /&gt;
&lt;br /&gt;
=== Arduino Nano mit cc1101 / NanoCul (nur development Version) ===&lt;br /&gt;
Solltet ihr einen Nano mit cc1101 Transreceiver verwenden, so wählt bitte folgende Hadware, damit die richtige Firmware geflasht wird,&lt;br /&gt;
&amp;lt;code&amp;gt;attr sduino hardware nanoCC1101&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Daten aus dem Logfile erklärt ==&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird:&lt;br /&gt;
&lt;br /&gt;
Unknown Code, so oder ähnlich bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul existiert, welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu Zusätzlichen Unknown code Einträgen.&lt;br /&gt;
Diese Einträge können mit dem Attribut WhitelistID minimiert werden. Geräte, welche ihr empfangen wollt, könnt ihr in die WhitelistID aufnehmen. Die Geräte werden dadurch anhand einer Protokollnummer identifiziert. Diese kann der obigen Tabelle zum Teil entnommen werden. Hilfreich ist es auch, wenn ihr in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachseht. Diese sind teilweise nach folgendem Schema aufgebaut: &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; W50 bedeutet dann Protokoll #50.&lt;br /&gt;
Ist der Aufbau nicht so, hilft noch ein Blick in den Quellcode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MS - Nachricht mit Sync Puls: Es wurde eine Signal empfangen. P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. 15 Bedeutet es wurde ein Signalpegel (1) 395 Mikrosekundenhigh und Anschließend (5) 8916 Mikrosekunden low gemessen. CP=1 ist die Referenz auf den Takt des Signales. Getaktet wird in diesem Fall mit ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MC - Nachricht vom Typ Manchester: Manchester Kodierte Signale, können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht.&lt;br /&gt;
Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist.&lt;br /&gt;
Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mein Gerät wird in FHEM nicht erkannt ==&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ==&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend Notwendig um seine Anforderungen zu erfüllen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Schalter bzw. Sensoren die nur zwei Zustände kennen geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden. Der Name eures SIGNALduino eventuell auch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich etwas Senden ==&lt;br /&gt;
Der SIGNALduino kann etwas senden, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert.&lt;br /&gt;
Genannt &amp;quot;raw senden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um in der FHEM Kommandozeile etwas zu senden muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
Die Protokoll Nummer kann aus einer empfangenen Nachricht extrahiert werden. Ebenso die Bits.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
sduino: extracted data 00111010 (bin)&lt;br /&gt;
sduino: Found Protocol id 3 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Signal auch in einer &amp;quot;rohform&amp;quot; angegeben werden. Dies ist manchmal in speziellen Fällen notwendig:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
== Es erscheinen viele Logmeldungen für Geräte die ich nicht habe ==&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele dieser Logmeldungen können durch Setzen des &#039;&#039;verbose&#039;&#039; Levels auf den Wert &#039;&#039;3&#039;&#039; unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Dennoch kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;whitelistIDs&#039;&#039; erlaubt es, anzugeben, welche Protokolle vom FHEM Modul berücksichtigt werden. Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=18343</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=18343"/>
		<updated>2017-01-07T00:31:19Z</updated>

		<summary type="html">&lt;p&gt;Sidey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digialen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[SIGNALduino]] unterstützt den gleichnamigen Low-Cost Empfänger für digitale Signale, ähnlich einem [[CUL]]. Der SIGNALduino (Hardware) basiert auf einem Arduino. Hauptsächlich wurde er für den [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] entwickelt. Es stehen jedoch auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 Mhz. Wer einen Mikrocontroller mit 8 Mhz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Er wird hauptsächlich über den USB Port angeschlossen, kann aber auch mit Zusätzlichen ESP Modulen über ein WLAN angebunden werden. Die Schaltung entspricht der des [[FHEMduino]]. &lt;br /&gt;
In Arbeit ist auch eine Variante zum [[Selbstbau_CUL]]. &lt;br /&gt;
Und ebenso eine Variante, die auf einem [[ESP8266]] nativ läuft.&lt;br /&gt;
&lt;br /&gt;
# Das Modul wird stetig weiterentwickelt&lt;br /&gt;
# Das Modul gibt bei Bedarf sehr viele Meldungen ins Logfile, in den Normaleinstellungen verhält es sich aber relativ ruhig.&lt;br /&gt;
&lt;br /&gt;
== Was macht dieser SIGNALduino? ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|SIGNAL(FHEM)duino Schaltplan]]  &lt;br /&gt;
Digitale Signale anhand von Mustern erkennen und zum Auswerten an FHEM weitergeben, dort können die Daten dann dekodiert werden.&lt;br /&gt;
Zwischenzeitlich gibt der Arduino alle erkannten Signale an FHEM weiter, dies hilft um vor allem Signale zu finden, die noch nicht bekannt sind.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Arduino mit 433 Mhz Empfänger an einen Fhem Server anschließen und IT Steckdosen empfangen / schalten&lt;br /&gt;
&lt;br /&gt;
Das System ist jedoch nicht auf 433 Mhz beschränkt. Es funktioniert auch mit anderen Frequenzen oder Medien, z.B. auch mit Infrarot oder direkt angebunden via Draht.&lt;br /&gt;
&lt;br /&gt;
== Worin liegt der Vorteil zu einem CUL oder FHEMduino? ==&lt;br /&gt;
Der vorteil besteht darin, dass man sehr schnell das Funksignal demodulieren kann. &lt;br /&gt;
Wer Lust hat weitere  Protokolle zu dekodieren, braucht dazu nur ein passendes FHEM Modul entwickeln oder ein universelles Modul erweitern. Änderungen am Arduino Code sind &amp;quot;eigentlich&amp;quot; nicht notwendig, dadurch skaliert das System gut.&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeit: Wer einen Wettersensor dekodieren möchte, muss ja erst mal feststellen, was der Sensor sendet. Dazu kann man den SIGNALduino auch an den Sendeausgang des Sensors anbinden und empfängt die digitalen Signale. Bitte achtet aber auf die passenden Spannungen, bevor ihr eine solche Schaltung vornehmt. Ein Arduino Nano verträgt 5V.&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit eine Unterstützung für den Betrieb mit Fhem. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen wenn der SIGNALduino mal läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochon eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhel HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|FA21RF||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|SOMFY RTS||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Wie muss der Arduino verkabelt werden?&lt;br /&gt;
Die Verkabelung ist Identisch zum [[FHEMduino]]&lt;br /&gt;
&lt;br /&gt;
Des weiteren benötigt man neben dem Arduino ein Sendemodul und auch ein Empfangsmodul.&lt;br /&gt;
Für gut befunden sind z.B. ein RXB6 Modul um 433 Mhz Signale empfangen zu können.&lt;br /&gt;
&lt;br /&gt;
== Bauanleitung und Teileliste ==&lt;br /&gt;
&lt;br /&gt;
Benötigt wird ein Arduino Nano, Uno oder mini. Zu empfehlen ist der Nano.&lt;br /&gt;
An den Nano, werden Empfänger und Sendeeinheit angeschlossen.&lt;br /&gt;
Als weitere Komponenten benötigt man einen Sender und Empfänger im gewünschten Frequenzspektrum. Hierzu kann auch eine bestehende Wetterstation oder Funkfernbedienung ausgeschlachtet werden.&lt;br /&gt;
&lt;br /&gt;
Durch die geringe Anzahl an Bauteilen lässt sich das System sehr gut auf einer Lochrasterplatine aufbauen und ist somit auch für Anwender, die mit dem Aufbau von Schaltungen weniger bewandert sind, leicht zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anbei eine Auswahl häufig verwendeter Komponenten. Diese sind alle (z.B. auf Ebay) leicht zu finden:&lt;br /&gt;
* Arduino Nano V3.0 ATmega328P 5V 16M &lt;br /&gt;
* 433 Mhz Transmitter FS1000A  (dieser wird in der Regel mit einem Empfänger XY-MK-5V angeboten. Der Empfänger ist jedoch relativ unbrauchbar)&lt;br /&gt;
* 433 Mhz Empfänger RXB-6 oder alternativ auch RXB-8&lt;br /&gt;
* 433MHz Helix Antenne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann auch geladen werden. Dazu folgende Befehle in Fhem ausführen:&lt;br /&gt;
&lt;br /&gt;
1. FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
2. SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen. Im Log File seht ihr, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
&lt;br /&gt;
Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB Anschlusses muss natürlich an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define sduino SIGNALduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der SIGNALduino Firmware ==&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem ist der SIGNALduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware Dateien wechseln.&lt;br /&gt;
 &lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde).&lt;br /&gt;
&lt;br /&gt;
== Daten aus dem Logfile erklärt ==&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird:&lt;br /&gt;
&lt;br /&gt;
Unknown Code, so oder ähnlich bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul existiert, welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu Zusätzlichen Unknown code Einträgen.&lt;br /&gt;
Diese Einträge können mit dem Attribut WhitelistID minimiert werden. Geräte, welche ihr empfangen wollt, könnt ihr in die WhitelistID aufnehmen. Die Geräte werden dadurch anhand einer Protokollnummer identifiziert. Diese kann der obigen Tabelle zum Teil entnommen werden. Hilfreich ist es auch, wenn ihr in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachseht. Diese sind teilweise nach folgendem Schema aufgebaut: &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; W50 bedeutet dann Protokoll #50.&lt;br /&gt;
Ist der Aufbau nicht so, hilft noch ein Blick in den Quellcode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MS - Nachricht mit Sync Puls: Es wurde eine Signal empfangen. P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. 15 Bedeutet es wurde ein Signalpegel (1) 395 Mikrosekundenhigh und Anschließend (5) 8916 Mikrosekunden low gemessen. CP=1 ist die Referenz auf den Takt des Signales. Getaktet wird in diesem Fall mit ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MC - Nachricht vom Typ Manchester: Manchester Kodierte Signale, können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht.&lt;br /&gt;
Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist.&lt;br /&gt;
Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mein Gerät wird in FHEM nicht erkannt ==&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ==&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend Notwendig um seine Anforderungen zu erfüllen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Schalter bzw. Sensoren die nur zwei Zustände kennen geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden. Der Name eures SIGNALduino eventuell auch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich etwas Senden ==&lt;br /&gt;
Der SIGNALduino kann etwas senden, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert.&lt;br /&gt;
Genannt &amp;quot;raw senden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um in der FHEM Kommandozeile etwas zu senden muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
&lt;br /&gt;
== Es erscheinen viele Logmeldungen für Geräte die ich nicht habe ==&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele dieser Logmeldungen können durch Setzen des &#039;&#039;verbose&#039;&#039; Levels auf den Wert &#039;&#039;3&#039;&#039; unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Dennoch kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;whitelistIDs&#039;&#039; erlaubt es, anzugeben, welche Protokolle vom FHEM Modul berücksichtigt werden. Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
* [http://www.nemcon.nl/blog2/wiring Beschreibung zu diversen Empfängern und Verbesserung der Empfangsleistung]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:Hardware]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=18342</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=18342"/>
		<updated>2017-01-07T00:23:54Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Bauanleitung, aktuelle Links und Informationen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digialen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[SIGNALduino]] unterstützt den gleichnamigen Low-Cost Empfänger für digitale Signale, ähnlich einem [[CUL]]. Der SIGNALduino (Hardware) basiert auf einem Arduino. Hauptsächlich wurde er für den [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] entwickelt. Es stehen jedoch auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 Mhz. Wer einen Mikrocontroller mit 8 Mhz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Er wird hauptsächlich über den USB Port angeschlossen, kann aber auch mit Zusätzlichen ESP Modulen über ein WLAN angebunden werden. Die Schaltung entspricht der des [[FHEMduino]]. &lt;br /&gt;
In Arbeit ist auch eine Variante zum [[Selbstbau_CUL]]. &lt;br /&gt;
Und ebenso eine Variante, die auf einem [[ESP8266]] nativ läuft.&lt;br /&gt;
&lt;br /&gt;
# Das Modul wird stetig weiterentwickelt&lt;br /&gt;
# Das Modul gibt bei Bedarf sehr viele Meldungen ins Logfile, in den Normaleinstellungen verhält es sich aber relativ ruhig.&lt;br /&gt;
&lt;br /&gt;
== Was macht dieser SIGNALduino? ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|SIGNAL(FHEM)duino Schaltplan]]  &lt;br /&gt;
Digitale Signale anhand von Mustern erkennen und zum Auswerten an FHEM weitergeben, dort können die Daten dann dekodiert werden.&lt;br /&gt;
Zwischenzeitlich gibt der Arduino alle erkannten Signale an FHEM weiter, dies hilft um vor allem Signale zu finden, die noch nicht bekannt sind.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Arduino mit 433 Mhz Empfänger an einen Fhem Server anschließen und IT Steckdosen empfangen / schalten&lt;br /&gt;
&lt;br /&gt;
Das System ist jedoch nicht auf 433 Mhz beschränkt. Es funktioniert auch mit anderen Frequenzen oder Medien, z.B. auch mit Infrarot oder direkt angebunden via Draht.&lt;br /&gt;
&lt;br /&gt;
== Worin liegt der Vorteil zu einem CUL oder FHEMduino? ==&lt;br /&gt;
Der vorteil besteht darin, dass man sehr schnell das Funksignal demodulieren kann. &lt;br /&gt;
Wer Lust hat weitere  Protokolle zu dekodieren, braucht dazu nur ein passendes FHEM Modul entwickeln oder ein universelles Modul erweitern. Änderungen am Arduino Code sind &amp;quot;eigentlich&amp;quot; nicht notwendig, dadurch skaliert das System gut.&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeit: Wer einen Wettersensor dekodieren möchte, muss ja erst mal feststellen, was der Sensor sendet. Dazu kann man den SIGNALduino auch an den Sendeausgang des Sensors anbinden und empfängt die digitalen Signale. Bitte achtet aber auf die passenden Spannungen, bevor ihr eine solche Schaltung vornehmt. Ein Arduino Nano verträgt 5V.&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit eine Unterstützung für den Betrieb mit Fhem. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen wenn der SIGNALduino mal läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochon eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhel HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|FA21RF||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|SOMFY RTS||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Wie muss der Arduino verkabelt werden?&lt;br /&gt;
Die Verkabelung ist Identisch zum [[FHEMduino]]&lt;br /&gt;
&lt;br /&gt;
Des weiteren benötigt man neben dem Arduino ein Sendemodul und auch ein Empfangsmodul.&lt;br /&gt;
Für gut befunden sind z.B. ein RXB6 Modul um 433 Mhz Signale empfangen zu können.&lt;br /&gt;
&lt;br /&gt;
== Bauanleitung und Teileliste ==&lt;br /&gt;
&lt;br /&gt;
Benötigt wird ein Arduino Nano, Uno oder mini. Zu empfehlen ist der Nano.&lt;br /&gt;
An den Nano, werden Empfänger und Sendeeinheit angeschlossen.&lt;br /&gt;
Als weitere Komponenten benötigt man einen Sender und Empfänger im gewünschten Frequenzspektrum. Hierzu kann auch eine bestehende Wetterstation oder Funkfernbedienung ausgeschlachtet werden.&lt;br /&gt;
&lt;br /&gt;
Durch die geringe Anzahl an Bauteilen lässt sich das System sehr gut auf einer Lochrasterplatine aufbauen und ist somit auch für Anwender, die mit dem Aufbau von Schaltungen weniger bewandert sind, leicht zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Anbei eine Auswahl häufig verwendeter Komponenten. Diese sind alle (z.B. auf Ebay) leicht zu finden:&lt;br /&gt;
# Arduino Nano V3.0 ATmega328P 5V 16M &lt;br /&gt;
# 433 Mhz Transmitter FS1000A  (dieser wird in der Regel mit einem Empfänger XY-MK-5V angeboten. Der Empfänger ist jedoch relativ unbrauchbar)&lt;br /&gt;
# 433 Mhz Empfänger RXB-6 oder alternativ auch RXB-8&lt;br /&gt;
# 433MHz Helix Antenne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann auch geladen werden. Dazu folgende Befehle in Fhem ausführen:&lt;br /&gt;
&lt;br /&gt;
1. FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
2. SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen. Im Log File seht ihr, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
&lt;br /&gt;
Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB Anschlusses muss natürlich an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define sduino SIGNALduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der SIGNALduino Firmware ==&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem ist der SIGNALduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware Dateien wechseln.&lt;br /&gt;
 &lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde).&lt;br /&gt;
&lt;br /&gt;
== Daten aus dem Logfile erklärt ==&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird:&lt;br /&gt;
&lt;br /&gt;
Unknown Code, so oder ähnlich bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul existiert, welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu Zusätzlichen Unknown code Einträgen.&lt;br /&gt;
Diese Einträge können mit dem Attribut WhitelistID minimiert werden. Geräte, welche ihr empfangen wollt, könnt ihr in die WhitelistID aufnehmen. Die Geräte werden dadurch anhand einer Protokollnummer identifiziert. Diese kann der obigen Tabelle zum Teil entnommen werden. Hilfreich ist es auch, wenn ihr in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachseht. Diese sind teilweise nach folgendem Schema aufgebaut: &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; W50 bedeutet dann Protokoll #50.&lt;br /&gt;
Ist der Aufbau nicht so, hilft noch ein Blick in den Quellcode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MS - Nachricht mit Sync Puls: Es wurde eine Signal empfangen. P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. 15 Bedeutet es wurde ein Signalpegel (1) 395 Mikrosekundenhigh und Anschließend (5) 8916 Mikrosekunden low gemessen. CP=1 ist die Referenz auf den Takt des Signales. Getaktet wird in diesem Fall mit ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MC - Nachricht vom Typ Manchester: Manchester Kodierte Signale, können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht.&lt;br /&gt;
Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist.&lt;br /&gt;
Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mein Gerät wird in FHEM nicht erkannt ==&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ==&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend Notwendig um seine Anforderungen zu erfüllen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Schalter bzw. Sensoren die nur zwei Zustände kennen geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden. Der Name eures SIGNALduino eventuell auch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich etwas Senden ==&lt;br /&gt;
Der SIGNALduino kann etwas senden, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert.&lt;br /&gt;
Genannt &amp;quot;raw senden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um in der FHEM Kommandozeile etwas zu senden muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
&lt;br /&gt;
== Es erscheinen viele Logmeldungen für Geräte die ich nicht habe ==&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele dieser Logmeldungen können durch Setzen des &#039;&#039;verbose&#039;&#039; Levels auf den Wert &#039;&#039;3&#039;&#039; unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Dennoch kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;whitelistIDs&#039;&#039; erlaubt es, anzugeben, welche Protokolle vom FHEM Modul berücksichtigt werden. Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Foren Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=58396|LinkText=SIGNALDuino Empfänger Firm- und Hardware}}&lt;br /&gt;
* {{Link2Forum|Topic=58397|LinkText=Signalduino Entwicklung Version 3.3.1 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;br /&gt;
[[Kategorie:Hardware]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=18341</id>
		<title>SIGNALduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIGNALduino&amp;diff=18341"/>
		<updated>2017-01-07T00:09:18Z</updated>

		<summary type="html">&lt;p&gt;Sidey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang und Verarbeitung von digialen Signalen&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModFTopic=38402&lt;br /&gt;
|ModCmdRef=SIGNALduino&lt;br /&gt;
|ModForumArea=Sonstige Systeme&lt;br /&gt;
|ModTechName=00_SIGNALduino.pm&lt;br /&gt;
|ModOwner=Sidey ({{Link2FU|8018|Forum}}/[[Benutzer Diskussion:Sidey|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[SIGNALduino]] unterstützt den gleichnamigen Low-Cost Empfänger für digitale Signale, ähnlich einem [[CUL]]. Der SIGNALduino (Hardware) basiert auf einem Arduino. Hauptsächlich wurde er für den [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] entwickelt. Es stehen jedoch auch für den [https://www.arduino.cc/en/Main/arduinoBoardUno UNO] und [https://www.arduino.cc/en/Main/ArduinoBoardProMini PRO Mini] Firmware Dateien zur Verfügung. Die ausgelieferte Firmware läuft nur auf Mikrocontrollern mit 16 Mhz. Wer einen Mikrocontroller mit 8 Mhz verwenden möchte, muss die Firmware selbst compilieren.&lt;br /&gt;
&lt;br /&gt;
Er wird derzeit über den USB Port angeschlossen. Die Schaltung entspricht der des [[FHEMduino]]. &lt;br /&gt;
In Arbeit ist auch eine Variante zum [[Selbstbau_CUL]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Das Modul wird stetig weiterentwickelt&lt;br /&gt;
# Das Modul gibt bei Bedarf sehr viele Meldungen ins Logfile, in den Normaleinstellungen verhält es sich aber relativ ruhig.&lt;br /&gt;
&lt;br /&gt;
== Was macht dieser SIGNALduino? ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|SIGNAL(FHEM)duino Schaltplan]]  &lt;br /&gt;
Digitale Signale anhand von Mustern erkennen und zum Auswerten an FHEM weitergeben, dort können die Daten dann dekodiert werden.&lt;br /&gt;
Zwischenzeitlich gibt der Arduino alle erkannten Signale an FHEM weiter, dies hilft um vor allem Signale zu finden, die noch nicht bekannt sind.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Arduino mit 433 Mhz Empfänger an einen Fhem Server anschließen und IT Steckdosen empfangen / schalten&lt;br /&gt;
&lt;br /&gt;
Das System ist jedoch nicht auf 433 Mhz beschränkt. Es funktioniert auch mit anderen Frequenzen oder Medien, z.B. auch mit Infrarot oder direkt angebunden via Draht.&lt;br /&gt;
&lt;br /&gt;
== Worin liegt der Vorteil zu einem CUL oder FHEMduino? ==&lt;br /&gt;
Der vorteil besteht darin, dass man sehr schnell das Funksignal demodulieren kann. &lt;br /&gt;
Wer Lust hat weitere  Protokolle zu dekodieren, braucht dazu nur ein passendes FHEM Modul entwickeln oder ein universelles Modul erweitern. Änderungen am Arduino Code sind &amp;quot;eigentlich&amp;quot; nicht notwendig, dadurch skaliert das System gut.&lt;br /&gt;
&lt;br /&gt;
Andere Möglichkeit: Wer einen Wettersensor dekodieren möchte, muss ja erst mal feststellen, was der Sensor sendet. Dazu kann man den SIGNALduino auch an den Sendeausgang des Sensors anbinden und empfängt die digitalen Signale. Bitte achtet aber auf die passenden Spannungen, bevor ihr eine solche Schaltung vornehmt. Ein Arduino Nano verträgt 5V.&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit eine Unterstützung für den Betrieb mit Fhem. Die Geräte werden [[autocreate|automatisch erkannt]] und in der Konfiguration eingetragen wenn der SIGNALduino mal läuft.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt &lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden &lt;br /&gt;
! Hinweise &lt;br /&gt;
! Verwendetes Modul &lt;br /&gt;
! Protokoll ID&lt;br /&gt;
|-&lt;br /&gt;
|TCM Wetterstation (97001 und 21xxx Serie)||E|| || CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|ABS Wetterstation (ABS 700)||E|| || CUL_TCM97001  || 0&lt;br /&gt;
|-&lt;br /&gt;
|Prologue Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Rubicson Wetterstation ||E|| ||CUL_TCM97001 ||0 &lt;br /&gt;
|-&lt;br /&gt;
|NC_WS Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.gt-support.de/ GT-WT-02 Wetterstation]||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|AURIOL Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Mebus Wetterstation ||E|| ||CUL_TCM97001 || 0&lt;br /&gt;
|-&lt;br /&gt;
|Intertechno Funkschalter||E S|| ||IT || 3,4,5,17&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;strike&amp;gt;Conrad RSL Funkschalter&amp;lt;/strike&amp;gt;||E S|| Funktioniert aktuell nicht || SIGNALduino_RSL  || &lt;br /&gt;
|-&lt;br /&gt;
|[http://global.oregonscientific.com/product_view.php?id=5 Oregon Scientific Wettersensoren]||E || Protokoll V2 &amp;amp; V3 implementiert || OREGON || 10&lt;br /&gt;
|-&lt;br /&gt;
|Bresser Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|[https://de.hama.com/00104985/hama-aussensensor-ts33c-fuer-wetterstation Hama TS33C]||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|TFA Temp/Hydro Sensor||E || || Hideki || 12&lt;br /&gt;
|-&lt;br /&gt;
|Lacrosse TX2/TX3 Sensoren||E || || CUL_TX || 8&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30320902||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|Eurochon eas800z||E || || SD_WS07  || 7&lt;br /&gt;
|-&lt;br /&gt;
|Technoline WS6750/TX70DTH||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|FreeTec Außenmodul NC-7344||E || || SD_WS07 || 7&lt;br /&gt;
|-&lt;br /&gt;
|CTW600||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|WH1080||E || || SD_WS09 || 9&lt;br /&gt;
|-&lt;br /&gt;
|Visivon remote pt4450||E || || none || 24&lt;br /&gt;
|-&lt;br /&gt;
|Einhel HS 434/6||E || || none || 21&lt;br /&gt;
|-&lt;br /&gt;
|FA21RF||E || || none || 13&lt;br /&gt;
|-&lt;br /&gt;
|mumbi m-FS300||E || || none || 26,27&lt;br /&gt;
|-&lt;br /&gt;
|TFA 30.3200||E || || none || 33&lt;br /&gt;
|-&lt;br /&gt;
|Livolo||E|| || none || 20&lt;br /&gt;
|-&lt;br /&gt;
|Smartwares SH5-TSO-A||E S|| || IT || ?&lt;br /&gt;
|-&lt;br /&gt;
|X10 Security Devices||E|| ||  || 39&lt;br /&gt;
|-&lt;br /&gt;
|SOMFY RTS||E S|| || SOMFY || 43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Wie muss der Arduino verkabelt werden?&lt;br /&gt;
Die Verkabelung ist Identisch zum [[FHEMduino]]&lt;br /&gt;
&lt;br /&gt;
Des weiteren benötigt man neben dem Arduino ein Sendemodul und auch ein Empfangsmodul.&lt;br /&gt;
Für gut befunden sind z.B. ein RXB6 Modul um 433 Mhz Signale empfangen zu können.&lt;br /&gt;
&lt;br /&gt;
== Bauanleitung und Teileliste ==&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Die SIGNALduino Module werden über das FHEM [[update]] verteilt. &lt;br /&gt;
&lt;br /&gt;
Die in der Entwicklung befindliche Version kann auch geladen werden. Dazu folgende Befehle in Fhem ausführen:&lt;br /&gt;
&lt;br /&gt;
1. FHEM aktualisieren: &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; &lt;br /&gt;
2. SIGNALduino Modul und Firmware aktualisieren: &amp;lt;code&amp;gt;update all &amp;lt;nowiki&amp;gt;https://raw.githubusercontent.com/RFD-FHEM/RFFHEM/dev-r33/controls_signalduino.txt&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Durch das Update von FHEM wird sichergestellt, dass das Modul mit FHEM arbeitet. Außerdem wird auch die Firmware geladen. Im Log File seht ihr, wo diese hinkopiert wurden: z.B. nach FHEM/firmware/SIGNALduino_nano328.hex&lt;br /&gt;
&lt;br /&gt;
Danach kann das Gerät wie folgt definiert werden (die Spezifikation des USB Anschlusses muss natürlich an die aktuellen Gegebenheiten angepasst werden):&lt;br /&gt;
:&amp;lt;code&amp;gt;define sduino SIGNALduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@57600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der SIGNALduino, falls er erkannt wird, im Status &amp;quot;Opened&amp;quot; angezeigt. &lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der SIGNALduino Firmware ==&lt;br /&gt;
Falls avrdude noch nicht vorhanden ist, kann es mit folgendem Befehl installiert werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem ist der SIGNALduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden. Jetzt müssen wir FHEM noch mitteilen, welche Hardware wir angeschlossen haben. Über das Attribut &#039;&#039;hardware&#039;&#039; lässt sich zwischen den mitgelieferten Firmware Dateien wechseln.&lt;br /&gt;
 &lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr sduino hardware nano328&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend kann der &#039;&#039;flash&#039;&#039; Befehl abgesetzt werden: &lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash &amp;lt;/code&amp;gt;&lt;br /&gt;
Dadurch wird der Arduino mit der gewählten Firmware geflasht. Das Ergebnis wird im Webinterface direkt angezeigt.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann auch der Flash-Befehl mit einem Dateinamen aufgerufen werden. Diese Möglichkeit sollte jedoch nur verwendet werden, wenn die SIGNALduino Firmware selbst compiliert wurde und eine andere Hardware verwendet wird. Der Flash-Befehl wird wie folgt aufgerufen:&lt;br /&gt;
:&amp;lt;code&amp;gt;set sduino flash FHEM/firmware/SIGNALduino_mega2560.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
(je nachdem wo und unter welchem Namen die .hex Datei abgelegt wurde).&lt;br /&gt;
&lt;br /&gt;
== Daten aus dem Logfile erklärt ==&lt;br /&gt;
Im Logfile ab [[Verbose]] 4 tauchen diverse Meldungen auf, deren Bedeutung kurz erläutert wird:&lt;br /&gt;
&lt;br /&gt;
Unknown Code, so oder ähnlich bedeutet, dass der SIGNALduino Signaldaten empfangen und diese binär interpretiert hat. Diese Meldung soll uns nun aber mitteilen, dass es dann nicht weiter verarbeitet werden kann, da kein Modul existiert, welches diese Daten jetzt in ihre Bedeutung umwandeln kann. &lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;sduino: Unknown code u1FFFFF0, help me!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile sind über 50 Protokolle für den SIGNALduino definiert. Dadurch kommt es vor, dass sich ein Signal mit mehr als einem Protokoll demodulieren lässt. Meist führt dies dann zu Zusätzlichen Unknown code Einträgen.&lt;br /&gt;
Diese Einträge können mit dem Attribut WhitelistID minimiert werden. Geräte, welche ihr empfangen wollt, könnt ihr in die WhitelistID aufnehmen. Die Geräte werden dadurch anhand einer Protokollnummer identifiziert. Diese kann der obigen Tabelle zum Teil entnommen werden. Hilfreich ist es auch, wenn ihr in den verwendeten Geräten im Internal &amp;lt;gerätename&amp;gt;_DMSG nachseht. Diese sind teilweise nach folgendem Schema aufgebaut: &amp;lt;code&amp;gt;W50#FF553335FFBC&amp;lt;/code&amp;gt; W50 bedeutet dann Protokoll #50.&lt;br /&gt;
Ist der Aufbau nicht so, hilft noch ein Blick in den Quellcode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MS - Nachricht mit Sync Puls: Es wurde eine Signal empfangen. P0-P6 sind die Signalpegel (Dauer und positiv/negativ). Hinter D= befindet sich die Abfolge der Signale. 15 Bedeutet es wurde ein Signalpegel (1) 395 Mikrosekundenhigh und Anschließend (5) 8916 Mikrosekunden low gemessen. CP=1 ist die Referenz auf den Takt des Signales. Getaktet wird in diesem Fall mit ~395 Mikrosekunden. SP=5 gibt die Referenz zum Syncpuls an. Welche Signalfolge nun eine binäre 1 bzw. 0 bedeutet, wird im SIGNALduino über die integrierte Protokoll Liste realisiert.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MS;P0=-108;P1=395;P2=-1033;P3=-547;P4=-19932;P5=-8916;P6=1368;D=151313131312131313131313131313131312121212121313131313131312131212132;CP=1;SP=5;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MC - Nachricht vom Typ Manchester: Manchester Kodierte Signale, können bereits sehr einfach im Arduino in eine Binärform umgewandelt werden. Es wird hier nach IEEE 802.3 umgewandelt. In Manchester Signalen gibt es lange und kurze Pulse. Deren Durchschnittswert wird mit LL (long low), LH (long high), SL (short low) und SH (short high) übermittelt. Zusätzlich, um das Protokoll schneller erkennen zu können, wird die Taktfrequenz mit übermittelt (C=429 Mikrosekunden). Die Daten befinden sich hinter D= und werden in HEX Form übergeben.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MC;LL=-1066;LH=904;SL=-562;SH=385;D=332B4B4D54D5554B552CD2D554B2B5354A;C=429;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MU - Message unsynced: Diese Art von Nachrichten, sind nicht nach Manchester codiert und haben auch keinen erkennbaren Sync / Clock Signalpegel am Start der Nachricht.&lt;br /&gt;
Bei diesen Nachrichtentypen ist es, im Vergleich zu den anderen, am wahrscheinlichsten, dass das übermittelte Signal unvollständig oder überhaupt kein Signal ist.&lt;br /&gt;
Wie bei MS sind P0-P6 die Signalpegel und in D= wird die Abfolge der Signalpegel referenziert. CP=2 gibt auch hier die Referenz zum Takt an, allerdings muss dieser nicht korrekt erkannt worden sein.&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;code&amp;gt;MU;P0=1372;P1=-580;P2=362;P3=-1047;D=01212321212321212121212121212123212123212321232121212121212321;CP=2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mein Gerät wird in FHEM nicht erkannt ==&lt;br /&gt;
1. Prüfen, ob vom Sensor die Signaldaten (verbose &amp;gt;=4) erkannt werden. Sobald ihr die empfangenen Signaldaten im Logfile zuordnen könnt, geht es weiter mit:&lt;br /&gt;
&lt;br /&gt;
2. Eröffnet ein Thema unter [https://github.com/RFD-FHEM/RFFHEM/issues github] nach folgendem Muster:&lt;br /&gt;
:&#039;&#039;Thema :  Protokoll für &amp;lt;Das verwendete Gerät&amp;gt;&lt;br /&gt;
:Inhalt:  Eure Hardware z.B. Arduino Nano mit XYZ Empfänger, oder Arduino Nano direkt an Gerät x&lt;br /&gt;
Auszug aus dem Logfile, welches zum Gerät gehört.&lt;br /&gt;
:&#039;&#039;Alles was ihr sonst noch über das Gerät und die übertragenen Daten wisst.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr auch im Forum posten. Um einzelne Erweiterungen besser im Überblick zu behalten, eignet sich das github jedoch besser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Es wird ein Protokoll erkannt, Autocreate legt aber kein device an ==&lt;br /&gt;
Im SIGNALduino sind &amp;gt;30 Protokolle implementiert. Jedoch gibt es nur wenige Module, welche diese Protokolle verarbeiten.&lt;br /&gt;
Teilweise ist das auch nicht zwingend Notwendig um seine Anforderungen zu erfüllen.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Schalter bzw. Sensoren die nur zwei Zustände kennen geht es meist ohne Modul und automatisch angelegtem Gerät.&lt;br /&gt;
&lt;br /&gt;
Nehmen wir an, wir haben einen Schalter. Dieser kann einen oder zwei Zustände senden&lt;br /&gt;
Im FHEM Log tauchen Meldungen ähnlich dieser auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
2015.11.15 15:52:23 4: SIGNALduino_unknown incomming msg: u85#FF8081&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wir können mit Hilfe des Modules DOIF auf diese Nachricht eine Aktion ausführen:&lt;br /&gt;
&lt;br /&gt;
Entweder, wenn wir den Inhalt der Nachricht nur zu teilen wissen, da er sich ändert:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] =~ &amp;quot;u85#FF8081&amp;quot;) (set Lamp on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, wenn wir den Inhalt exakt kennen, dann auch als Vergleichsstring&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
define mydoif DOIF ([sduino:&amp;amp;DMSG] eq &amp;quot;u85#FF8081&amp;quot;) (set relais on)&lt;br /&gt;
attr mydoif do always&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Teil u85#FF8081 muss individuell angepasst werden. Der Name eures SIGNALduino eventuell auch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wie kann ich etwas Senden ==&lt;br /&gt;
Der SIGNALduino kann etwas senden, indem ihm das SIGNAL so übermittelt wird, wie er es moduliert.&lt;br /&gt;
Genannt &amp;quot;raw senden&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Um in der FHEM Kommandozeile etwas zu senden muss der Befehl wie folgt eingegeben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino raw SR;;R=3;;P0=4742;;P1=-1554;;P2=286;;P3=-786;;P4=649;;P5=-420;;D=0123234545234545452323232323454523234523454523232345454523232323452345234523452345;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
R=3 bedeutet das Signal wird 3x gesendet.&lt;br /&gt;
Die Übertragung besteht aus den in D angegeben Pulsen, welche in P0-P5 definiert werden.&lt;br /&gt;
Die Daten kann man aus einer empfangenen MS oder MU Nachricht extrahieren.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann ab Version 3.2 auch eine vereinfachte Form eingegeben werden.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
set sduino sendMsg P3#00111010#R4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Moduliert die Bitfolge 00111010 mittels Protokoll #3 und wiederholt die Nachricht 4x.&lt;br /&gt;
&lt;br /&gt;
== Es erscheinen viele Logmeldungen für Geräte die ich nicht habe ==&lt;br /&gt;
Es erscheinen viele Meldungen dieser Art:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fingerprint for MU Protocol id xxxx -&amp;gt; yyy matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 28 -&amp;gt; IC Ledspot matches, trying to demodulate&lt;br /&gt;
sduino: Starting demodulation at Position 1&lt;br /&gt;
Fingerprint for MU Protocol id 29 -&amp;gt; HT12e remote matches, trying to demodulate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viele dieser Logmeldungen können durch Setzen des &#039;&#039;verbose&#039;&#039; Levels auf den Wert &#039;&#039;3&#039;&#039; unterdrückt werden.&lt;br /&gt;
&lt;br /&gt;
Dennoch kommt es gehäuft zu Logmeldungen und auch Events in ähnlicher Form:&lt;br /&gt;
:&amp;lt;code&amp;gt;SIGNALduino_unknown incomming msg: u85#FF8081&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Attribut &#039;&#039;whitelistIDs&#039;&#039; erlaubt es, anzugeben, welche Protokolle vom FHEM Modul berücksichtigt werden. Für Protokolle, die nicht berücksichtigt werden, gibt es weder Logeinträge noch Events. Diese werden im Programmablauf nicht berücksichtigt. Das spart zum einen Ressourcen und trägt auch zur Übersichtlichkeit bei. Die Angabe erfolgt durch Komma getrennt: z.B.:&lt;br /&gt;
:&amp;lt;code&amp;gt;1,2,5,10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Externe Links ==&lt;br /&gt;
* {{Link2Forum|Topic=38402|LinkText=Forenthread - Ankündigung}}&lt;br /&gt;
* {{Link2Forum|Topic=38831|LinkText=Forumsdiskussion zur Weiterentwicklung}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FHEMduino&amp;diff=18340</id>
		<title>FHEMduino</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FHEMduino&amp;diff=18340"/>
		<updated>2017-01-07T00:07:48Z</updated>

		<summary type="html">&lt;p&gt;Sidey: Aktuellen Stand zu Entwicklung und Alternative beschrieben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Empfang von 433 Mhz Funksignalen&lt;br /&gt;
|ModType=contrib&lt;br /&gt;
|ModFTopic=17196&lt;br /&gt;
&amp;lt;!--|ModCmdRef=ContribModul --&amp;gt;&lt;br /&gt;
|ModForumArea=Bastelecke&lt;br /&gt;
|ModTechName=00_FHEMduino.pm&lt;br /&gt;
|ModOwner=mdorenka ({{Link2FU|3294|Forum}}/[[Benutzer Diskussion:Mdorenka|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
[[Datei:Fhemduino.png|200px|thumb|right|FHEMduino im EasyBox Gehäuse]]&lt;br /&gt;
Der FHEMduino ist ein Low-Cost Funk Empfänger, der auf einem [http://arduino.cc/de/Main/ArduinoBoardNano Arduino Nano] basiert. Er wird mittels USB angeschlossen und ist primär dazu konzipiert, im 433MHz-Bereich zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Der FHEMduino wird seit einiger Zeit nicht mehr weiter entwickelt.&lt;br /&gt;
&lt;br /&gt;
Mit [[SIGNALduino]] gibt es eine weiterentwickelte Version dieses Konzeptes. Die Hardware kann 1:1 weiterverwendet werden, jedoch unterstützt der SIGNALduino eine größere Anzahl an Funkprotokollen und muss auch nicht selbst compiliert werden.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[Datei:Fhemduino_schematic.png|200px|thumb|right|FHEMduino Schaltplan]]&lt;br /&gt;
Der FHEMduino basiert auf dem Arduino Nano. Die Wahl fiel hier auf den Nano, da dieser sehr klein ist und in einem DIL30-Sockel gesockelt werden kann. Ein weiterer Vorteil ist, dass wenn das entsprechende Hostsystem (beispielsweise ein [[Raspberry Pi]]) mächtig genug ist, der FHEMduino aus der Ferne programmiert werden kann. Die Stromversorgung erfolgt vollständig via USB. Als weitere Komponenten benötigt man einen Sender und Empfänger im gewünschten Frequenzspektrum. Hierzu kann auch eine bestehende Wetterstation oder Funkfernbedienung ausgeschlachtet werden.&lt;br /&gt;
&lt;br /&gt;
Durch die geringe Anzahl an Bauteilen lässt sich der FHEMduino sehr gut auf einer Lochrasterplatine aufbauen und ist somit auch für Anwender, die mit dem Aufbau von Schaltungen weniger bewandert sind, gut bewältigbar.&lt;br /&gt;
&lt;br /&gt;
Anbei eine Auswahl häufig verwendeter Komponenten. Diese sind alle (z.B. auf ebay) leicht zu finden:&lt;br /&gt;
* Arduino: Nano FT232RL V3.0 ATmega328P 5V 16M USB Micro-controller Board für Arduino ca. 7€&lt;br /&gt;
* Empfänger + Receiver Set: 433 Mhz RF Sender und Empfänger für Arduino Projekte ca. 2€&lt;br /&gt;
* Ein etwas besserer Receiver: Super-heterodyne OOK Wireless Receiver Module Strong Interference 433MHZ-116dBm ca. 3 US$&lt;br /&gt;
* Antenne: es wird ein 17 cm langer Draht benötigt (anlöten)&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Durch das Arduino-Framework können auch Einsteiger die Software um eigene Protokolle erweitern oder Funktionalitäten wie eine Status-LED oder [[1-Wire]]-Module hinzufügen.&lt;br /&gt;
Die Software muss sowohl die serielle Kommunikation als auch den Funkverkehr verarbeiten. Momentan werden lediglich fallende Flanken bei den Funksignalen aufgefangen und via Interrupt ausgewertet. Eine Erweiterung auf steigende Flanken ist jedoch geplant, um somit auch andere Protokolle auswerten zu können. Die Programmierung aus der Ferne kann mittels [http://inotool.org/ Inotool] erledigt werden.&lt;br /&gt;
&lt;br /&gt;
=== FHEM Modul ===&lt;br /&gt;
Die Verarbeitung innerhalb von FHEM funktioniert analog zum CUL Modul. Die beiden zu FHEMduino entwickelten Module sind prinzipiell Kopien bestehender CUL Module.&lt;br /&gt;
Da sich auch die serielle Kommunikation an der des CUL orientiert, ist hier wenig Neuentwicklung nötig gewesen.&lt;br /&gt;
&lt;br /&gt;
== Unterstützte Geräte ==&lt;br /&gt;
Für die folgenden Geräte gibt es derzeit eine Unterstützung für den Betrieb mit Fhem:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Produkt&lt;br /&gt;
! (E)mpfangen&amp;lt;br /&amp;gt;(S)enden&lt;br /&gt;
! Hinweise&lt;br /&gt;
! Modul&lt;br /&gt;
|-&lt;br /&gt;
|PEARL NC7159&lt;br /&gt;
|E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_NZ_WS.pm&lt;br /&gt;
|-&lt;br /&gt;
|LogiLink WS0002&lt;br /&gt;
|E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_NZ_WS.pm&lt;br /&gt;
|-&lt;br /&gt;
|Conrad KW9010&lt;br /&gt;
|E&lt;br /&gt;
|inkl. Prüfsummencheck&lt;br /&gt;
|14_FHEMduino_KW9010.pm&lt;br /&gt;
|-&lt;br /&gt;
|technoline Wetterstation WS 6750/TX70DTH&lt;br /&gt;
|E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_KW9010.pm&lt;br /&gt;
|-&lt;br /&gt;
|LIFETEC&lt;br /&gt;
|E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_KW9010.pm&lt;br /&gt;
|-&lt;br /&gt;
|EZ6 Meteo&lt;br /&gt;
|E&lt;br /&gt;
|mit eigenem Modul; &#039;&#039;momentan nicht integriert&#039;&#039; ([https://docs.google.com/document/d/121ZH3omAZsdhFi3GSB-YdnasMjIQSGIcaS7QW6KsACA/edit Protokolbeschreibung])&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Technoline/Conrad LaCrosse Temperatur / Luftfeuchte Funksensoren TX2/3/4 &lt;br /&gt;
|E&lt;br /&gt;
|mittels des bereits integrierten Moduls in FHEM&lt;br /&gt;
|14_CUL_TX.pm&lt;br /&gt;
|-&lt;br /&gt;
|EUROCHRON/Tchibo&lt;br /&gt;
|E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_EuroChr.pm&lt;br /&gt;
|-&lt;br /&gt;
|Flamingo FA20RF / ELRO RM150RF&lt;br /&gt;
|S/E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_FA20RF.pm&lt;br /&gt;
|-&lt;br /&gt;
|PT2262 (IT / ELRO switches)&lt;br /&gt;
|S/E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_PT2262.pm&lt;br /&gt;
|-&lt;br /&gt;
|Brennenstuhl BR 102-F &lt;br /&gt;
|S/E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_PT2262.pm&lt;br /&gt;
|-&lt;br /&gt;
|DCF-77&lt;br /&gt;
|E&lt;br /&gt;
|&lt;br /&gt;
|14_FHEMduino_DCF77.pm&lt;br /&gt;
|-&lt;br /&gt;
|Intertek (4x Funksteckdose bei Penny für 7 Euro)&lt;br /&gt;
|S/E&lt;br /&gt;
|verbauter Controller 8029-L2S&lt;br /&gt;
|14_FHEMduino_PT2262.pm&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Einbinden in FHEM ==&lt;br /&gt;
Fhem benötigt zunächst die perl Module aus: &lt;br /&gt;
https://github.com/mdorenkamp/fhemduino_modules&lt;br /&gt;
&lt;br /&gt;
Diese werden in das FHEM Verzeichnis kopiert in dem auch alle anderen pm Dateien liegen. z.B. /opt/fhem/FHEM. Das Gerät wird angelegt mit dem Befehl&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define Arduino FHEMduino /dev/serial/ttyUSB0/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
besser (um beim Umstecken des USB-Port das Gerät nicht neu definieren oder Attribute ändern zu müssen) mit Angabe des genauen Namens:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Arduino FHEMduino /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@9600&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nach dem Einbinden wird der FHEMDuino, falls er erkannt wird, im Status &amp;quot;Openend&amp;quot; angezeigt. Erst wenn die richtige Firmware auf dem Arduino ist, wird der Status &amp;quot;Initialized&amp;quot; angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Flashen des Ardunio mit der FHEMDuino Firmware ==&lt;br /&gt;
# Falls avrdude noch nicht vorhanden ist kann man das z.B. so auf dem Fhem installieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install avrdude&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. Fhemduino Sourcen laden&lt;br /&gt;
::https://github.com/mdorenkamp/fhemduino&lt;br /&gt;
&lt;br /&gt;
:3. Arduino IDE unter Windows/Linux mit grafischer Oberfläche installieren:&lt;br /&gt;
::https://www.arduino.cc/en/Main/Software&lt;br /&gt;
&lt;br /&gt;
::Falls das kompilieren nicht ordentlich abläuft könnte helfen, eine Arduino IDE Version kleiner 1.6.7 zu benutzen, download hier:&lt;br /&gt;
::https://www.arduino.cc/en/Main/OldSoftwareReleases&lt;br /&gt;
&lt;br /&gt;
::Linux: &lt;br /&gt;
:::In der gewählten Aurduino IDE im Menü Files.Preferences, Tab Settings, “show verbose output - during compilation” anklicken.&lt;br /&gt;
::&amp;lt;i&amp;gt;Es wird im Folgenden davon ausgegangen, dass die Firmware auf dem Linux-Rechner kompiliert wird, auf dem auch FHEM läuft, z.B. einem Raspberry Pi. &amp;lt;/i&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:4. Im Fhemduino GIT sind die nächsten Schritte beschrieben, die auch für&lt;br /&gt;
::Linux gelten:&lt;br /&gt;
::How to compile with Arduino IDE unter Microsoft Windows:&lt;br /&gt;
:::*Sync the repository from github or download the complete archive as a zip archive.&lt;br /&gt;
:::*Extract or copy all files from src and lib the files to a directory called fhemduino&lt;br /&gt;
:::*rename sketch.ino into fhemduino.ino. The name of the sketch must be the same as the directory where it resides.&lt;br /&gt;
:::*Look at the sketch.h file, to enable or disable features of the fhemduino.&lt;br /&gt;
:::*Open fhemduino.ino in the IDE and just compile it.&lt;br /&gt;
&lt;br /&gt;
:5. Es wurde ein Hexfile erzeugt.&lt;br /&gt;
::Windows:&lt;br /&gt;
:::Es liegt im gleichen Ordner wie die Sourcen, z.B. fhemduino.cpp.standard.hex&lt;br /&gt;
::Linux:&lt;br /&gt;
:::Im Konsolenfenster der Arduino IDE (schwarzes Feld unten im IDE-Fenster) wird bei erfolgreicher Kompilierung in der letzten Zeile der Pfad des Hexfiles angezeigt, in der Form &amp;quot;/tmp/build&amp;lt;sehr lange hex Zahl&amp;gt;/sketch_&amp;lt;datum&amp;gt;.ino.hex&amp;quot;. Dafür hatten wir oben unter 3. den &#039;verbose&#039; Modus aktiviert. &lt;br /&gt;
&lt;br /&gt;
::Dieses Hexfile umbenennen nach fhemduino.hex.&lt;br /&gt;
::Windows:&lt;br /&gt;
:::Das Hexfile auf den FHEM-Rechner kopieren (z.B. per WinSCP nach /opt/fhem/fhemduino/hexfiles)&lt;br /&gt;
::Linux:&lt;br /&gt;
:::Das Hexfile in das gewünschte Verzeichnis, z.B./opt/fhem/fhemduino/hexfiles verschieben.&lt;br /&gt;
&lt;br /&gt;
:6. In Fhem ist der Fhemduino ja bereits mit dem Status &amp;quot;Open&amp;quot; vorhanden.&lt;br /&gt;
::Mit &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;attr &amp;lt;myfhemduino&amp;gt; hexFile  /opt/fhem/fhemduino/hexfiles/fhemduino.hex&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
::wird FHEM mitgeteilt, wo das Hexfile liegt. Der Pfad ist entsprechend der eigenen Installation anzupassen. &lt;br /&gt;
::Der Fhemduino hat einen Befehl &#039;flash&#039;. Er wird so aufgerufen :&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;set &amp;lt;myfhemduino&amp;gt; flash&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:7. Danach wird ein Log angezeigt. Wenn alles gut ging und man wählt noch einmal den Fhemduino aus steht dort nicht mehr :&#039;open&#039; sondern &#039;initialized&#039;.&lt;br /&gt;
::Die Funktion:&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;get fhemduino version&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt; sollte jetzt etwas zurückgeben. Zum Beispiel =&amp;gt; V 2.3v FHEMduino - compiled at Jun 26 2015 14:45:06&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Folgenden Readings sind im Moment in FHEMduino eingebunden:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Befehl&lt;br /&gt;
! Ausgabe&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; version&lt;br /&gt;
|Ausgabe der Version mit Erstelldatum&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; V 1.0b1 FHEMduino - compiled at Nov 24 2015 15:58:41&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; uptime&lt;br /&gt;
|Ausgabe der Zeit, welcher der FHEMduino aktiv ist&lt;br /&gt;
|&amp;lt;Name&amp;gt; uptime =&amp;gt; 0 00:09:08&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; cmds&lt;br /&gt;
|Ausgabe der Parameter&lt;br /&gt;
|&amp;lt;Name&amp;gt; cmds =&amp;gt; V i f d h t R q&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw V&lt;br /&gt;
|Ausgabe der Version mit Erstelldatum&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; V 1.0b1 FHEMduino - compiled at Nov 24 2015 15:58:41&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw i&lt;br /&gt;
|???&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; No answer&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw f&lt;br /&gt;
|???&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; No answer&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw d&lt;br /&gt;
|???&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; No answer&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw h&lt;br /&gt;
|???&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; No answer&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw t&lt;br /&gt;
|???&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; 00000001B&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw R&lt;br /&gt;
|???&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; R1481&lt;br /&gt;
|-&lt;br /&gt;
|get &amp;lt;Name&amp;gt; raw q&lt;br /&gt;
|???&lt;br /&gt;
|&amp;lt;Name&amp;gt; raw =&amp;gt; No answer&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Set-Befehle ==&lt;br /&gt;
Mit dem Befehl:&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;Name&amp;gt; flash &amp;lt;Verzeichnis&amp;gt;&amp;lt;.hex-Datei&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
kann man den Arduino-Uno &amp;quot;flashen&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
:&amp;lt;code&amp;gt;set Arduino flash /opt/fhem/FHEM/fhemduino/fhemduino.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Intertechno Steckdose definieren ==&lt;br /&gt;
Befehl, um z.B. eine Intertechno Steckdose zu definieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;define IT_ST_1 Arduino_PT2262 0F00F0FFFF FF F0 &amp;lt;/code&amp;gt;&lt;br /&gt;
Berechnung der IT Codes gibt es hier: [http://www.fhemwiki.de/wiki/Intertechno_Code_Berechnung InterTechno Code Berechnung]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://github.com/mdorenka/fhemduino/blob/master/src/sketch.ino FHEMduino Quellcode auf github]&lt;br /&gt;
* [https://github.com/mdorenka/fhemduino_modules FHEM Module auf github]&lt;br /&gt;
* {{Link2Forum|Topic=17196|LinkText=Forenthread}}, der die Entwicklung dieses Projekts begleitet&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Interfaces]]&lt;br /&gt;
[[Kategorie:Arduino]]&lt;/div&gt;</summary>
		<author><name>Sidey</name></author>
	</entry>
</feed>